#tips#self-hosted#mastodon

普通、dockerで運用するときはMastodonのリポジトリをクローンしてきて、docker-compose.ymlbuildをコメントアウトすることで、リポジトリからコンテナイメージをpullするように変える。

ただこの場合、バージョンアップデートの際にgit stash && git fetch && git checkout <version> && git stash popするとこんな感じにconflictが発生する。(ここでは例示のため4.2.6から4.2.5にダウングレードしてるが)

  web:
<<<<<<< Updated upstream
    build: .
    image: ghcr.io/mastodon/mastodon:v4.2.5
=======
    # build: .
    image: ghcr.io/mastodon/mastodon:v4.2.6
>>>>>>> Stashed changes
    restart: always

そこで、docker-compose.ymlとは別にdocker-compose.override.ymlというのを置いておくと、特定のキーを上書きしてくれる機能を使う。

Merge Compose files | Docker Docs

最近まで、この上書き機能では特定のエントリをコメントアウトするような操作はできなかったが、docker-compose v2.18.0以降で!resetというのを置いておくとできるようになった。

docker-compose.override.yml で 打ち消し定義 ができるようになった。

ので、sudo apt-get upgrade docker-compose-pluginをやった上でこんなdocker-compose.override.ymlを作る。

web:
	image: ghcr.io/mastodon/mastodon:latest
	build: !reset
streaming:
	image: ghcr.io/mastodon/mastodon:latest
	build: !reset
sidekiq:
	image: ghcr.io/mastodon/mastodon:latest
	build: !reset

(実際のファイルではpostgresの設定とかでもうちょっといろんなエントリが入っている。)

こうすれば、大概のマイナーな更新時はdocker compose pull&& docker compose down && docker compose up -d1つでよくなる。(compose自体に更新が入ったり、.env.productionとかに変更があったり、rake:db migrateする必要がある場合もあるので、基本はリリースノートを読んでから、必要に応じてgit pullすること!)

(そもそもきちんとリポジトリをmergeで更新していく運用の方がいいのかもしれないが)

注意点として、ハイフン付きのdocker-composeコマンドはv1コンパチで動くので!resetが効かずパースエラーになる。もう実質deprecatedになってるのでサブコマンドのdocker composeで使うこと!(これに気づかず30分ぐらいハマった)