行き先なし

Hakoniwa

インスタントおうちFediverse

みすてむずFediverseMisskeyMastodonPleromaDNSGo

これは みすてむず いず みすきーしすてむず Advent Calendar 2024 13日目の記事です。

目次

忙しい人に向けて

構成

とりあえず Podman Network の 内側<=>内側, 内側<=>外側, 外側<=>外側 を中継するイメージを感じてください。

image

仮想マシンにPodmanとhakoniwaを入れて仮想マシンの中を箱庭とします。

画面イメージ

ダッシュボード
image

デプロイメント image

なぜ

OpenSSLで証明書を作り設置するには人生は短すぎる --- シアン化リチウム@ephemeral

ActivityPubでつながるためにドメインで名前解決できることと署名の正当性、そしてリクエスト署名をチェックするところがあります。 これにより開発環境で http://localhost:3000/ などで建てると連合できません。4

そのために証明書をOpenSSLで作ってリバースプロキシを作ってDNSを置いて…のためにGoogleとChatGPTを往復するには人生は短い。

そこから証明書生成・DNS・プロキシついでにデプロイ機能を合体した Hakoniwa ができました。

閉じた連合のために Tailscale や Cloudflare Tunnel などのインターネットを通る閉域網で実現してるのもあります。
ローカルのために一時的にでも外に出る、これが嘆かわしい。
家の中なら行儀の悪いパケットも、RFC違反でも流し放題なのでもっと自由になりましょう。

心に庭を作りましょう。

発想は Nginx Proxy ManagerYunoHost に近いです。
Hakoniwaはローカルで閉じるので取得済みドメインや Let’s encrypt は不要です。

いろいろ

今後ネタにするかもしれないもの

Podman Quadlet

Podman QuadletはコンテナをSystemdの作法で管理できます。
直接Systemctlユニットファイルに podman run ~ をコマンドで書いてもいいのですがより宣言的にかけるのがメリットです。 コンテナ同士の依存関係は通常のSystemctlユニットと同じく定義できます。

複数のコンテナの起動管理を目的とするとき kubernates の Pod manifestを使えるpodman play kube 5 もあります。
しかし、現在この play kube でコンテナ同士の依存定義(depends)で起動順は制御できますが終了順に反映されません。
これもQuadletを選ぶ理由になります。

HTMX

https://htmx.org/

これはとてもいい。

作るものがコンパクトなときにJSフレームワーク + API設計を巨大に感じるとき、そもそもAPI必要か?と思ったとき、それが使いどころです。
逆に言うとリッチな画面は作らないと決めてください。破綻します。
テーブルがあってフォームがあって追加・削除・編集して…な社内ツール・開発用ツールにありがちな用途ならうまくはまると思います。

ただ、ツールによるWeb開発支援などはJavaScriptの本分というか執念といいますか、JSフレームワークの用意するものに乗っかれば充実しているのに対して少し前時代的なコーディングにはなると思います。
周辺ツールの充実で変わってくると思います。

HTMX + templ

https://templ.guide/

GoのHTML生成テンプレートエンジン   ビルド時にHTML構文ミスに気付けるやつです。
コンポーネントをGo関数のように定義できるので部分的なパーツでリクエストを返すHTMXと相性がよいです。
しかし、Airのホットリロードを使っていてもプログラムが大きくなってくると画面更新までの待ちが長いのが悩みになります。

終わり

アドカレ駆動開発を目指して無事未完成です!

もともと「ActivityPubで何かやろうか、そのために」が始まりでしたが、その気持ちはなくなり手段だけが生き残ってこれを作っていました。
人類が消えた後の地球で命令を遂行し続けるアンドロイドの気分です。

読んでいただきありがとうございました。

脚注

  1. READMEが間に合っていません

  2. Pleromaの認証局追加ができておらず連合未対応です

  3. 実際のところコンテナpull/build、初期マイグレーションで数分~もう少し待ちます

  4. ソースを弄れば回避できますがエレガントではない

  5. Quadletに [Kube] ユニットもあるので排他的な存在ではないです