Posted at

Mastodon (on Docker) 自動更新スクリプトを書いた

More than 1 year has passed since last update.

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回はコンソールと向き合うと思います。これ一般的な社会人の方々だと割と面倒くさいと思うんですよ。そんなあなたに使っていただければと思います。