自分が運営している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


バックアップデータを保存するバケットの作成

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

これで自動バックアップは完了です。

お疲れさまでした。


引用

AWSのCLIを設定してみる

プロファイル作成のコマンド

misskeyデータベースのバックアップをcronで定期的にCloudflare R2に保存する

シェルスクリプト