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
2
3
4
5
6
7
8
9
10
11
db:
restart: always
image: postgres:11 # 9だったが11にした
networks:
- internal_network
environment: # この部分追加
POSTGRES_USER: root # 元サーバーと合わせると楽
POSTGRES_PASSWORD: rootpwd # パスワードは変えて下さい
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
healthcheck:
test: ["CMD", "pg_isready", "-U", "root"] # postgresになっているので修正

(新サーバー) .env.production の修正

DB サーバー、REDIS サーバーの接続先が変更になるので修正する。

.env.production

1
2
3
4
5
6
7
8
REDIS_HOST=redis     # docker-compose上の名前が解決できるのでこれでOK
REDIS_PORT=6379

DB_HOST=db # docker-compose上の名前が解決できるのでこれでOK
DB_USER=root # 上で設定した内容に合わせる
DB_PASS=rootpwd # 上で設定した内容に合わせる
DB_NAME=mastodon_db # あとで作成するDB名に合わせる
DB_PORT=5432

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
2
3
4
`docker-compose exec db bash
# psql
root=# create database mastodon_db;
root=# \q
  • (新サーバー)(オプション) ダンプファイルの修正

元サーバーでの DB ユーザー名が新サーバーと異なる場合、ダンプファイルを修正する。

1
2
`# cd /var/lib/postgresql/data
# cat mastodon.sql | sed s/元サーバーでのユーザー名/新サーバーのユーザー名/ > mast.sql
  • (新サーバー)ダンプの取込
1
2
3
4
`# cd /var/lib/postgresql/data
root=# \c mastodon_db
mastodon_db=# \i mast.sql
(インポートの表示が大量にでる)

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
2
3
healthcheck:
test: ["CMD-SHELL", "wget -q --spider --header 'x-forwarded-proto: https' --proxy=off localhost:3000/api/v1/instance || exit 1"]

蛇足 2 SideKiq のスレッド数の変更

docker-compose.yml の command 行を変更すれば可能。

1
2
3
environment:
DB_POOL: 20 # DBコネクションプール
command: bundle exec sidekiq -c 20 # -c 20 で20スレッド

蛇足 3 PostgreSQL のパラメタ変更

公式イメージを使用しているのでパラメタの変更には conf の上書きが… 不要です!

1
2
3
4
5
6
$ docker-compose exec db psql

root=# ALTER SYSTEM SET shared_buffers = "384MB";
ALTER SYSTEM
root=# ALTER SYSTEM SET max_connections = 100;
ALTER SYSTEM

pgtune を使用すると ALTER SYSTEM の形で適切と思われるパラメタを表示してくれます。

なお、ALTER SYSTEM を行うと、 postgresql.auto.conf ファイルに設定内容が書き込まれて、永続化されます。

https://www.postgresql.jp/document/11/html/sql-altersystem.html

PostgreSQL の起動中に変更ができないパラメタは、次回起動時から有効になります。
PostgreSQL を再起動するまでは、PgHero の表示は前の値のままですのでご注意下さい。