Docker Composeで構築したMisskeyサーバーのデータベースをバックアップ&リストアする
Notionで公開していたメモを更新しつつZennにも残しておきます。
TL;DR
SERVICE_NAME="db"
DB_DUMP_FILE="misskey.db"
POSTGRES_DB="misskey"
POSTGRES_PASSWORD="example-misskey-pass"
POSTGRES_USER="example-misskey-user"
バックアップ
docker-compose exec $SERVICE_NAME pg_dumpall -U $POSTGRES_USER > $DB_DUMP_FILE
リストア
docker-compose up -d $SERVICE_NAME
cat $DB_DUMP_FILE | docker-compose exec --no-TTY $SERVICE_NAME psql $POSTGRES_DB $POSTGRES_USER
解説
実際にサーバーを意図的に壊して復旧する手順を解説付きで残しておきます。
まず、MisskeyサーバーをDockerで構築します。具体的な構築の手順についてはMisskey Hubの解説記事を参照してください。
次に、既に動いているMisskeyサーバーのうちPostgreSQLを動かしているサービス(ここでは$SERVICE_NAME
としますが、普通"db"
でしょう)のサービスのコンテナ内でpg_dumpall
コマンドを実行します。このコマンドは文字通り、PostgreSQLのデータベースをダンプするものです。標準出力にプレーンテキストで出力されますので、リダイレクトでファイルに書き込みます。
docker-compose exec $SERVICE_NAME pg_dumpall -U $POSTGRES_USER > $DB_DUMP_FILE
各変数については適宜編集してください。デフォルトの場合、$POSTGRES_USER
は"example-misskey-user"
になっているはずです。$DB_DUMP_FILE
はお好みでどうぞ。定期バックアップなどをする場合は日時(date --iso-8601=minutes
のような)を含めておくとよいでしょう。
次に、docker-compose down
でMisskeyサーバーを終了します。
そうしたらデータベースを意図的に破壊します。デフォルトの場合、下記コマンドを実行するだけでよいでしょう。
rm -rf db
では復旧させます。作成したダンプからpsql
コマンドを使ってデータベースを初期化します。
まず、$SERVICE_NAME
サービスのコンテナのみを先に起動しておきます。
docker-compose up -d $SERVICE_NAME
そしてそのコンテナでpsql
を使った初期化を実行します。
cat $DB_DUMP_FILE | docker-compose exec --no-TTY $SERVICE_NAME psql $POSTGRES_DB $POSTGRES_USER
見てわかる通り、コンテナ内のpsql
コマンドにダンプデータをパイプしているだけです。
これでデータベースの復旧は完了です。docker-compose up
で、障害発生前の状態のサーバーが起動します。
補足
おそらく大丈夫だとは思いますが、この方法で復旧に伴う不整合などが起きてしまった場合は教えてください。
この記事ではデータベースのバックアップしかしていません。オブジェクトストレージを使っていない場合などはfiles
ディレクトリは別途バックアップの必要があります。
ダンプしたデータはそのままでは大きすぎるので圧縮して保管することになるでしょう。パイプで圧縮できるツールを使うと楽です。私はzstd
を使っていますが、Misskey.ioの管理者である村上さんは7zipを使っているそうです。(あと、Googleドライブにもアップロードしているそうです。)
Googleドライブのようなオンラインストレージへの自動的なバックアップでは、Rcloneのようなツールを使うといいかもしれません。まぁ私はGoogleドライブにある版管理機能をうまく使うことで容量を節約しようとしているので、どうしても手動でアップロードするようになってしまっているのですが……。
Discussion