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