📚

Docker-composeで構築したmisskeyサーバーをCloudflareR2にバックアップ&リストアする

2023/12/19に公開

結論

バックアップ(シェルスクリプト)

#!/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などで定期的に実行するだけ!

リストア

環境で若干操作が異なると思う
一応動作確認済み🤗

https://girak.net/2022/06/03/300
上記のような環境でセットアップしたとする

まずCloudflareR2からdumpファイルをダウンロードしてgunzipで解凍、docker-compose up -d dbでmisskey以外のコンテナを起動してからPostgresのdbを一度削除して再構成する
docker内にダウンロードしたダンプファイルを導入してpsqlでリストア

ちなみにdocker-composeのときにmisskeyも起動すると接続中とかで怒られるっぽい?
あとdbを削除して再構成しないと色々重複してリストアがうまくいかない

参考文献

https://misskey-doc.7ka.org/ja/nakkaa/online-backup-postgresql
https://zenn.dev/okayurisotto/articles/d85ad4602007bf
https://girak.net/2022/06/03/300
https://qiita.com/ryome/items/efd37c3a49b54859ba68
https://blog.denet.co.jp/install-the-aws-cli-and-download-the-s3-file/
https://www.postgresql.jp/document/8.1/html/backup.html

Discussion