改訂
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Rikuoh Tsujitani 2023-11-28 10:13:24 +09:00
parent 7fe3c8c9fa
commit 5888f17db7

View file

@ -46,110 +46,84 @@ ssl_certificate_key /etc/ssl/private/あんたのドメイン名.key;
編集後、念のために`nginx -t`でエラーを確認して問題がなければ`systemctl restart nginx`でnginxを再起動する。Web UIに接続して証明書の有効性が確認できたら作業は完了だ。
<!-- ## データベースのバックアップをCloudflareに丸投げする -->
<!-- >**前提** -->
<!-- >・Docker環境でインスタンスを動かしている。 -->
<!---->
<!-- 誉れ高き丸投げシリーズその2。どんどん丸投げしていこう。我々はすでに巨人の肩に乗っているし、どうせ今さら降りることなどできない。Cloudflareのページで**R2 → 概要**と進んでバケットを作成する。バケットの名前はなんでも構わない。ついでに設定から自動削除をスケジュールすると容量の節約になる。 -->
<!---->
<!-- ![](/img/201.png) -->
<!---->
<!-- 次にwranglerを導入する。wranglerはCloudflareのWorkerをCLIで動かすツールだが、**ほとんどのインスタンス運営者が使用しているUbuntuやDebianでは簡単にインストールが行えない。** aptコマンドでインストールされるNode.jsのバージョンが古すぎるためにエラーを起こしてしまうのだ。したがって、wranglerを導入する**前に**最新のNode.jsをインストールしなければならない。 -->
<!---->
<!-- ```zsh -->
<!-- # すでに古いNode.jsが入っている場合はアンインストールする。 -->
<!-- $ apt purge nodejs -->
<!---->
<!-- $ curl -fsSL https://deb.nodesource.com/setup_current.x | bash - -->
<!-- $ apt install nodejs -->
<!-- ``` -->
<!---->
<!-- dpkgに怒られが発生した時は`sudo dpkg -i --force-overwrite /var/cache/apt/archives/nodejs_20.5.0-deb-1nodesource1_amd64.deb`で強制的に上書きするとうまくいく。バージョン部分の`20.5.0`は本稿執筆時点での最新の数字なので適宜書き換えられたし。 -->
<!---->
<!-- 最新のNode.jsを手に入れたところでようやくwranglerのインストールに入る。npmを導入していなければこれも`apt install npm`で予めインストールする。 -->
<!---->
<!-- ```zsh -->
<!-- $ npm create cloudflare@latest -->
<!---->
<!-- # この後、色々訊かれるが指定すべき選択肢は以下の通り。 -->
<!-- ・Ok to proceed? -->
<!-- → Yes -->
<!---->
<!-- ・In which directory do you want to create your application? -->
<!-- → プロジェクトディレクトリの命名を行う。適当な名前でいい。 -->
<!---->
<!-- ・What type of application do you want to create? -->
<!-- → type Scheduled Worker (Cron Trigger) -->
<!---->
<!-- ・Do you want to use TypeScript? -->
<!-- → no -->
<!---->
<!-- ・Do you want to deploy your application? -->
<!-- → no -->
<!-- ``` -->
<!---->
<!-- 作業が完了したら命名したディレクトリに移り、`npx wrangler login`を実行する。URLが表示されるのでコピペしてブラウザに貼り付けるとCloudflareの認証画面が現れる。**しかし、SSH越しに実行しているかぎりこの認証は絶対に失敗する。** 認証情報をlocalhostに渡しているせいで照合が成立しないからだ。今回はちょっとした荒業でこいつをくぐり抜けたい。 -->
<!---->
<!-- 一旦、愚直にコピペしたURLで認証を行なって失敗してみると、ブラウザのアドレス欄からlocalhostの8976番ポートと通信を試みていた形跡がうかがえる。つまり、このURLをサーバの固定IPアドレスに書き換えれば期待通りの挙動に変化すると考えられる。そこでまずはサーバ側の8976番ポートを開けて準備を整える。ufwはとても簡便なファイアウォールフロントエンドなので、知らなくともぜひ導入してみてほしい。 -->
<!---->
<!-- ```zsh -->
<!-- $ ufw allow 8976 -->
<!-- $ ufw reload -->
<!-- ``` -->
<!---->
<!-- ポートを開いた状態で例のURLの`localhost:8976`の部分を`あんたのサーバのIPアドレス:8976`に書き換えてエンターを押す。うまくいけばたちまち認証が完了してサーバ上でwranglerが使えるようになる。開いたポートはもう使わないので確実に閉じておく。 -->
<!---->
<!-- ```zsh -->
<!-- $ ufw deny 8976 -->
<!-- $ ufw reload -->
<!-- ``` -->
<!---->
<!-- 以降はインスタンスを動かしているユーザに切り替えて非root環境で作業を行う。ここまで来たところで、試しにバックアップ作業を手動で実行する。 -->
<!---->
<!-- ```zsh -->
<!-- # pg_dumpでバックアップを取得してgzipで固める。userとdbの部分は各自の環境に合わせて変更すること。 -->
<!-- $ sudo docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz -->
<!-- # バックアップファイルに権限を与える。 -->
<!-- $ chmod 774 ./backup.gz -->
<!-- # wranglerのプロジェクトディレクトリに移動する。 -->
<!-- $ cd /home/ユーザ/プロジェクトディレクトリ -->
<!-- # バックアップファイルをCloudflare R2にアップロードする。この際、ファイル名を現在時刻に書き換える。 -->
<!-- $ sudo npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz -->
<!-- # 元のバックアップファイルを削除する。 -->
<!-- $ rm /home/ユーザ/インスタンスのディレクトリ/backup.gz -->
<!-- ``` -->
<!---->
<!-- 一連の動作が間違いなく完了するのを確認した上で、同様の処理内容をシェルスクリプトにしたためる。これでいつでもワンタッチでバックアップを巨人の口にねじ込めるという寸法だ。作成したスクリプトは`chmod +x ファイル名.sh`で実行権限を与えてから`sudo ./ファイル名.sh`で発動する。 -->
<!---->
<!-- ```zsh -->
<!-- #!/bin/bash -->
<!---->
<!-- echo "Backup begin..." -->
<!-- cd /home/ユーザ/インスタンスのディレクトリ/ -->
<!-- docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz -->
<!-- chmod 744 ./backup.gz -->
<!-- echo "Success!" -->
<!---->
<!-- su - ユーザ << bash -->
<!-- echo "Uploading to Cloudflare R2..." -->
<!-- cd /home/ユーザ/プロジェクトディレクトリ/ -->
<!-- npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz -->
<!-- rm /home/ユーザ/インスタンスのディレクトリ/backup.gz -->
<!-- bash -->
<!-- ``` -->
<!---->
<!-- 上記のスクリプトをcronに登録するとバックアップ作業の自動化が達成できる。 -->
<!---->
<!-- ```zsh -->
<!-- # rootで実行する。 -->
<!-- sudo crontab -u root -e -->
<!---->
<!-- # 毎日午前5時に指定された場所のスクリプトを実行する。別に好きな時間でいい。 -->
<!-- 0 5 * * * sh /home/ユーザ/ファイル.sh -->
<!-- ``` -->
<!---->
<!-- 最高だね。面倒なことは全部機械にやらせよう。ただし、cronのやつは油断すると裏切るのでたまにCloudflareのバケットを見に行った方がいいかもしれない。 -->
<!---->
## データベースのバックアップをCloudflareに丸投げする
>**前提**
>・Docker環境でインスタンスを動かしている。
**■2023年11月28日改訂
以前はバックアップツールにwranglerを採用していたが、転送容量に制限があることからrcloneを利用する形に改めた。**
誉れ高き丸投げシリーズその2。どんどん丸投げしていこう。我々はすでに巨人の肩に乗っているし、どうせ今さら降りることなどできない。Cloudflareのページで**R2 → 概要**と進んでバケットを作成する。バケットの名前はなんでも構わない。ついでに設定から自動削除をスケジュールすると容量の節約になる。
![](/img/201.png)
次にrcloneを導入する。rcloneは各種オンラインストレージにファイルを転送するツールだ。Amazon S3に対応しているため、S3互換を持つCloudflare R2にも使用できる。
```zsh
$ apt install rclone
```
導入後、通常は`rclone config`で対話形式のセットアップウィザードを起動する方法が一般的だが、本稿では`root/.config/rclone/rclone.conf`に前もって設定ファイルをぶち込んでおく。このファイルは自動化の都合上、root以下に保存する必要がある。
```ini
[r2]
type = s3
provider = Cloudflare
access_key_id = あんたのアクセスキー
secret_access_key = あんたのシークレットキー
endpoint = https://あんたのS3API.r2.cloudflarestorage.com
acl = private
```
アクセスキーおよびシークレットキーはR2のトップ画面右側の「R2 API トークンを管理」から発行する。発行直後の一度きりしか表示されないので紛失に注意すること。準備が整い次第、バックアップスクリプトの作成に移る。
```zsh
#!/bin/env bash
set -euo pipefail
# Configurable variables
INSTANCE_DIR="/home/あんたのユーザ名"
BACKUP_DIR="/home/あんたのユーザ名/バックアップファイルの保存場所"
BACKUP_LIFETIME_DAYS=ローカルにファイルを保存したい日数
DATE_FORMAT="%Y%m%d_%H-%M-%S"
DB_CONTAINER="mastodon-db-1"
DB_USER="mastodon_user"
DB_NAME="mastodon_db"
RCLONE_DESTINATION="r2:R2のバケット名"
# Error handling
trap 'echo "😢 An error occurred. Exiting." && exit 1' ERR
# Start backup
echo "🚀 Backup ready..."
cd "$INSTANCE_DIR"
# Database backup
BACKUP_FILE="$BACKUP_DIR/$(date +$DATE_FORMAT).gz"
docker exec $DB_CONTAINER pg_dump -Fc -U $DB_USER $DB_NAME | gzip -c >"$BACKUP_FILE"
echo "✅ Success!"
# Sync backup
echo "🔄 Syncing..."
find "$BACKUP_DIR" -mtime +$BACKUP_LIFETIME_DAYS -name "*.gz" -exec rm -f {} \;
rclone copy "$BACKUP_DIR" $RCLONE_DESTINATION
echo "👍 Mastodone."
```
Mastodon以外のAP実装を運用している人は各自、気の利いたジョークで末尾の内容を置き換えなければならない。義務 上記のスクリプトをcronに登録するとバックアップ作業の自動化が達成できる。
```zsh
# rootで実行する。
sudo crontab -u root -e
# 毎日午前5時に指定された場所のスクリプトを実行する。別に好きな時間でいい。
0 5 * * * sh /home/ユーザ/ファイル.sh
```
最高だね。面倒なことは全部機械にやらせよう。ただし、cronのやつは油断すると裏切るのでたまにCloudflareのバケットを見に行った方がいいかもしれない。
## Mastodonのリモートメディアを確認して削除する
>**前提**