====== Agate ======
[[https://github.com/mbrubeck/agate| Agate]] - проверенный временем сервер статики для [[:gemini_protocol|Gemini]], написанный на языке Rust. В отличии от [[gemini_protocol:gmid|gmid]], в виду особенностей реализации rustls (и ограничений [[https://www.datensen.com/blog/support/setting-the-tls-servername-to-an-ip-address-is-not-permitted/|RFC 6066]] в частности) не имел поддержки "сырых" адресов IPv6 и требовал наличия [[yggdrasil:dns:alfis|Alfis DNS]] или [[yggdrasil:dns:meshname|meshname]].
С недавних пор, в рамках [[https://github.com/mbrubeck/agate/pull/433|PR#433]] появилась экспериментальная [[https://github.com/YGGverse/agate/tree/fallback-sni|ветка]], которая реализует fallback SNI: то есть, позволяет указывать общий сертификат-заглушку, применимую для меш-сетей, например Yggdrasil и/или Mycelium. Ниже рассмотрен пример её установки и использования.
===== Установка =====
* Изменения частично приняты в [[https://github.com/mbrubeck/agate|master]]. Сборка с форка - имеет свои отличия реализации, но в целом обе версии должны работать одинаково.
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 имеет [[https://github.com/mbrubeck/agate#virtual-hosts|ряд особенностей]] при работе в мульти-хост режиме. Наиболее простой вариант запуска для наших целей - автоматическое создание в первую очередь сертификатов для хостов .ygg, .i2p и т.д., если предусмотрено их использование. Для этого, сначала следует выполнить инициальный запуск с терминала, указав аргумент(ы) %%--hostname%%:
agate --addr [::1]:1965 --hostname domain.ygg --hostname domain.i2p --certs /path/to/.certificates
Один из сертификатов копируем в корень %%/path/to/.certificates%% - он будет использоваться по-умолчанию. Запись CN (Canonical Name) в данном случае не имеет значения, т.к. наиболее популярный браузер [[https://gmi.skyjake.fi/lagrange/|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
Таким образом, сервис будет доступен на адресах:
* %%gemini://[202:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]%%
* %%gemini://[505:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]%%
* %%gemini://domain.ygg%%
* %%gemini://domain.i2p%%
* и так далее...