見出し画像

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
  1. バックアップ開始時刻

  2. /tmpに移動

  3. pg_dumpallでデータベースの内容全てを書き出す
    今回データベースはmisskey専用なのでpg_dumpallを使っているが、misskeyのデータベースのみを書き出す時はpg_dumpなどを使う。

  4. 書き出したバックアップファイルを圧縮

  5. アクセス権を適宜設定

  6. ファイル名にバックアップ開始時刻を付けてCloudflare R2にアップロード

  7. ファイルのクリーンアップ(ディスク容量の節約)

シェルスクリプトに実行権限を付与

$ 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/

いいなと思ったら応援しよう!