diff --git a/content/post/かゆいところに手が届くインスタンス運用の初級テクニック集.md b/content/post/かゆいところに手が届くインスタンス運用の初級テクニック集.md index 8c99d08..f72b2fe 100644 --- a/content/post/かゆいところに手が届くインスタンス運用の初級テクニック集.md +++ b/content/post/かゆいところに手が届くインスタンス運用の初級テクニック集.md @@ -22,13 +22,13 @@ tags: ['tech'] 暗号鍵が作成されると画面上に文字列が現れるので、速やかにコピペして指示通りの拡張子で保存する。この画面は再び開けないため、インスタンスを動かしているサーバ上だけでなく安全なローカル環境にも予備を保存しておくのが望ましい。サーバにそれぞれの鍵を保存したら、先にLet's Encryptで発行したSSL証明書を削除する。以降の操作はroot権限で行う。 -```bash +```zsh $ certbot revoke --cert-path /etc/letsencrypt/live/あんたのドメイン名/cert.pem ``` 実行確認を承諾すると証明書は直ちに失効される。cronを設定している人は`crontab`を実行して自動更新も忘れずに解除しよう。続いて、nginxの設定に進む。手始めに必要なディレクトリを作成してCloudflareの暗号鍵を移動する。 -```bash +```zsh $ mkdir /etc/ssl/certs $ mkdir /etc/ssl/private $ mv あんたのドメイン名.pem /etc/ssl/certs/あんたのドメイン名.pem @@ -37,7 +37,7 @@ $ mv あんたのドメイン名.key /etc/ssl/private/あんたのドメイン 移動したら任意のエディタでnginxの設定ファイルを編集する。 -```bash +```zsh $ vim /etc/nginx/sites-available/あんたのドメイン名.conf ssl_certificate /etc/ssl/certs/あんたのドメイン名.pem; @@ -56,7 +56,7 @@ ssl_certificate_key /etc/ssl/private/あんたのドメイン名.key; 次にwranglerを導入する。wranglerはCloudflareのWorkerをCLIで動かすツールだが、**ほとんどのインスタンス運営者が使用しているUbuntuやDebianでは簡単にインストールが行えない。** aptコマンドでインストールされるNode.jsのバージョンが古すぎるためにエラーを起こしてしまうのだ。したがって、wranglerを導入する**前に**最新のNode.jsをインストールしなければならない。 -```bash +```zsh # すでに古いNode.jsが入っている場合はアンインストールする。 $ apt purge nodejs @@ -68,7 +68,7 @@ dpkgに怒られが発生した時は`sudo dpkg -i --force-overwrite /var/cache/ 最新のNode.jsを手に入れたところでようやくwranglerのインストールに入る。npmを導入していなければこれも`apt install npm`で予めインストールする。 -```bash +```zsh $ npm create cloudflare@latest # この後、色々訊かれるが指定すべき選択肢は以下の通り。 @@ -92,21 +92,21 @@ $ npm create cloudflare@latest 一旦、愚直にコピペしたURLで認証を行なって失敗してみると、ブラウザのアドレス欄からlocalhostの8976番ポートと通信を試みていた形跡がうかがえる。つまり、このURLをサーバの固定IPアドレスに書き換えれば期待通りの挙動に変化すると考えられる。そこでまずはサーバ側の8976番ポートを開けて準備を整える。ufwはとても簡便なファイアウォールフロントエンドなので、知らなくともぜひ導入してみてほしい。 -```bash +```zsh $ ufw allow 8976 $ ufw reload ``` ポートを開いた状態で例のURLの`localhost:8976`の部分を`あんたのサーバのIPアドレス:8976`に書き換えてエンターを押す。うまくいけばたちまち認証が完了してサーバ上でwranglerが使えるようになる。開いたポートはもう使わないので確実に閉じておく。 -```bash +```zsh $ ufw deny 8976 $ ufw reload ``` 以降はインスタンスを動かしているユーザに切り替えて非root環境で作業を行う。ここまで来たところで、試しにバックアップ作業を手動で実行する。 -```bash +```zsh # pg_dumpでバックアップを取得してgzipで固める。userとdbの部分は各自の環境に合わせて変更すること。 $ sudo docker exec mastodon-db-1 pg_dump -Fc -U user db | gzip -c >> backup.gz # バックアップファイルに権限を与える。 @@ -121,7 +121,7 @@ $ rm /home/ユーザ/インスタンスのディレクトリ/backup.gz 一連の動作が間違いなく完了するのを確認した上で、同様の処理内容をシェルスクリプトにしたためる。これでいつでもワンタッチでバックアップを巨人の口にねじ込めるという寸法だ。作成したスクリプトは`chmod +x ファイル名.sh`で実行権限を与えてから`sudo ./ファイル名.sh`で発動する。 -```bash +```zsh #!/bin/bash echo "Backup begin..." @@ -140,7 +140,7 @@ bash 上記のスクリプトをcronに登録するとバックアップ作業の自動化が達成できる。 -```bash +```zsh # rootで実行する。 sudo crontab -u root -e @@ -157,7 +157,7 @@ sudo crontab -u root -e Web UIのサーバ設定でもリモートメディアを自動削除するようにできるが、具体的に何GBのキャッシュが存在していて何GBぶん減らせたのか判らないところがちょっと物足りない。下記の平易なスクリプトでそれを補える。 -```bash +```zsh #!/bin/bash cd /home/ユーザ/インスタンスのディレクトリ/ @@ -180,7 +180,7 @@ echo "Done." Mastodonは投稿の読み込み数に制限がある。おそらく負荷対策だろう。過去の投稿は最大で800までしか読み込めない。いちユーザの立場では変えられないゆえ不便を被っている者も少なくないと思われるが、我々は圧倒的権力を誇る鯖缶だ。いくらでも好きな数字に書き換えられる。 -```bash +```ruby # mastodon/app/lib/feed_manager.rb MAX_ITEMS = 2000 @@ -189,13 +189,38 @@ MAX_ITEMS = 2000 さしあたり僕は2000にした。編集後は`sudo docker-compose build`で再ビルドしなければ反映されない。これで深夜帯に蓄積された投稿の一部しか読めないなどという理不尽から解き放たれる。 +## Mastodonの画像リサイズ制限を破壊する +>**前提** +>・Docker環境でMastodonインスタンスを動かしている。 + +Mastodonは画像の最大解像度が1080p相当に抑えられている。多くのユーザを限られたリソースで支える状況下ではやむをえない制限だが、ソロインスタンスでは関係がない。4K画質相当まで上げてしまおう。 + +```javascript +# resize_image.js + +const MAX_IMAGE_PIXELS = 8847360; +``` + +```ruby +# media_attachment.rb + + IMAGE_STYLES = { + original: { + pixels: 8_847_360, + file_geometry_parser: FastGeometryParser, + }.freeze, +``` + +こっちも再ビルドは忘れはならない。もちろん4Kを越える解像度のカメラやディスプレイを持っている人は8Kなどにしてもよい。 + + ## Mastodonの文字数上限を破壊する >**前提** >・Docker環境でMastodonインスタンスを動かしている。 500文字もあれば十分と思いきや、ここ一番の時に足りない場合が意外とあったりする。実装系にもよるがだいたいどれも8000文字くらいは受け取れるらしいので不要は制限は予め取り払っておいた方が楽だ。さしあたり僕は9999文字に設定した。ここでは2つのファイルを編集するが、当該のファイル内を「500」で検索すれば容易に修正箇所を見つけることができる。 -```bash +```ruby # mastodon/app/javascript/mastodon/features/compose/components/compose_from.javascript return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 9999 || (isOnlyWhitespace && !anyMedia)); @@ -204,11 +229,11 @@ return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 9 ``` -```bash +```ruby # mastodon/app/validators/status_length_validator.rb class StatusLengthValidator < ActiveModel::Validator MAX_CHARS = 9999 ``` -こっちでも再ビルドを忘れてはならない。余談だが、最近華々しいリニューアルを果たしたMisskeyフォークの[Firefish](https://joinfirefish.org)は一瞬だけ最大文字数を2億5000万文字に設定できたらしい。いい心意気だ。 +余談だが、最近華々しいリニューアルを果たしたMisskeyフォークの[Firefish](https://joinfirefish.org)は一瞬だけ最大文字数を2億5000万文字に設定できたらしい。いい心意気だ。