GROWIを再導入した
なんでまた再導入を
運用しているサーバーに、GROWIというWikiシステムを導入した。といっても、以前も一度導入していて、その際は友人と共同で運用するちゃんとした使い方をしていた。部活という体裁で、ドキュメンタリー映画の感想を共有したり、たほいやのプレイログをアップしたりしていたんだけど、ある日別のdockerコンテナを落とそうとして、誤ってGROWIのコンテナを落としてしまい、かつ削除までしてしまったからさあ大変。まあ部活としての活動もかなり下火になってきてたし、GROWI落としちゃったって部員に言っても「はえ~」くらいの反応だったので、まあええかということで特に復旧もせずそのまま終わらせた。なんか新しいWebアプリを運用してみたい、という欲求がしばらく走らせることで充分に満たされてしまったのも大きい。
しかしその後、『文体の舵をとれ』という文体練習本の合評会に参加することになった。合評会はDiscordで行われるが、その録音データをどこにアップロードするかという問題が持ち上がる。Discordには数時間にわたる録音データを無料でアップできるような懐の深さはないので、何かしらのアップローダーあたりを用いる必要があるが、得てしてUIが最悪な上に1週間足らずで削除されるため、なかなか満足のいく運用とはほど遠いものがあった。そこで、何となく、考えもなしに、また新しいWebアプリを運用してみたい欲も手伝って、「ぼくのサーバーにファイルアップロードできるような場所作りましょうか」と言いだしてしまったところ、まあ当然のごとくそれでお願いしますという流れになった次第だ。Mastodonのメディアファイルやバックアップの保管先として使っていたストレージをAmazon S3からCloudflare R2に変えて、大幅に出費が減って気が大きくなっていたのもある。
そんなこんなで、最初はNextCloudという、Dropboxを自分のサーバーでやれますよという感じのOSSを導入する方向で動いていたんだけど、どうやら今の僕のサーバー環境だとNextCloudを入れるのは相当困難というか、(当然のことと言えばそうなんだけど)NextCloudは別のWebアプリとの同一サーバー内共存をあまり前提としていない作りっぽくて、ひとつのサーバーに何でもかんでも入れてしまう異常管理者とはすこぶる相性が悪くて導入を諦めた。とはいえ「やりますよ~」と言った手前「できませんでした~」となるのも癪なので、次善の策として導入実績もありS3互換サービスにも対応しているGROWIを再導入することにした、というのがことの経緯だ。
導入作業でハマったこと
GROWIはdockerでの導入が尋常じゃないほど楽ちんなんだけれど、それでもいくつかハマってしまった点があるので、再々導入をやることになったときのために以下に書き出しておく。ちなみにサーバー構成をひどく大ざっぱに記すと、AlmaLinux + Nginx + Docker-Compose + Cloudflare R2だ。
SSL接続(HTTPS)ができない
GROWIは基本的にはイントラネットでの運用を想定しているのか、デフォルトでHTTPS運用に対応はしていない。対応させるにはdocker-compose.ymlにHTTPS運用用の記述をオーバーライドさせるのが楽みたいだが、いろいろあってこの方法はあまりとりたくなかったので、Nginxのリバースプロキシによって実現させることにした。方法は「GROWI リバースプロキシ」あたりでググればそれなりにリソースが出てくるのでここでは特に触れないが、必ずNginxのconfファイルにclient_max_body_size 0;
の一文を追加しておくこと。そうしないと1MB以上のファイルをアップロードできなくなる。別に上限サイズは0
(無制限)である必要はなく、100m
(100MB)とかでも構わない。
Cloudflare R2のバケットにアクセスできない
GROWIはS3互換APIに対応しているので、Amazon S3以外にもさくらインターネットのオブジェクトストレージなんかにも接続できる。当然、Cloudflare R2にも接続できるはずなんだが、これがなぜか上手くいかなくて大変だった。さくらインターネットのオブジェクトストレージの場合、さくら公式が設定方法をまとめているのもあってすんなりいくんだろうけど、なぜかR2でGROWI運用するよって記事が見つからなかったんよね……。まあMastodonでも使ってるから余裕やろ、とは思ったんだけど、なぜかリージョンを設定するところで必ずエラーが出る。具体的にはs3Region: validation.aws_region
という内容のエラーで、平たく言えば「S3にそんな名前のリージョンはない」というもの。
R2が提供しているリージョンはwnam
(西部北アメリカ)、enam
(東部北アメリカ)、weur
(西ヨーロッパ)、eeur
(東ヨーロッパ)、apac
(アジア太平洋)とauto
の6種類で、自分のリージョンであるapacを入力してもautoを入力しても弾かれる。ならばと空白にしてみたら設定は通るものの、いざファイルをアップロードしようとすると「R2のリージョンはwnam、enam、weur、eeur、apac、autoのどれかやぞ」と怒られてアップロードできない。調べてもそれを解決してくれるリソースが見当たらなくて、数時間途方に暮れていたんだけど、初心に立ち返ってCloudflareの公式ドキュメントを読んだら一瞬で解決した。どうやらS3のリージョンのひとつであるus-east-1
が、R2のリージョンauto
へのエイリアスになっているらしい[1]https://developers.cloudflare.com/r2/api/s3/api/#bucket-region。設定画面に戻ってus-east-1
と入力したら一瞬で上手くいったの、恥ずかしかったな……。
100MB以上のファイルをアップロードできない
ようやくR2への接続も上手くいって、非公開ページに録音データをアップロードしてもらうようにしたわけだけど、ここでまた問題が起きた。100MB以上のファイルのアップロードができない。GROWIはファイルサイズによって弾くような処理はしていないみたいだし、R2の設定ミスか仕様だろうか、と調べてみたものの、S3互換APIからアップロードする限りはファイルサイズに制限はないはず。Nginxの設定ミスや仕様なども検討したけど、どうにも違うみたい。これも悩んだけど、実はR2ではなくCloudflare自体の仕様だった。
先述のR2に接続できないハマりポイントでオロオロしていた際、「ひょっとしてDNSをCloudflareにしないと接続できないのか?」とあり得ない可能性を思いついて、DNSをValueDomainからCloudflareに変更したんだけど、これがよくなかった。料金プランのページをよく読むと、Cloudflareはハチャメチャに金を積まない限り一度に100MB以上のファイルをアップロードできないみたい。慌ててDNSを戻したらアップロードできたわ。技術力の低さに泣けてきますね。
そんなわけで再運用開始
というわけでようやく音声アップローダーとしての運用も軌道に乗ったGROWIなんだけど、非公開ページ以外は誰からも見られる状態で、これをそのまま放置しておくのももったいないなと思ったので、『文体の舵をとれ』合評会で提出した文章や、自作のウミガメのスープ、あとはカスの嘘なんかを載せる混沌としたサイトとして運用することにした。暇なときにでも見ていってくださいね。絶対損させますんで。