misskeyデータベースのバックアップをcronで定期的にCloudflare R2に保存する
クローズドmisskeyサーバ「こづか山荘」の管理人、小束弓月と申します。
DNSやオブジェクトストレージにCloudflareを使っている鯖缶の方も多いと思いますが、こちらはデータベースのバックアップを定期的に取る方法です。
前提
Ubuntu server 22.04.3・postgresql 15.4
Cloudflareに登録済み
misskeyサーバでオブジェクトストレージを利用している、などでaws-cliをインストール
バックアップを実行するユーザで「aws configure」を実行してプロファイルを作成しておく
$ sudo apt install awscli
$ sudo su - postgres
$ aws configure
※Cloudflare R2はAmazon S3と互換性があるのでaws-cliが使える
※Cloudflareのwranglerというコマンドツールは認証にGUIが必要なため今回は使えない
シェルスクリプト
postgresqlのバックアップ操作なので、ユーザ「postgres」としてスクリプトを実行させる。
シェルスクリプト「backup-psql-all.sh」を扱いやすい場所に作成する。
$ vim backup-psql-all.sh
シェルスクリプト例(細かいところは、適宜書き換え)
#!/bin/bash
TIME=$(date +%Y%m%d_%H-%M-%S)
cd /tmp
pg_dumpall > dumpall_psql.dmp
tar czf dumpall_psql.tar.gz dumpall_psql.dmp
chmod 700 dumpall_psql.tar.gz
aws s3 cp dumpall_psql.tar.gz s3://<バケット名>/dumpall_psql_$TIME.tar.gz --profile <プロファイル名> --endpoint-url <エンドポイントのURL>
rm dumpall_psql.tar.gz dumpall_psql.dmp
バックアップ開始時刻
/tmpに移動
pg_dumpallでデータベースの内容全てを書き出す
今回データベースはmisskey専用なのでpg_dumpallを使っているが、misskeyのデータベースのみを書き出す時はpg_dumpなどを使う。書き出したバックアップファイルを圧縮
アクセス権を適宜設定
ファイル名にバックアップ開始時刻を付けてCloudflare R2にアップロード
ファイルのクリーンアップ(ディスク容量の節約)
シェルスクリプトに実行権限を付与
$ chmod 744 backup-psql-all.sh
実行してみる
$ bash ./backup-psql-all.sh
Cloudflare R2に「dumpall_psql_20230101_12-30-00.tar.gz」などとアップロードされていればOK。
crontabを設定
作業用ユーザに戻り、ユーザ「postgres」のcrontabを設定
$ sudo crontab -u postgres -e
毎日午前4時にバックアップ実行
0 4 * * * /usr/bin/bash (ディレクトリ)/backup-psql-all.sh
Cloudflare側の設定
定期的に(1週間程度で)バックアップファイルを削除するルールを設定する
保存先のバケットを非公開にする
シェルスクリプトを書き換えれば、ローカルやLAN内の別マシンにもバックアップを保存できます。
復元なども検証の上、自己責任で自身の環境に置き換えて下さい。
参考(ありがとうございました)
PostgreSQL 13 バックアップ操作とリストア操作
https://changineer.info/server/postgresql/postgresql_backup_logical.html
MisskeyのデータベースをCloudflare R2に保存しちゃおう
https://zenn.dev/waya0125/articles/6192cc4784d5c4
Amazon S3 と API の互換性がある Cloudflare R2 を AWS CLI から使ってみる
https://dev.classmethod.jp/articles/using-cloudflare-r2-compatible-with-amazon-s3-api-from-aws-cli/