ごきげんよう。 各位馴れ合っているか? こちらも 馴れ合っている。 主に 質問箱で。
ある 種の 勇敢さを もった 人々に とって、 質問箱、 すなわち匿名コミュニケーションとは 弱気の 同義語に すぎない。 また別の 慎慮ある 人々に とっては、 それらは 唾棄すべき 馴れ合いの 道具だ。 彼らの 言い分を 総合すると 以下のように なる :顕名でしゃべるか( オール ) 、 あるいは( オア ) 、 何もしないか( ナッシング ) 。 両者の あいだに 道は ない。 ちょうど天と 地の あいだに 安住の 地が ないのと 同じように。
しかし (ここで 目を 瞑る)、 私( きみたち ) が コミュニケーションを どうみな すかと いう 問題と 別に、 私( きみたち ) と コミュニケーションを とる 相手が どういう 視点を とるかと いう 問題も また ある (驚くべきことに)。 事実、 私( きみたち ) のような 愛想の 悪い 人間を 相手するに あたっては、 コミュニケーションの 中間的な モードが 役立つこともあるらしい。 そのことに 気づいたのは 後に なってからだが、 ともかくも、 何を 隠そう、 私は しばらく 前から 質問箱を 開いていた。 そして 良い 帰結 を 得た。 賭けに 勝ったのだ。
さて、 なぜ 今に なって こんな 話を 始めたかと いえば、 使っていた 質問箱――Retrospring ――の 開発が 終わり、 公式サーバ (retrospring.net
)も 近く 閉鎖される ことが 決まったからだ (出典 )。 質問箱サービスは 数多あるが、 Retrospringは ソースコードが 公開されていると いう 点で (以前は)唯一無 二だった。 シンプルながら 最低限の 機能を もち、 怪しげな 広告や 外部 サービスとの 連携もなく、 便利とは いえないまでも、ある 程度まとも( ディースント ) では あった。 だが それも もう 終わりだ。 終了の 理由と して 示された 文言には、 どこか 哀愁を 誘うような 調子が ある。
Retrospring never was a large company, as many might have assumed. It never was a company at all. Retrospring started as a project by two friends, later having another one join, and someone leaving again. So, currently, the entire site is being taken care of by 2 people.
With service quality steadily degrading and us not being able to keep up anymore, which is turning into more and more of a liability with our current user counts, we are deciding to shut down the service.
かくしてまた ひとつ墓碑が 増え、 われわれは 路頭に 迷う。 そして リヴァ イ ア サン の 餌食に ……
ならずに 済みそうだ。 幸いにも、 ほぼ後継と いっていい 1 ソフトウェアの 開発が 始まっていた。
Rainbeamと いい、 Rust製、 シンプル志向、と いかにも おたく 好みの 味付けだ。 使い 勝手は 公式インスタンス に 登録して 確認できる。
駆け出しの プロジェクトらしく、 まだ 導入手順等の ドキュメントは 整っていない。 しかし 操作感・UIが 好みなので、 セルフホストできるか試してみた。
要件
動作に 必要な もの
RAMが 1GB程度の Linuxサーバ
Redis
SQLite3
リバースプロキシ(Caddyや Nginx)
hCaptcha の サイトキー・シークレット
1GBと 書いたが、 実際の メモリ消費は もっと 少ないうえ、 常に 負荷が かかるような 代物でもないので、 より ささやかな 環境でも 動くかもしれない。 今回は OCI Cloud Free Tier で 建てたインスタンス (VM.Standard.E2.1.Micro
, Ubuntu 24.04 minimal)を 使う。
ビルドに 必要な もの
Linux環境 (おそらく 2 )
build-essentials
ないしそれに 類する ツール群 (gcc
など)
Rustの ビルド環境
just
(タスクランナー)
pkg-config
libssl-dev
ビルドは それなりに 重い。 動作させる サーバ上で 直接ビルドしても よいが、 サーバの スペックに よっては ありえない 時間が かかり3 、 待ち時間に 九十億の 神の 御名を 数え 終わってしまうので、 別の マシンで 行うのが 無難だろう。 日常的に Linuxを 使っていないかわい そうな ユーザの 場合、 Dockerや GitHub Actionsなどで 適当な ビルド環境を でっち上げる 必要が ある。
ビルド
依存関係の インストール
sudo apt install build-essentials rustup just pkg-config libssl-dev
実行
リポジトリを クローンし、just build
で ビルドを 実行する。 引数には 利用したい データベースの バックエンドを 指定する。 小規模・個人用の 場合は SQLiteで 十分だろう (PostgreSQLや MySQL / MariaDBも 選べるらしい)。
git clone https://github.com/swmff/rainbeam
終わったら./target/release/rainbeam
に ある バイナリを サーバ上に 転送しておく。
サーバの 設定
以下、 サーバの IPと 紐づいた ドメイン(ask.example.com
と する)の 設定は 済んでいる ものとする。 Cloudflareなりなんなりの CDNを 挟む場合も あらかじめ設定を 済ませておく。
依存関係の インストール・ 有効化
sudo apt install redis sqlite3 caddy
sudo systemctl enable redis-server --now
sudo systemctl enable caddy --now
設定ファイルの 編集
サーバ上にも Rainbeamの リポジトリを クローンしておく。 この 作業は 厳密には 必要ないが、 リポジトリの./.config/
以下に 備わっている 設定例・デフォルトの 画像等を 利用する ために 行っている。
以下、 すべての 作業は クローンしたリポジトリの ルートディレクトリで 行う。
git clone https://github.com/swmff/rainbeam
まず./.config/config.toml
に 設定を 書く。./.config/config.example.toml
に サンプルが ある ほか、 設定を 読み込むコード に 各項目の 説明が 書かれているので 参照すると よい。 取得しておいた hCaptchaの キーと シークレットは ここに 書き込む。
port = 8080 # Rainbeamが待ち受けるポート
static_dir = "" # 静的ファイルを置くディレクトリ。デフォルトでは作業ディレクトリ直下の ./.config/static/
registration_enabled = true # ユーザ登録を許可するか否か(後述)
host = "https://ask.example.com" # きみの設定したドメイン
real_ip_header = "CF-Connecting-IP" # CloudflareのCDNを挟む場合
site_key = "hCaptchaのサイトキー"
secret = "hCaptchaのシークレット"
続いて./.config/static/site/about.md
を 編集する。 どこにも 明記されていないが、 これが/site/about
に 表示される 説明文に なる (例 )。
- お前も **本当に美しい** 魂になりたいんだろ?
- なりたければ[ プロフ ]( https://www.haxibami.net/about )みて
ちょっとした ハック
執筆時点では、 作業ディレクトリに SQLiteの ファイル (main.db
)が あらかじめ存在しないと 起動時に パニックを 起こす。 空ファイルで よいので 作成しておく。
リバースプロキシの 設定
良き慣習に 従い、 インターネットとの 界面には リバースプロキシを 挟むことに する。 Nginxの 設定ファイルは 絶対に 書きたくない ので、 人間の 顔を した 唯一の Webサーバである Caddyの 例のみを 示す。
# Caddyの自動SSLを使わず別の証明書(Cloudflareの証明書など)を使う場合はそれも指定
# tls /etc/ssl/certs/cloudflare.pem /etc/ssl/private/cloudflare.key
reverse_proxy localhost:8080
sudo systemctl restart caddy
systemdの セットアップ
任意だが、 systemdで サービスを 管理したいなら ユニットを 書いておく 必要が ある。 ユーザ名・ ディレクトリは 適宜読み替える こと。
Description = Rainbeam daemon
After = caddy.service network-online.target
ExecStart = /usr/local/bin/rainbeam
WorkingDirectory = /home/rainbeam/rainbeam
SyslogIdentifier = rainbeam
WantedBy = multi-user.target
変更を 反映して ユニットを 有効化する。 状態を 確認し、 問題な さそうなら、 ブラウザから 設定済みの ドメインに アクセスしてみる。
sudo systemctl daemon-reload
sudo systemctl enable --now rainbeam
> systemctl status rainbeam
● rainbeam.service - Rainbeam daemon
Loaded: loaded (/etc/systemd/system/rainbeam.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-10-26 03:28:55 UTC; 13h ago
Main PID: XXXX (rainbeam)
Memory: 16.6M (peak: 17.3M)
CGroup: /system.slice/rainbeam.service
└─XXXX /home/rainbeam/rainbeam/target/release/rainbeam
2024-10-26T03:28:55.678132Z INFO 🌈 Starting server at: http://localhost:8080!
うまく いけば トップページが 表示されるはずだ。
トップページ
初期設定
この 時点では 「来る 者は 拒まず」 状態で、 あらゆる ユーザが 登録できてしまう。 自分の 登録が 済んだら、 いったんサービスを 止め、 設定 のregistration_enabled
をfalse
に 変更して 再起動する。
あとは プロフィール等を 設定すれば 完成だ。
結果
そういうわけで 質問箱 が 建った。 いつでも 匿名コミュニケーションを お待ちしています。