====== 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%% * и так далее...