📦

Docker Composeで構築したMisskeyサーバーのデータベースをバックアップ&リストアする

2023/07/09に公開

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