📚
Docker-composeで構築したmisskeyサーバーをCloudflareR2にバックアップ&リストアする
結論
バックアップ(シェルスクリプト)
#!/bin/bash
SERVICE_NAME="db"
POSTGRES_DB="misskey"
POSTGRES_PASSWORD="postgrespassword"
POSTGRES_USER="postgresuser"
BUCKET_NAME="bucketname"
AWS_USER="awsuser"
YOUR_R2_ID="r2id"
DB_DUMP_FILE=`date "+%Y%m%d"`-misskeybk
docker-compose exec $SERVICE_NAME pg_dumpall -U $POSTGRES_USER > ../backup/$DB_DUMP_FILE
gzip ../backup/$DB_DUMP_FILE
aws s3 mv ../backup/${DB_DUMP_FILE}.gz s3://${BUCKET_NAME} --profile $AWS_USER --endpoint-url https://${YOUR_R2_ID}.r2.cloudflarestorage.com
リストア
{DUMP_FILE}
はバックアップしたファイル名 他の変数はバックアップのものを読み替えること
BUCKET_NAME="bucketname"
aws s3 cp s3://{BUCKET_NAME}/{DUMP_FILE}.gz ../backup --profile {AWS_USER} --endpoint-url https://{YOUR_R2_ID}.r2.cloudflarestorage.com
# {DUMP_FILE}.gzのあるディレクトリで
gunzip {DUMP_FILE}.gz
# misskey関係のdocker-compose.ymlのあるディレクトリで
docker-compose up -d db
docker-compose exec -T db psql -U $POSTGRES_USER -d $POSTGRES_DB -c 'DROP DATABASE ${POSTGRES_DB};'
docker-compose exec -T db psql -U $POSTGRES_USER -d $POSTGRES_DB -c 'CREATE DATABASE ${POSTGRES_DB};'
# {container_id}を調べる
docker ps
docker cp ../backup/{DUMP_FILE}.db {container_id}:/db.dump
docker-compose exec -T db psql -U $POSTGRES_USER -d $POSTGRES_DB -f /db.dump
rm ../backup/*
説明
バックアップ
前提としてaws-cliをインストールしていること あと適当なtempディレクトリがあること(ここではひとつ上の階層にbackupを置いている)
docker-composeで直接postgresにアクセスしてpf_dumpallでデータベースをダンプしてgzipで圧縮してaws-cliでCloudflareR2に作成したbucketにアップロードしています
なのでSERVICE_NAME
からPOSTGRES_USER
はそれぞれdocker-compose.ymlやdocker.envのものを使うこと
DB_DUMP_FILE
は一日毎にバックアップを取ることを想定して日付で命名
あとはcronなどで定期的に実行するだけ!
リストア
環境で若干操作が異なると思う
一応動作確認済み🤗
上記のような環境でセットアップしたとする
まずCloudflareR2からdumpファイルをダウンロードしてgunzipで解凍、docker-compose up -d dbでmisskey以外のコンテナを起動してからPostgresのdbを一度削除して再構成する
docker内にダウンロードしたダンプファイルを導入してpsqlでリストア
ちなみにdocker-composeのときにmisskeyも起動すると接続中とかで怒られるっぽい?
あとdbを削除して再構成しないと色々重複してリストアがうまくいかない
参考文献
Discussion