Mastodon (on Docker) の自動更新スクリプトを作りました。
ダウンロード先:https://gist.github.com/kunimi53chi/b6bd2cb88750e060ad74835a2a2aebe2
使ってなんかおかしいところありましたらご報告お願いいたします。筆者はAWS EC2のUbuntu16.04で動作確認をとっています。Mastodon本体はノー独自機能、本家そのものです。単に設定ファイル周りの編集を自動化しているため、独自機能を仕込んだMastodonに対しても機能すると思います。
適用する場合、その日に出されたリリースノートは目を通しましょう。 このスクリプトを適用してまずそうならクーロン止めましょう。(例えば、アップデートの手順にbundle exec rake
を追加で走らせる必要がでた、Postgresのバージョンが必要、など)
ライセンスはWTFPLです。
本家ドキュメントの"Updating" をスクリプト化し、余計なお世話を焼いたものです。Bashでかいてます。
- ローカルとリモートのリリースタグの差分に反応し、マストドンの更新を行う(= not master追従)
- 指定されたアカウントで更新状況をトゥートする
- ちゃんとエラーメッセージを吐いて落ちるようになっており、原因を特定しやすい。エラー時もトゥートする。
- ちなみにDockerはstopしなくていい
- MastodonをDockerで立てているインスタンス管理人
- アップデート追従につかれた人
- PostgreSQL DBのバックアップをちゃんと毎日とってる人
- Mastodon:masterのバージョンアップが頻繁で、リリースされるたびいちいちSSH接続して更新するのがだるい
docker-compose.yml
のリリースタグ書き換えがいちいちだるいdocker build
完了を待っているのがだるいdocker-compose run --rm web bundle exec rake assets:precompile
完了を待っているのがだるい- 完了までに15分ぐらいかかるのを黒い画面見ながらやるのがだるい
- 何回も同じこと手動でやるのがだるい
スクリプトに書いているハウツーを転記しておきます。
# ***** HOU TO USE *****
# 1. In docker-compose.yml, change image row: "tootsuite/mastodon:vX.X.X" -> tootsuite/mastodon:${VERSION}
# 2. Make new ".env" file in your mastodon directory
# 3. Add description to .env file: VERSION=
# 4. Edit this file of "SET YOUR CONFIG"
# 5. Set cron (ex:) `0 3 * * * bash /home/ubuntu/mastodon_etc/mastodonautoupdate.sh >/dev/null 2>>/home/ubuntu/mastodon_etc/autoupdatelog.txt`
docker-compose.yml
は変数を扱えます。${VERSION}
のようにyamlファイル内で書き、.env
ファイルに VERSION=vX.X.X
という形で管理することで編集箇所を外だしし、スクリプトからの変更を容易にします。
CONFIG箇所は変数名そのまんまなのですが、アクセストークンを取得することでなんらかのアカウントにトゥートすることが可能になります。"プロフィールを編集 > 開発 > 新規アプリ" と移動して、アクセス権のread, write, follow(いらないかも)にチェックして送信すると「アクセストークン」が新規アプリに対して発行されるので、それをコピペします。
タグの差分をどうやって察知しているかと言いますと、この記事を参考にしています: How to automatically checkout the latest tag of a Git repository
fetchしてきたリポジトリのタグ(すなわちリモートで最新のタグ)を取得することができます。そして、ただのgit describe --tags
はローカルの最新のタグを取得できます。ローカルとリモートのタグ差分を取得し、差異があれば更新作業へ進み、なければそこで正常終了します。
set -eu
とtrap関数によりエラーハンドリングしています。エラーメッセージはこんな感じになります:
ubuntu:~/mastodon$ cat ../mastodon_etc/autoupdatelog.txt
2018/06/19 03:00:02 UPDATE START. # <- スクリプトからの出力
From https://github.com/tootsuite/mastodon
* [new branch] fix-ap-language -> origin/fix-ap-language
a58ec29..50689f0 master -> origin/master
2018/06/20 03:00:01 UPDATE START.
error: insufficient permission for adding an object to repository database .git/objects # <- 以下3行はcronの`2>>` による出力
fatal: failed to write object
fatal: unpack-objects failed
2018/06/20 03:00:06 *****FAILED***** Failure Point is git, line 88. # <- スクリプトからの出力
2018/06/20 09:04:26 UPDATE START. # <- コケたのに気づきbashコマンドよりスクリプト起動
2018/06/20 09:27:38 ALL IS DONE. # <- 無事成功
スクリプト内でなんらかのエラーが発生した場合、catch ()
関数が呼ばれ、ロギングをしてトゥートして落ちます。
MastodonはAPIを提供しており、curlコマンドからトゥートを行えます。 post ()
関数を読んでください。
トゥート内容は変更可能です。choiceToot ()
のlocal readonly変数を変更してください。日本語は試してません。多分大丈夫だとは思うんですけど。
トゥートを抑制したい場合は、メインルーチン(+catch
関数)のchoiceToot ()
関数呼び出しをコメントアウトすることで簡単に抑制できます。
暇なときに https://fediverse.network/ を見ているんですが、割と最新タグに追従してないインスタンスが多くいます。最新版追従による不具合発生への警戒はわかりますが、直される不具合やパフォーマンス改善も多いため、最新タグ追従(Release Candidateは人によるが)は気軽にしていったほうが良いかと思います。
本家のリリースがとても頻度が高いため、Release Candidateでも更新する管理人の場合、週に1-2回はコンソールと向き合うと思います。これ一般的な社会人の方々だと割と面倒くさいと思うんですよ。そんなあなたに使っていただければと思います。