This commit is contained in:
Rikuoh Tsujitani 2023-11-27 20:14:59 +09:00
parent e6ad1d92d7
commit 7811bba2f4
Signed by: riq0h
GPG key ID: 010F09DEA298C717

View file

@ -46,109 +46,109 @@ 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環境でインスタンスを動かしている。
誉れ高き丸投げシリーズその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のバケットを見に行った方がいいかもしれない。
## Mastodonのリモートメディアを確認して削除する