Agate - проверенный временем сервер статики для Gemini, написанный на языке Rust. В отличии от gmid, в виду особенностей реализации rustls (и ограничений RFC 6066 в частности) не имел поддержки «сырых» адресов IPv6 и требовал наличия Alfis DNS или meshname.
С недавних пор, в рамках PR#433 появилась экспериментальная ветка, которая реализует fallback SNI: то есть, позволяет указывать общий сертификат-заглушку, применимую для меш-сетей, например Yggdrasil и/или Mycelium. Ниже рассмотрен пример её установки и использования.
git clone https://github.com/YGGverse/agate.git cd agate git checkout fallback-sni cargo build --release sudo install target/release/agate /usr/local/bin
Сервер Agate имеет ряд особенностей при работе в мульти-хост режиме. Наиболее простой вариант запуска для наших целей - автоматическое создание в первую очередь сертификатов для хостов .ygg, .i2p и т.д., если предусмотрено их использование. Для этого, сначала следует выполнить инициальный запуск с терминала, указав аргумент(ы) --hostname:
agate --addr [::1]:1965 --hostname domain.ygg --hostname domain.i2p --certs /path/to/.certificates
Один из сертификатов копируем в корень /path/to/.certificates - он будет использоваться по-умолчанию. Запись CN (Canonical Name) в данном случае не имеет значения, т.к. наиболее популярный браузер Lagrange это поддерживает (пример тому - сертификат BBS); также можно создать сертификат вручную, указав IPv6 в качестве значения.
Далее создадим сервис, в котором из Exec убираем --hostname и указываем бинд на реальные интерфейсы. В данном примере, используются сети Yggdrasil и Mycelium, но может быть и общий «::»
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=agate
Group=agate
WorkingDirectory=/home/agate
ExecStart=/usr/local/bin/agate --content /home/agate/public \
--certs /path/to/.certificates \
--addr [202:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:1965 \
--addr [505:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:1965
StandardOutput=file:///home/agate/debug.log
StandardError=file:///home/agate/error.log
[Install]
WantedBy=multi-user.target
Таким образом, сервис будет доступен на адресах: