This commit is contained in:
Rikuoh Tsujitani 2023-11-27 20:08:09 +09:00
parent 19d49d9520
commit e6ad1d92d7
Signed by: riq0h
GPG key ID: 010F09DEA298C717
2 changed files with 104 additions and 104 deletions

View file

@ -10,7 +10,7 @@ steps:
commands: commands:
- hugo - hugo
deploy: deploy:
image: drillster/drone-rsync image: plugins/drone-rsync
secrets: [USER, HOTS, SSH, PORT] secrets: [USER, HOTS, SSH, PORT]
settings: settings:
hosts: hosts:

View file

@ -46,109 +46,109 @@ 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 → 概要**と進んでバケットを作成する。バケットの名前はなんでも構わない。ついでに設定から自動削除をスケジュールすると容量の節約になる。 <!-- 誉れ高き丸投げシリーズその2。どんどん丸投げしていこう。我々はすでに巨人の肩に乗っているし、どうせ今さら降りることなどできない。Cloudflareのページで**R2 → 概要**と進んでバケットを作成する。バケットの名前はなんでも構わない。ついでに設定から自動削除をスケジュールすると容量の節約になる。 -->
<!---->
![](/img/201.png) <!-- ![](/img/201.png) -->
<!---->
次にwranglerを導入する。wranglerはCloudflareのWorkerをCLIで動かすツールだが、**ほとんどのインスタンス運営者が使用しているUbuntuやDebianでは簡単にインストールが行えない。** aptコマンドでインストールされるNode.jsのバージョンが古すぎるためにエラーを起こしてしまうのだ。したがって、wranglerを導入する**前に**最新のNode.jsをインストールしなければならない。 <!-- 次にwranglerを導入する。wranglerはCloudflareのWorkerをCLIで動かすツールだが、**ほとんどのインスタンス運営者が使用しているUbuntuやDebianでは簡単にインストールが行えない。** aptコマンドでインストールされるNode.jsのバージョンが古すぎるためにエラーを起こしてしまうのだ。したがって、wranglerを導入する**前に**最新のNode.jsをインストールしなければならない。 -->
<!---->
```zsh <!-- ```zsh -->
# すでに古いNode.jsが入っている場合はアンインストールする。 <!-- # すでに古いNode.jsが入っている場合はアンインストールする。 -->
$ apt purge nodejs <!-- $ apt purge nodejs -->
<!---->
$ curl -fsSL https://deb.nodesource.com/setup_current.x | bash - <!-- $ curl -fsSL https://deb.nodesource.com/setup_current.x | bash - -->
$ apt install nodejs <!-- $ apt install nodejs -->
``` <!-- ``` -->
<!---->
dpkgに怒られが発生した時は`sudo dpkg -i --force-overwrite /var/cache/apt/archives/nodejs_20.5.0-deb-1nodesource1_amd64.deb`で強制的に上書きするとうまくいく。バージョン部分の`20.5.0`は本稿執筆時点での最新の数字なので適宜書き換えられたし。 <!-- 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`で予めインストールする。 <!-- 最新のNode.jsを手に入れたところでようやくwranglerのインストールに入る。npmを導入していなければこれも`apt install npm`で予めインストールする。 -->
<!---->
```zsh <!-- ```zsh -->
$ npm create cloudflare@latest <!-- $ npm create cloudflare@latest -->
<!---->
# この後、色々訊かれるが指定すべき選択肢は以下の通り。 <!-- # この後、色々訊かれるが指定すべき選択肢は以下の通り。 -->
・Ok to proceed? <!-- ・Ok to proceed? -->
→ Yes <!-- → Yes -->
<!---->
・In which directory do you want to create your application? <!-- ・In which directory do you want to create your application? -->
→ プロジェクトディレクトリの命名を行う。適当な名前でいい。 <!-- → プロジェクトディレクトリの命名を行う。適当な名前でいい。 -->
<!---->
・What type of application do you want to create? <!-- ・What type of application do you want to create? -->
→ type Scheduled Worker (Cron Trigger) <!-- → type Scheduled Worker (Cron Trigger) -->
<!---->
・Do you want to use TypeScript? <!-- ・Do you want to use TypeScript? -->
→ no <!-- → no -->
<!---->
・Do you want to deploy your application? <!-- ・Do you want to deploy your application? -->
→ no <!-- → no -->
``` <!-- ``` -->
<!---->
作業が完了したら命名したディレクトリに移り、`npx wrangler login`を実行する。URLが表示されるのでコピペしてブラウザに貼り付けるとCloudflareの認証画面が現れる。**しかし、SSH越しに実行しているかぎりこの認証は絶対に失敗する。** 認証情報をlocalhostに渡しているせいで照合が成立しないからだ。今回はちょっとした荒業でこいつをくぐり抜けたい。 <!-- 作業が完了したら命名したディレクトリに移り、`npx wrangler login`を実行する。URLが表示されるのでコピペしてブラウザに貼り付けるとCloudflareの認証画面が現れる。**しかし、SSH越しに実行しているかぎりこの認証は絶対に失敗する。** 認証情報をlocalhostに渡しているせいで照合が成立しないからだ。今回はちょっとした荒業でこいつをくぐり抜けたい。 -->
<!---->
一旦、愚直にコピペしたURLで認証を行なって失敗してみると、ブラウザのアドレス欄からlocalhostの8976番ポートと通信を試みていた形跡がうかがえる。つまり、このURLをサーバの固定IPアドレスに書き換えれば期待通りの挙動に変化すると考えられる。そこでまずはサーバ側の8976番ポートを開けて準備を整える。ufwはとても簡便なファイアウォールフロントエンドなので、知らなくともぜひ導入してみてほしい。 <!-- 一旦、愚直にコピペしたURLで認証を行なって失敗してみると、ブラウザのアドレス欄からlocalhostの8976番ポートと通信を試みていた形跡がうかがえる。つまり、このURLをサーバの固定IPアドレスに書き換えれば期待通りの挙動に変化すると考えられる。そこでまずはサーバ側の8976番ポートを開けて準備を整える。ufwはとても簡便なファイアウォールフロントエンドなので、知らなくともぜひ導入してみてほしい。 -->
<!---->
```zsh <!-- ```zsh -->
$ ufw allow 8976 <!-- $ ufw allow 8976 -->
$ ufw reload <!-- $ ufw reload -->
``` <!-- ``` -->
<!---->
ポートを開いた状態で例のURLの`localhost:8976`の部分を`あんたのサーバのIPアドレス:8976`に書き換えてエンターを押す。うまくいけばたちまち認証が完了してサーバ上でwranglerが使えるようになる。開いたポートはもう使わないので確実に閉じておく。 <!-- ポートを開いた状態で例のURLの`localhost:8976`の部分を`あんたのサーバのIPアドレス:8976`に書き換えてエンターを押す。うまくいけばたちまち認証が完了してサーバ上でwranglerが使えるようになる。開いたポートはもう使わないので確実に閉じておく。 -->
<!---->
```zsh <!-- ```zsh -->
$ ufw deny 8976 <!-- $ ufw deny 8976 -->
$ ufw reload <!-- $ ufw reload -->
``` <!-- ``` -->
<!---->
以降はインスタンスを動かしているユーザに切り替えて非root環境で作業を行う。ここまで来たところで、試しにバックアップ作業を手動で実行する。 <!-- 以降はインスタンスを動かしているユーザに切り替えて非root環境で作業を行う。ここまで来たところで、試しにバックアップ作業を手動で実行する。 -->
<!---->
```zsh <!-- ```zsh -->
# pg_dumpでバックアップを取得してgzipで固める。userとdbの部分は各自の環境に合わせて変更すること。 <!-- # pg_dumpでバックアップを取得してgzipで固める。userとdbの部分は各自の環境に合わせて変更すること。 -->
$ sudo docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz <!-- $ sudo docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz -->
# バックアップファイルに権限を与える。 <!-- # バックアップファイルに権限を与える。 -->
$ chmod 774 ./backup.gz <!-- $ chmod 774 ./backup.gz -->
# wranglerのプロジェクトディレクトリに移動する。 <!-- # wranglerのプロジェクトディレクトリに移動する。 -->
$ cd /home/ユーザ/プロジェクトディレクトリ <!-- $ cd /home/ユーザ/プロジェクトディレクトリ -->
# バックアップファイルをCloudflare R2にアップロードする。この際、ファイル名を現在時刻に書き換える。 <!-- # バックアップファイルをCloudflare R2にアップロードする。この際、ファイル名を現在時刻に書き換える。 -->
$ sudo npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz <!-- $ sudo npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz -->
# 元のバックアップファイルを削除する。 <!-- # 元のバックアップファイルを削除する。 -->
$ rm /home/ユーザ/インスタンスのディレクトリ/backup.gz <!-- $ rm /home/ユーザ/インスタンスのディレクトリ/backup.gz -->
``` <!-- ``` -->
<!---->
一連の動作が間違いなく完了するのを確認した上で、同様の処理内容をシェルスクリプトにしたためる。これでいつでもワンタッチでバックアップを巨人の口にねじ込めるという寸法だ。作成したスクリプトは`chmod +x ファイル名.sh`で実行権限を与えてから`sudo ./ファイル名.sh`で発動する。 <!-- 一連の動作が間違いなく完了するのを確認した上で、同様の処理内容をシェルスクリプトにしたためる。これでいつでもワンタッチでバックアップを巨人の口にねじ込めるという寸法だ。作成したスクリプトは`chmod +x ファイル名.sh`で実行権限を与えてから`sudo ./ファイル名.sh`で発動する。 -->
<!---->
```zsh <!-- ```zsh -->
#!/bin/bash <!-- #!/bin/bash -->
<!---->
echo "Backup begin..." <!-- echo "Backup begin..." -->
cd /home/ユーザ/インスタンスのディレクトリ/ <!-- cd /home/ユーザ/インスタンスのディレクトリ/ -->
docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz <!-- docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz -->
chmod 744 ./backup.gz <!-- chmod 744 ./backup.gz -->
echo "Success!" <!-- echo "Success!" -->
<!---->
su - ユーザ << bash <!-- su - ユーザ << bash -->
echo "Uploading to Cloudflare R2..." <!-- echo "Uploading to Cloudflare R2..." -->
cd /home/ユーザ/プロジェクトディレクトリ/ <!-- cd /home/ユーザ/プロジェクトディレクトリ/ -->
npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz <!-- npx wrangler r2 object put "あんたのバケット名/$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --file=/home/ユーザ/インスタンスのディレクトリ/backup.gz -->
rm /home/ユーザ/インスタンスのディレクトリ/backup.gz <!-- rm /home/ユーザ/インスタンスのディレクトリ/backup.gz -->
bash <!-- bash -->
``` <!-- ``` -->
<!---->
上記のスクリプトをcronに登録するとバックアップ作業の自動化が達成できる。 <!-- 上記のスクリプトをcronに登録するとバックアップ作業の自動化が達成できる。 -->
<!---->
```zsh <!-- ```zsh -->
# rootで実行する。 <!-- # rootで実行する。 -->
sudo crontab -u root -e <!-- sudo crontab -u root -e -->
<!---->
# 毎日午前5時に指定された場所のスクリプトを実行する。別に好きな時間でいい。 <!-- # 毎日午前5時に指定された場所のスクリプトを実行する。別に好きな時間でいい。 -->
0 5 * * * sh /home/ユーザ/ファイル.sh <!-- 0 5 * * * sh /home/ユーザ/ファイル.sh -->
``` <!-- ``` -->
<!---->
最高だね。面倒なことは全部機械にやらせよう。ただし、cronのやつは油断すると裏切るのでたまにCloudflareのバケットを見に行った方がいいかもしれない。 <!-- 最高だね。面倒なことは全部機械にやらせよう。ただし、cronのやつは油断すると裏切るのでたまにCloudflareのバケットを見に行った方がいいかもしれない。 -->
## Mastodonのリモートメディアを確認して削除する ## Mastodonのリモートメディアを確認して削除する