自分が運営しているMisskeyのデータベースのバックアップについて前々から考えていたが、ずっと後回しになっていたので今回実行することにした。
環境
- Ubuntu Server 22.04.4 LTS
- Misskey 2024.3.1
- PostgreSQL 15.6
- Cloudflare R2
PostgreSQLやUbuntuのバージョン違い等により、実行できない可能性があります。
この記事ではバックアップ先としてCloudflare R2を使用します。
Cloudflare R2は従量課金制となるので料金についてはCloudflareのドキュメントをご確認ください。
バックアップデータを保存するバケットの作成
Cloudflare R2でバケットを作成します。
ここではバケット名にbackupを設定します。
バケットを作成後、バケットの設定からオブジェクトのライフサイクル ルールを設定します。
ここではバックアップを保存する期間を設定しますが、日数を長くしすぎてしまうと、ストレージを大幅に消費してしまうので7日間に設定しておきます。
オブジェクトのライフサイクル ルール→ルールの追加を選び
ルール名に自身が分かりやすい名前を設定し、ライフサイクル アクションを7日に設定、ルールを追加ボタンを押します。
ライフサイクル ルールの設定を終えたら次にAPIトークンを取得します。
バケット選択画面に戻り、右側メニューの「R2 API トークンの管理」をクリックします。
APIトークンを作成するボタンを押し、トークン名にバックアップを入力し、権限は下から二番目の「オブジェクト読み取りと書き込み」を選択します。
バケットの指定に先ほど作成した「backup」を選択し下にあるAPIトークンを作成するをクリックします。
次の画面でアクセスキーとシークレット アクセス キー、エンドポイントが表示されるので必ずメモをしておきます。
aws-cliのプロファイルを作成する
今回はCUI環境のUbuntu Serverを利用しているため、aws-cliを利用します。
aws-cliをインストールする
sudo apt install awscli
Ubuntuの「postfres」ユーザーにログインをし、aws configureを実行する。(ここではプロファイル名をbackupとします)
sudo su - postgres
aws configure --profile backup
実行すると対話形式で先ほど作成したキーを聞かれますので入力します。
AWS Access Key ID [None]: R2 アクセスキー
AWS Secret Access Key [None]: R2 シークレット アクセス キー
Default region name [None]: auto
Default output format [None]: json
これにてaws-cliのプロファイルの作成の終了です。
シェルスクリプトを作成する
postgreSQLのデータベースを操作するので引き続き「postgres」ユーザーで作業を行います。
まずはバックアップ用のシェルスクリプトを作成します。
nano backup.sh
内容は以下とします。
#!/bin/bash
TIME=$(date +%Y%m%d_%H-%M-%S)
cd /tmp
pg_dumpall > backup_psql.dmp
tar czf backup_psql.tar.gz backup_psql.dmp
chmod 700 backup_psql.tar.gz
aws s3 cp backup_psql.tar.gz s3://backup/backup_psql_$TIME.tar.gz --profile backup --endpoint-url エンドポイントのURL
rm backup_psql.tar.gz backup_psql.dmp
シェルスクリプトに実行権限を与えます。
chmod 744 backup.sh
これを試しに実行してみます。
bash ./backup.sh
先ほど作成したCloudflare R2のバケットにアップロードされていれば成功です。
crontabを使用して自動化する
無事にDBのバックアップができたので次はcrontabを使用してバックアップの自動化を行います。
Ubuntuユーザーに戻って作業を行います。
exit
sudo crontab -u postgres -e
毎日午前3時にバックアップを実行します。
0 3 * * * /usr/bin/bash /var/lib/postgresql/backup.sh
これで自動バックアップは完了です。
お疲れさまでした。
引用
プロファイル作成のコマンド
misskeyデータベースのバックアップをcronで定期的にCloudflare R2に保存する
シェルスクリプト