Gemini Protocol のサーバ実装 gmid を ArchLinux にインストールする
おことわり
この記事では断りなくmustache構文を用いることがある。注意されたい。
Gemini Protocol とは
概要
今の WWW には、問題点があると考える。 広告やトラッキング、自動再生される動画などである。 特に広告とトラッキングに関しては、広告やトラッキングをブロックすることが、ブラウザの機能として取り込まれるまでになり、さらに、それらが欠かせないものとなってしまった。
gemini は、そんなカオスな現代の WWW とは、対照的なプロトコルである。
公式サイトの FAQ にある 「what is gemini? 」の章には、大体以下のことが書いてある。
- プロトコルとしては、OSI 参照モデルにおけるアプリケーション層に該当する
- プロトコルに加え、軽量なハイパーテキストフォーマットを加えたもの
- Web を本来のあるべき姿に戻しつつ、 Gopher 1 を現代風に味付けしたもの。
- URI、MIME type や TLS といった、標準化され、成熟している技術の上に成立している
- シンプルさとプライバシーを念頭に置いている
- 拡張を困難にすることで、シンプルでプライバシーを確保することができる
その他、Gemini の response は、 HTTP のように Header 部と Body 部に分かれている。 Header 部には status code や、その文書の言語などを記述する、などに用いられている。
gemini に CSS や JavaScript に当たるものはない。CSS 的な装飾は Client に委ねられている。
gemtext
先程の箇条書きにあった「軽量なハイパーテキストフォーマット」は gemtext(MIME: text/gemini、拡張子:gmi)と考えられる。
これは Markdown をベースとした軽量マークアップ言語である。 gemini protocol で閲覧できるページのほとんどは、この gemtext で書かれている。 Markdown との大きな差異はリンクにある。
Markdownではこのように文中に[リンク]()を挿入することができるが、
gemtextではこのように
=> https://gemini.circumlunar.space リンク
は改行しなければならない。
しかし、これは表現力を落としてでも、パースを簡単にしようとしているのではないかと考えている。
また、gemtext には Vim、Emacs や nano など各エディタに syntax highlight が用意されている。
client
server に関しては後の章に譲るとして、ここでは client について紹介する。 client について紹介するのは、本筋ではないため、軽く紹介するに留める。 興味のある方は公式サイトのページ、もしくは awesome-geminiを参照していただきたい。
GUIはLagrange、TUIはAmforaが、おすすめと挙げられることが多いように感じられる。 ちなみに、Emacs には Elpher というクライアントが melpa から入手できる。
gmid を選んだ理由
gmid を選んだ理由として 2 つの譲れない点があった。
- eniehack.net は、友人とのカンパによって運用されているので、みんなで使えるようにしい
- すでに Nextcloud が運用されているマシンなので、ファイルシステムをひっ迫したくない
これらから、要件として以下の基準を満たすものをサーバとして採用しようと考えた:
- per-user directory(例: https://example.com/~username)がやりたい
- Go や Nim などのコンパイラを、サーバに導入せずに済む
これらを満たしたものをawesome-geminiから検討した結果、gmid を使うこととした。
他にも、Nim で作られた geminim や、 inetd
などのスーパーサーバで動作する vger などがある。
実装された言語でも、動作する形態でも、バリエーションが豊富なので、是非いろいろ見てほしい。
gmid のインストール
AUR から
AUR から gmid
パッケージをインストールする。
ちなみに、 gmid-bin
や gmid-git
もある。
2022/03/15 追記: systemd-sysusers の設定ファイルや systemd の service ファイルの修正が、AUR パッケージの更新により導入された2。 そのため、以下、訂正線の入った作業は行う必要がなくなった。 具体的には、AUR から gmid のインストールが完了したら、「gmid.conf の編集」から再開して問題ない。 2022/03/15 追記終わり
また、PKGBUILD を自分で修正したことがある、という上級者は、以下の作業によって .service
ファイルの編集、gmid ユーザの作成の各章を飛ばすことができる。
1.
yay -G
や aur fetch
などを用いて、 PKGBUILD
を入手2. 私の pastebin にある 3 つのファイルを curl などで入手し、 PKGBUILD
のあるディレクトリに入れる
$ curl -sSL -o gmid.sysusers https://pastebin.com/raw/U9fMpT37
$ curl -sSL -o gmid.service https://pastebin.com/raw/dKfDWpkz
$ curl -sSL -o PKGBUILD.diff https://pastebin.com/raw/MNt0Dcfy
3. PKGBUILD
に patch を当てる
$ patch PKGBUILD{,.diff}
4. makepkg
や aur build
などを用いて、パッケージを作成し、インストール
service ファイルの編集
このパッケージは systemd の .service
もインストールされるのだが、2022/03/14 現在、そのままでは動作しないので
# systemctl edit gmid
を実行して
[service]
ExecStart=
ExecStart=/usr/bin/gmid -f -c /etc/gmid.conf
と書き加える必要がある。
gmid ユーザの作成
公式ドキュメントでは gmid を実行するためのユーザを作成することを勧めているので作成する。
ArchLinux には、system user を作成するためのツールが systemd によって用意されているので3、これを使う。
gmid の upstream が、新しいリリースを出したら、AUR パッケージにも反映されるはずである。 /usr/lib/sysusers.d/gmid.conf
がなければ、curl で取得する 4 。
$ curl -sSL -o gmid.conf https://raw.githubusercontent.com/omar-polo/gmid/master/contrib/gmid.sysusers
以下のコマンドを実行すれば作成できる:
# systemd-sysusers ./gmid.conf
念のために /etc/passwd
を見ておいてもいいかもしれない。
gmid.conf の編集
gmid公式ドキュメントのquickstartを参考に gmid.conf
を設定する。
ちなみに、gmid パッケージには gmid.conf
向け syntax highlight 用の vim script も付属している。
例えば、per-user directory を作りたい場合:
server "{{FQDN}}" {
cert "{{public key path}}"
key "{{private key path}}"
root "/usr/local/share/gmid/"
location "/~*" {
root "/usr/local/share/gmid"
}
}
などとする。
pacman が、 /usr/local
以下に手を出すことは基本的にありえない5。
そのため、私はこのディレクトリにしたというだけである。
なので、location ディレクティブに記述する directory path は、都合に応じて適宜変更して問題はないはずである。
gencert の実行
理由はよくわからないのだが、Gemini を介して公開されているサーバは、自己署名証明書で TLS 通信を行っている。
そのため、gmid についてくる gencert
という Perl 製ヘルパースクリプトを実行する。
# /usr/share/gmid/gencert {{FQDN}}
その後、 gmid.conf
に記述した場所へ公開鍵(拡張子: .pem
)、秘密鍵(拡張子: .key
)を移動する。
その際、秘密鍵を入れておくディレクトリは、必ず chmod
で 700 に設定しておくこと。
firewall の設定見直し
最後に ufw
などの firewall の設定を変更する。
gemini protocol のデフォルトポートは 1965 であるので、以下を実行する:
# ufw allow 1965
service 実行
# systemctl start gmid
こぼれ話
gmid の upstream には以下が付属している:
- 証明書管理用のヘルパスクリプト
- config ファイルを syntax highlight するための、vimscript
- systemd の service ファイル
- systemd-sysusers のための config ファイル
しかし、そのほとんどが AUR のパッケージではインストールされていなかった。 そのため、AUR に patch を送ったのは初めてのことだった。 すべてが取り入れられたわけではなかった。
しかし、取り入れられなかった点は upstream へ Pull Request を投げたらどうかと言われたため、PRを投げたところ、すんなり受け入れられてしまった。
また、Gemini と同様、HTTP でも、いにしえの `https://eniehack.net/~eniehack` のような URL で自己紹介を書いている。 そのため、gemtext から HTML へ変換するプログラムなどを用いて、gemtext から HTML が生成されると便利かもしれない。
参考
-
https://aur.archlinux.org/cgit/aur.git/commit/?h=gmid&id=8432689b101b93366fcb6a82259503a6f6a0396c を参照。 ↩︎
-
systemd-sysusers。詳細は man page:systemd-sysusers(8)を参照。 ↩︎
-
2022/03/14 現在、まだリリースされていない。 ↩︎
-
Arch パッケージガイドラインを参照。 ↩︎