つい先日、FirefishのバックアップのデータをS3に転送することができたので、備忘録として記事に残しておこうと思います。(名目上はFirefishになってますが、Misskeyもユーザー名を変えればいけるはず)
データベースバックアップについての話は以前書いた記事があるので、そちらを先に読むことを推奨します。
追記
2023/12/22
いくつかミスがあったので追加・修正しています。前の手順より簡略化されて手間は減っていますが、セキュリティーが緩くなっています。(バックアップフォルダーのパーミッション・rootユーザーで実行など)
そのため、このブログを参考にする際は、セキュリティー対策をしっかり行ってください。
2023/12/29
Cloudflare R2でできる方法がわかったので追記します。R2の方が安いのでそっちでやった方がよさげ。
大まかな流れ
- S3バケット作成~ユーザー設定
- pipを使ってAWS CLIをインストール
- AWS CLIの設定
- bashスクリプトの作成
- cronの設定
詳細な手順
1. S3バケット作成~ユーザー設定
Mastodon の画像などメディアデータをAmazon S3に移行する(非Docker環境) – Takanory Blog記事の前半部分を参考にしつつ、S3の設定をします。
(記事が古くて若干UIが違いますが、ほとんどの流れは同じでした)
- バケット
- グループ
- ユーザー
この3つが設定できればOKです。
ちなみにバケットは非公開で使うので、バケットポリシーを設定する必要はありません。
ユーザーを作成したら、アクセスキーとシークレットキーをコピーします。
2.pipを使ってAWS CLIをインストール
VPSにログインし、rootユーザーでインストールします。
Linux での AWS CLI バージョン 1 のインストール、更新、アンインストール – AWS Command Line Interface記事にある「pipを使ってのインストール項目」を参照してコマンドを入力。
3.AWS CLIの設定
ホームディレクトリに戻っていることを確認、(root@aaa:~$)の`~`の部分が`~`だけになってればOKです。ディレクトリー.aws
を作成、してVimで.aws/credentials
を編集します。
$ mkdir .aws
$ vi .aws/credentials
.aws/credentials
ファイルの編集画面になったら、下記の項目をペーストをします。
[default]
aws_access_key_id=KEY_FROM_AWS_ACCESS_KEY_ID
aws_secret_access_key=KEY_FROM_AWS_SECRET_ACCESS_KEY
この時、KEY_FROM_AWS_ACCESS_KEY_ID
とEY_FROM_AWS_SECRET_ACCESS_KEY
に手順1でコピーしたアクセスキーとシークレットキーを入力して保存します。
4.bashスクリプトの作成
次に、バックアップスクリプトを作成します。私は/usr/local/bin
に保存・vi backup.sh
でファイルを作成しました。cd /usr/local/bin
してからvi backup.sh
すればいけるはずです。
$ cd /usr/local/bin
$ vi backup.sh
Vimでbackup.shを開いたら、下記の項目を記入して保存をします。
```
#!/bin/bash
# 時刻取得
TIME=$(date +"%Y%m%d%H%M")
# バックアップ開始
su - postgres << BASH
echo "Backup start."
# バックアップディレクトリに移動
cd /var/backup
# バックアップファイル作成
pg_dumpall | gzip -c > firefish$TIME-backup.gz
# パーミッション・権限変更
exit
chmod 744 firefish$TIME-backup.gz
BASH
# rootユーザーに変更
su - root << BASH
echo "Send backup file."
# S3に転送
~/.local/bin/aws s3 cp /var/backup/firefish$TIME-backup.gz s3://(バケット名)/backup/
echo "Backup complete."
BASH
```
以前ブログ記事で設定したvar/backup
に保存して転送します。
(リライト前と変わってます。また、パーミッションが777にしてあるので注意)バケット名にはAWSで設定したバケット名を記入してください。
スクリプトが書けたら、パーミッションを755にします。
$ chmod 755 backup.sh
ここまでできたら、bashスクリプトを実行して動作確認を行います。
$ bash backup.sh
実際に動いてS3にバックアップデータが保存されたら次のステップに進みます。
4.cronを設定する
rootユーザーに切り替え、/etc/cron.d
に移動して、backup
ファイルを作成します。
$ exit
$ cd /etc/cron.d
$ vi backup
Vimでbackupファイルを開いたら、下記の情報を記入します。
SHELL=/bin/sh
MAILTO=""
00 02 * * * root sh /usr/local/bin/backup.sh
05 02 * * * root find /var/backup -name '*.gz' -mtime +14 -delete
backup.sh
を実行して、14日前のバックアップデータを削除します。00 02
もしくは05 02
の部分はお好きなように変更してください。
これで時間通りに動いたら完成です、お疲れさまでした。
参考サイト
- Mastodon の画像などメディアデータをAmazon S3に移行する(非Docker環境) – Takanory Blog
- MisskeyのデータベースをCloudflare R2に保存しちゃおう
- Misskeyのデータベースをバックアップしよう【OCIオブジェクトストレージ編】 | aqz/tamaina
- S3にMastodonのデータベースをバックアップしてアップロードする | Cutls Code Archives
- Linux での AWS CLI バージョン 1 のインストール、更新、アンインストール – AWS Command Line Interface
- シェルスクリプトファイルに実行権限を付与する意味は? – Neo’s World