Mastodonの非Docker→Docker化
環境
- 元サーバー:非 Docker で稼働中の Mastodon サーバー
- 新サーバー:Docker 及び docker-compose インストール済みのサーバー
- 作業 PC:作業を行う PC です。SSH と SCP があるとよいです。
移行の大枠
考え方としては、DB と .env.production ファイルを移行すれば OK。
ただし、Redis のデータを移行しないと Sidekiq のジョブのカウントが 0 に戻って少し悲しい。
移行手順
(元サーバー)から .env.production を取得する
そのままなので詳細は割愛。新サーバーにコピーしておく。
(新サーバー)docker-compose.yml の準備
https://github.com/tootsuite/mastodon/blob/master/docker-compose.yml を取得して、変更を加える
この変更は docker-compose up を行う前に実施する(postgres の初回起動時に初期化が行われるため)
docker-compose.ymlの抜粋
1 | db: |
(新サーバー) .env.production の修正
DB サーバー、REDIS サーバーの接続先が変更になるので修正する。
.env.production
1 | REDIS_HOST=redis # docker-compose上の名前が解決できるのでこれでOK |
redis
データ移行を行わなくても問題ないが、行うのであれば、元サーバーを停止した状態で
redis のデータファイルをコピーすれば OK。
PostgreSQL
これが一番移行が面倒。新サーバーで docker-compose up -d を実行して一度全て起動させる。
- (元サーバー)サービスを停止する。
データロスがちょっとあっても良いのであれば止めなくても問題はない(と思われる)
- (元サーバー) DB バックアップの取得
元サーバーで、以下を実行。(DB が別サーバーであれば、 -h 等を追加して下さい)
pg_dump --dbname=<元のDB名> > mastodon.sql
- (作業 PC)バックアップを docker コンテナに転送する
一番簡単なのは、PostgreSQL コンテナのデータ領域にファイルを投げ込んでしまうこと
特に変更していなければ、docker-compose.ymlがあるディレクトリ/postgres に SQL ファイルをコピーすればよい
- (新サーバー)データベース等の作成
1 | `docker-compose exec db bash |
- (新サーバー)(オプション) ダンプファイルの修正
元サーバーでの DB ユーザー名が新サーバーと異なる場合、ダンプファイルを修正する。
1 | `# cd /var/lib/postgresql/data |
- (新サーバー)ダンプの取込
1 | `# cd /var/lib/postgresql/data |
Web / streaming / Sidekiq
これらは特にデータを持たないので特段の対応は不要。
終わり
ここまで来たら、正常に動くはずです。おつかれさまでした。
ディスク容量節約のために、転送したバックアップファイルを削除するとよいでしょう。
蛇足 1 docker ps すると unhealthy と表示される件
ちなみに web と streaming の healthcheck の wget のパラメタが
--proxy off (proxy と off の間がスペース) の場合、 --proxy=off にしないと、docker ps した際に
status: unhealthy となってしまう。(v2.8.0 以降であれば修正済み)
https://github.com/tootsuite/mastodon/pull/10553/files
1 | healthcheck: |
蛇足 2 SideKiq のスレッド数の変更
docker-compose.yml の command 行を変更すれば可能。
1 | environment: |
蛇足 3 PostgreSQL のパラメタ変更
公式イメージを使用しているのでパラメタの変更には conf の上書きが… 不要です!
1 | $ docker-compose exec db psql |
pgtune を使用すると ALTER SYSTEM の形で適切と思われるパラメタを表示してくれます。

なお、ALTER SYSTEM を行うと、 postgresql.auto.conf ファイルに設定内容が書き込まれて、永続化されます。
https://www.postgresql.jp/document/11/html/sql-altersystem.html
PostgreSQL の起動中に変更ができないパラメタは、次回起動時から有効になります。
PostgreSQL を再起動するまでは、PgHero の表示は前の値のままですのでご注意下さい。