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の抜粋
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
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 ファイルをコピーすればよい
- (新サーバー)データベース等の作成
`docker-compose exec db bash
# psql
root=# create database mastodon_db;
root=# \q
- (新サーバー)(オプション) ダンプファイルの修正
元サーバーでの DB ユーザー名が新サーバーと異なる場合、ダンプファイルを修正する。
`# cd /var/lib/postgresql/data
# cat mastodon.sql | sed s/元サーバーでのユーザー名/新サーバーのユーザー名/ > mast.sql
- (新サーバー)ダンプの取込
`# 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 以降であれば修正済み)
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 行を変更すれば可能。
environment:
DB_POOL: 20 # DBコネクションプール
command: bundle exec sidekiq -c 20 # -c 20 で20スレッド
蛇足 3 PostgreSQL のパラメタ変更
公式イメージを使用しているのでパラメタの変更には conf の上書きが… 不要です!
$ 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
ファイルに設定内容が書き込まれて、永続化されます。
PostgreSQL の起動中に変更ができないパラメタは、次回起動時から有効になります。
PostgreSQL を再起動するまでは、PgHero の表示は前の値のままですのでご注意下さい。
Discussion