<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>HowTo Yggdrasil - gemini_protocol</title>
        <description></description>
        <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/</link>
        <lastBuildDate>Fri, 08 May 2026 02:42:31 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_media/wiki:logo.png</url>
            <title>HowTo Yggdrasil</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/</link>
        </image>
        <item>
            <title>Agate</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:agate?rev=1775390533&amp;do=diff</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;agate&quot;&gt;Agate&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/mbrubeck/agate&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/mbrubeck/agate&quot; rel=&quot;ugc nofollow noopener&quot;&gt; Agate&lt;/a&gt; - проверенный временем сервер статики для &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Gemini&lt;/a&gt;, написанный на языке Rust. В отличии от &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:gmid&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol:gmid&quot; data-wiki-id=&quot;gemini_protocol:gmid&quot;&gt;gmid&lt;/a&gt;, в виду особенностей реализации rustls (и ограничений &lt;a href=&quot;https://www.datensen.com/blog/support/setting-the-tls-servername-to-an-ip-address-is-not-permitted/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://www.datensen.com/blog/support/setting-the-tls-servername-to-an-ip-address-is-not-permitted/&quot; rel=&quot;ugc nofollow noopener&quot;&gt;RFC 6066&lt;/a&gt; в частности) не имел поддержки «сырых» адресов IPv6 и требовал наличия &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:alfis&quot; class=&quot;wikilink1&quot; title=&quot;yggdrasil:dns:alfis&quot; data-wiki-id=&quot;yggdrasil:dns:alfis&quot;&gt;Alfis DNS&lt;/a&gt; или &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:meshname&quot; class=&quot;wikilink1&quot; title=&quot;yggdrasil:dns:meshname&quot; data-wiki-id=&quot;yggdrasil:dns:meshname&quot;&gt;meshname&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
С недавних пор, в рамках &lt;a href=&quot;https://github.com/mbrubeck/agate/pull/433&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/mbrubeck/agate/pull/433&quot; rel=&quot;ugc nofollow noopener&quot;&gt;PR#433&lt;/a&gt; появилась экспериментальная &lt;a href=&quot;https://github.com/YGGverse/agate/tree/fallback-sni&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/agate/tree/fallback-sni&quot; rel=&quot;ugc nofollow noopener&quot;&gt;ветка&lt;/a&gt;, которая реализует fallback SNI: то есть, позволяет указывать общий сертификат-заглушку, применимую для меш-сетей, например Yggdrasil и/или Mycelium. Ниже рассмотрен пример её установки и использования.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Agate&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;agate&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1241&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Изменения частично приняты в &lt;a href=&quot;https://github.com/mbrubeck/agate&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/mbrubeck/agate&quot; rel=&quot;ugc nofollow noopener&quot;&gt;master&lt;/a&gt;. Сборка с форка - имеет свои отличия реализации, но в целом обе версии должны работать одинаково.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code&quot;&gt;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&lt;/pre&gt;

&lt;p&gt;
Сервер Agate имеет &lt;a href=&quot;https://github.com/mbrubeck/agate#virtual-hosts&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/mbrubeck/agate#virtual-hosts&quot; rel=&quot;ugc nofollow noopener&quot;&gt;ряд особенностей&lt;/a&gt; при работе в мульти-хост режиме. Наиболее простой вариант запуска для наших целей - автоматическое создание в первую очередь сертификатов для хостов .ygg, .i2p и т.д., если предусмотрено их использование. Для этого, сначала следует выполнить инициальный запуск с терминала, указав аргумент(ы) --hostname:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;agate --addr [::1]:1965 --hostname domain.ygg --hostname domain.i2p --certs /path/to/.certificates&lt;/pre&gt;

&lt;p&gt;
Один из сертификатов копируем в корень /path/to/.certificates - он будет использоваться по-умолчанию. Запись CN (Canonical Name) в данном случае не имеет значения, т.к. наиболее популярный браузер &lt;a href=&quot;https://gmi.skyjake.fi/lagrange/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://gmi.skyjake.fi/lagrange/&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Lagrange&lt;/a&gt; это поддерживает (пример тому - сертификат BBS); также можно создать сертификат вручную, указав IPv6 в качестве значения.
&lt;/p&gt;

&lt;p&gt;
Далее создадим сервис, в котором из Exec убираем --hostname и указываем бинд на реальные интерфейсы. В данном примере, используются сети Yggdrasil и Mycelium, но может быть и общий «::»
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:agate?codeblock=2&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_service&quot;&gt;/etc/systemd/system/agate.service&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;[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&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Таким образом, сервис будет доступен на адресах:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; gemini://[202:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; gemini://[505:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; gemini://domain.ygg&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; gemini://domain.i2p&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; и так далее…&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1242-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 05 Apr 2026 12:02:13 +0000</pubDate>
        </item>
        <item>
            <title>β-Doku</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:bdoku?rev=1761120797&amp;do=diff</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;β-doku&quot;&gt;β-Doku&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Проект с &lt;a href=&quot;https://github.com/YGGverse/bdoku&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/bdoku&quot; rel=&quot;ugc nofollow noopener&quot;&gt;открытым кодом&lt;/a&gt; для организации зеркала &lt;a href=&quot;https://www.dokuwiki.org&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://www.dokuwiki.org&quot; rel=&quot;ugc nofollow noopener&quot;&gt;DokuWiki&lt;/a&gt; для протокола &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Gemini&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Написан на языке PHP 8, в качестве основы использует: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/gemini-php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/gemini-php&quot; rel=&quot;ugc nofollow noopener&quot;&gt;gemini-php&lt;/a&gt; - для конвертации базы данных и безопасной работы с файловой системой&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/titan-II&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/titan-II&quot; rel=&quot;ugc nofollow noopener&quot;&gt;titan-II&lt;/a&gt; - форк сервера с поддержкой IPv6&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/cache-php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/cache-php&quot; rel=&quot;ugc nofollow noopener&quot;&gt;cache-php&lt;/a&gt; - оболочка для кеширования скомпилированных страниц посредством Memcached&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/manticoresoftware&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/manticoresoftware&quot; rel=&quot;ugc nofollow noopener&quot;&gt;manticore&lt;/a&gt; - для полнотекстового поиска&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u03b2-Doku&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u03b2-doku&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-930&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Проект находится в процессе разработки, актуальная инструкция доступна в &lt;a href=&quot;https://github.com/YGGverse/bdoku/blob/main/README.md&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/bdoku/blob/main/README.md&quot; rel=&quot;ugc nofollow noopener&quot;&gt;README&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;931-1164&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;синхронизация&quot;&gt;Синхронизация&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ресурс «betahowto» для всех инстансов использует автоматический &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/wiki:wiki_backup&quot; class=&quot;wikilink1&quot; title=&quot;wiki:wiki_backup&quot; data-wiki-id=&quot;wiki:wiki_backup&quot;&gt;дамп&lt;/a&gt; в качестве источника.
&lt;/p&gt;

&lt;p&gt;
Также, по совместительству отправляет историю правок в репозиторий &lt;a href=&quot;http://[316:c51a:62a3:8b9::4]/YGGverse/howto-db&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;http://[316:c51a:62a3:8b9::4]/YGGverse/howto-db&quot; rel=&quot;ugc nofollow noopener&quot;&gt;howto-db&lt;/a&gt;, откуда можно также получить актуальную версию базы данных:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone http://[316:c51a:62a3:8b9::4]/YGGverse/howto-db.git&lt;/pre&gt;

&lt;p&gt;
* при использовании базы из репозитория, следует учитывать наличие директории .git в корне (в прочем, корневая директория не используется, а скрытые файлы игнорируются индексатором gemini-php)
&lt;/p&gt;

&lt;p&gt;
Обновление осуществляется скриптом по расписанию crontab, где общая директория «data» расположена в корне «howto-db» (на которую ведут символические ссылки всех хостов):
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:bdoku?codeblock=1&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_sh&quot;&gt;/home/bdoku/crontab/update.sh&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;cd /home/bdoku

wget http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/howto-wiki_$(date -d &amp;quot;$date -1 days&amp;quot; +&amp;quot;%F&amp;quot;)-23-30.tar.gz
tar -xvf howto-wiki_$(date -d &amp;quot;$date -1 days&amp;quot; +&amp;quot;%F&amp;quot;)-23-30.tar.gz -C howto-db
rm howto-wiki_$(date -d &amp;quot;$date -1 days&amp;quot; +&amp;quot;%F&amp;quot;)-23-30.tar.gz&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Обновление β-Doku:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:bdoku?codeblock=2&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_sh&quot;&gt;/home/bdoku/crontab/update.sh&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;cd /home/bdoku/bdoku

git pull
composer update&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Если администрируется контрольный репозиторий:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:bdoku?codeblock=3&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_sh&quot;&gt;/home/bdoku/crontab/update.sh&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;cd /home/bdoku/howto-db

git add .
git commit -m &amp;quot;$(date -d &amp;quot;$date -1 days&amp;quot; +&amp;quot;%F&amp;quot;)-23-30&amp;quot;
git push&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
От пользователя bdoku:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;crontab -e

0 0 * * * /home/bdoku/crontab/update.sh &amp;gt;&amp;gt; /home/bdoku/crontab/log/update-`/bin/date +\%F`.log 2&amp;gt;&amp;amp;1&lt;/pre&gt;

&lt;p&gt;
От пользователя root:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;crontab -e

5 0 * * * service betahowto restart
5 0 * * * service betahowto.ygg restart
5 0 * * * service betahowto.duckdns.org restart&lt;/pre&gt;

&lt;p&gt;
Для синхронизации важно правильно установить часовой пояс, например GMT:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;unlink /etc/localtime
ln -s /usr/share/zoneinfo/GMT /etc/localtime
date&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1165-3645&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/YGGverse/bdoku&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/bdoku&quot; rel=&quot;ugc nofollow noopener&quot;&gt;β-Doku на GitHub&lt;/a&gt;&lt;br/&gt;

&lt;a href=&quot;https://github.com/YGGverse/howtools&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/howtools&quot; rel=&quot;ugc nofollow noopener&quot;&gt;howtools&lt;/a&gt; - скрипты авто-обновлений
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3646-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 22 Oct 2025 08:13:17 +0000</pubDate>
        </item>
        <item>
            <title>Gmid</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:gmid?rev=1761120797&amp;do=diff</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;gmid&quot;&gt;Gmid&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Многофункциональный сервер для протокола &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Gemini&lt;/a&gt;, с поддержкой виртуальных хостов и реверсивного проксирования.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Gmid&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;gmid&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-244&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Кроме типичных пакетов для сборки программ с make, потребуется также:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apt install bison byacc&lt;/pre&gt;

&lt;p&gt;
Как и в большинстве случаев, удобным будет создать отдельного пользователя:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;useradd -m gmid&lt;/pre&gt;

&lt;p&gt;
Логинимся и забираем последнюю версию из репозитория (есть зеркало на GitHub) и осуществляем сборку командами:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://github.com/omar-polo/gmid.git
cd gmid
./configure
make&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;245-902&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;проксирование&quot;&gt;Проксирование&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Для сертификатов виртуальных хостов можно создать отдельные директории, там же можно расположить конфигурации.
&lt;/p&gt;

&lt;p&gt;
Можно создать общий файл конфигурации для запуска в рамках одного юнита / процесса.
&lt;/p&gt;

&lt;p&gt;
Пример проксирования общего IPv4 Clearnet на два IPv6 Yggdrasil:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:gmid?codeblock=3&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_conf&quot;&gt;/home/gmid/gmid.conf&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;server &amp;quot;betahowto.duckdns.org&amp;quot; {

	listen on 94.140.114.89 port 1965
	
	cert &amp;quot;/home/gmid/host/betahowto.duckdns.org/cert.pem&amp;quot;
	key &amp;quot;/home/gmid/host/betahowto.duckdns.org/key.rsa&amp;quot;

	proxy {
		sni &amp;quot;betahowto.duckdns.org&amp;quot;
		relay-to 301:5eb5:f061:678e::b port 1965
		verifyname off
	}
}

server &amp;quot;kevachat.duckdns.org&amp;quot; {

	listen on 94.140.114.89 port 1965
	
	cert &amp;quot;/home/gmid/host/kevachat.duckdns.org/cert.pem&amp;quot;
	key &amp;quot;/home/gmid/host/kevachat.duckdns.org/key.rsa&amp;quot;

	proxy {
		sni &amp;quot;kevachat.duckdns.org&amp;quot;
		relay-to 201:23b4:991a:634d:8359:4521:5576:15b7 port 1965
		verifyname off
	}
}&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
Юнит в этом случае будет таким:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:gmid?codeblock=4&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_service&quot;&gt;/etc/systemd/system/gmid.service&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;[Unit]
Description=gmid
After=network.target

[Service]
Type=simple
User=gmid
Group=gmid
WorkingDirectory=/home/gmid/
ExecStart=/home/gmid/gmid/gmid -c /home/gmid/gmid.conf -f -v
StandardOutput=file:/home/gmid/output.log
StandardError=file:/home/gmid/debug.log
Restart=on-failure

[Install]
WantedBy=multi-user.target&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -f указывает на «foreground», иначе процесс будет стартовать в фоновом режиме&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; -v verbose, отладка&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Проверить работу сервера можно выполнив от пользователя gmid:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;netstat -tulpn | grep LISTEN&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;903-2769&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://gmid.omarpolo.com/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://gmid.omarpolo.com/&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Домашняя страница&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2770-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 22 Oct 2025 08:13:17 +0000</pubDate>
        </item>
        <item>
            <title>Nex (протокол)</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:nex_protocol?rev=1776003563&amp;do=diff</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;nex_протокол&quot;&gt;Nex (протокол)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Минималистичный сетевой протокол семейства &lt;a href=&quot;https://ru.wikipedia.org/wiki/Gopher&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://ru.wikipedia.org/wiki/Gopher&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Gopher&lt;/a&gt; / &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Gemini&lt;/a&gt; для обмена преимущественно текстовыми файлами. 
&lt;/p&gt;

&lt;p&gt;
От последнего отличается отсутствием:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; внешних и внутренних редиректов&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol#коды_статусов&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;статус-кодов&lt;/a&gt; и других заголовков - MIME тип документа определяется расширением файла (по-умолчанию text/plain)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; разметки, за исключением кликабельных ссылок, в формате =&amp;gt; url/uri [alt]&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; обязательной сертификации TLS, следовательно - привязки к домену посредством CN/SNI, что выгодно при использовании классической адресации 0200::/7 в Yggdrasil, где передаваемый трафик уже зашифрован а &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; - зачастую не используется&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nex (\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nex_\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1198&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;спецификация&quot;&gt;Спецификация&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1199-1236&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;nex&quot;&gt;NEX&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервер принимает подключения посредством &lt;abbr title=&quot;Transport Control Protocol&quot;&gt;TCP&lt;/abbr&gt; на порту 1900 и в зависимости от наличия слеша в конце пути запроса, возвращает либо директорию либо текстовый или бинарный файл.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Пример запроса:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;telnet nightfall.city 1900
nex&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;Подробнее:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
nex://nightfall.city/nex/info/specification.txt
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NEX&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nex&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1237-1727&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;nps&quot;&gt;NPS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Протокол отправки данных по типу Titan для Gemini, по-умолчанию используется порт 1915.
&lt;/p&gt;

&lt;p&gt;
Целостность отправляемого пакета обеспечивается точкой в последней строке сообщения, после чего пакет считается отправленным и соединение с сервером прекращается.&lt;br/&gt;

Формат взаимодействия с сервером может отличаться, обычно документация прилагается отдельно взятым ресурсом, но в целом принцип следующий
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Пример запроса:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;nc nightfall.city 1915
classifieds
YOUR MESSAGE GOES HERE
.&lt;/pre&gt;

&lt;p&gt;
где строки:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; установка соединения посредством синтаксиса netcat&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; целевой ресурс на сервере - в данном случае, аргумент указывает &lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt; classifieds&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; тело сообщения, можно указать несколько строк&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; единственная точка в новой строке - завершает отправку, в содержимое сообщения данным сервером не добавляется&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Текст из файла
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:nex_protocol?codeblock=2&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_txt&quot;&gt;file.txt&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;classifieds
╦ ╦╔═╗╔═╗╔╦╗╦═╗╔═╗╔═╗╦╦  
╚╦╝║ ╦║ ╦ ║║╠╦╝╠═╣╚═╗║║  
 ╩ ╚═╝╚═╝═╩╝╩╚═╩ ╩╚═╝╩╩═╝
.&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;pre class=&quot;code&quot;&gt;cat file.txt | nc nightfall.city 1915&lt;/pre&gt;

&lt;p&gt;
Посмотреть отправленное сообщение можно по адресу:
&lt;/p&gt;

&lt;p&gt;
nex://nightfall.city/classifieds/
&lt;/p&gt;

&lt;p&gt;
Также появился внутрисетевой сервер отправки сообщений &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/social_media:kevachat&quot; class=&quot;wikilink1&quot; title=&quot;social_media:kevachat&quot; data-wiki-id=&quot;social_media:kevachat&quot;&gt;KevaChat&lt;/a&gt;, работает подобным образом:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;nc 201:23b4:991a:634d:8359:4521:5576:15b7 1915&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В некоторых дистрибутивах для поддержки IPv6 в nc может потребоваться установка пакета netcat-openbsd&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; IPv6 также поддерживается утилитами telnet и ncat (вместо &lt;a href=&quot;https://netcat.sourceforge.net&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://netcat.sourceforge.net&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nc&lt;/a&gt;), ncat лучше работает с кириллицей&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для работы с кириллицей в терминале (на что собственно и ориентирован протокол), важно также убедиться в наличии поддержки окружением кодировки ввода UTF-8 (установить можно командой stty iutf8 в ~/.bashrc)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;strong&gt;Спецификация:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
nex://nightfall.city/nps/info/specification.txt
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NPS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nps&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1728-4680&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;программное_обеспечение&quot;&gt;Программное обеспечение&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435_\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4681-4739&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;клиент&quot;&gt;Клиент&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043b\u0438\u0435\u043d\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043b\u0438\u0435\u043d\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4740-4763&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit7&quot; id=&quot;gui&quot;&gt;GUI&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/skyjake/lagrange&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/skyjake/lagrange&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Lagrange&lt;/a&gt; (C) - браузер для различных smallnet протоколов, включая nex&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;GUI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;gui&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;4764-4927&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit8&quot; id=&quot;cli&quot;&gt;CLI&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://git.sr.ht/~hedy/gelim&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://git.sr.ht/~hedy/gelim&quot; rel=&quot;ugc nofollow noopener&quot;&gt;gelim&lt;/a&gt; (Go)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://git.32bit.cafe/yequari/pynex&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://git.32bit.cafe/yequari/pynex&quot; rel=&quot;ugc nofollow noopener&quot;&gt;pynex&lt;/a&gt; (Python)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CLI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;4928-5050&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;сервер&quot;&gt;Сервер&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://hg.sr.ht/~m15o/nexd&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://hg.sr.ht/~m15o/nexd&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nexd&lt;/a&gt; - очень простой сервер на Go для публикации статики на 1900 порту, по-умолчанию открывает файлы с названием «&lt;a href=&quot;https://hg.sr.ht/~m15o/nex-pfm/browse/handler.go?rev=tip#L93&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://hg.sr.ht/~m15o/nex-pfm/browse/handler.go?rev=tip#L93&quot; rel=&quot;ugc nofollow noopener&quot;&gt;index&lt;/a&gt;» (репозиторий mercurial)&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/nexd&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/nexd&quot; rel=&quot;ugc nofollow noopener&quot;&gt;форк сервера nexd&lt;/a&gt; - включает пакет &lt;a href=&quot;https://hg.sr.ht/~m15o/nex-pfm&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://hg.sr.ht/~m15o/nex-pfm&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nex-pfm&lt;/a&gt; и модифицированный для Linux / amd64 makefile&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/next&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/next&quot; rel=&quot;ugc nofollow noopener&quot;&gt;next&lt;/a&gt; - сервер на PHP с множеством настроек&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://hg.sr.ht/~m15o/kinex&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://hg.sr.ht/~m15o/kinex&quot; rel=&quot;ugc nofollow noopener&quot;&gt;kinex&lt;/a&gt; - проксирующий сервер на Go для публикации статики на 8080 порту, также добавляет разметку &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/Nexy&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/Nexy&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nexy&lt;/a&gt; (Rust) - сервер для публикации статики с гибкими настройками и расширенной поддержкой кириллицы в названиях файлов (v0.6+)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0435\u0440\u0432\u0435\u0440&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0432\u0435\u0440&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;5051-6205&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit10&quot; id=&quot;библиотеки&quot;&gt;Библиотеки&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/YGGverse/nex-php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/nex-php&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nex-php&lt;/a&gt;, &lt;a href=&quot;https://github.com/YGGverse/nps-php&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/YGGverse/nps-php&quot; rel=&quot;ugc nofollow noopener&quot;&gt;nps-php&lt;/a&gt; - PHP 8 / Composer библиотеки для разработки веб-приложений&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/ratchetphp/Ratchet&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://github.com/ratchetphp/Ratchet&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Ratchet&lt;/a&gt; - универсальная библиотека PHP 8 / Composer для разработки асинхронных серверов&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;6206-6624&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;проксирование&quot;&gt;Проксирование&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В виду простоты протокола, передаваемые данные легко проксируются любым сервером, поддерживающим маршрутизацию потоков &lt;abbr title=&quot;Transport Control Protocol&quot;&gt;TCP&lt;/abbr&gt;, например &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:nginx_proxying#tcp&quot; class=&quot;wikilink1&quot; title=&quot;yggdrasil:nginx_proxying&quot; data-wiki-id=&quot;yggdrasil:nginx_proxying&quot;&gt;Nginx&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;6625-6952&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;внутрисетевые_ресурсы&quot;&gt;Внутрисетевые ресурсы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; nex://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]/ - сервер YGGverse&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u043d\u0443\u0442\u0440\u0438\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u043d\u0443\u0442\u0440\u0438\u0441\u0435\u0442\u0435\u0432\u044b\u0435_\u0440\u0435\u0441\u0443\u0440\u0441\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;6953-7088&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit13&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://nightfall.city&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://nightfall.city&quot; rel=&quot;ugc nofollow noopener&quot;&gt;https://nightfall.city&lt;/a&gt; (nex://nightfall.city) - домашняя страница - документация, полезные ссылки и ресурсы сообщества&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://hg.sr.ht/~m15o/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://hg.sr.ht/~m15o/&quot; rel=&quot;ugc nofollow noopener&quot;&gt;https://hg.sr.ht/~m15o/&lt;/a&gt; - тематические проекты с открытым кодом&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://blog.ikuamike.io/posts/2021/netcat/&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://blog.ikuamike.io/posts/2021/netcat/&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Справочный материал по вариантам netcat (en)&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol#сравнение&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Сравнение протоколов gemini, spartan, scroll, nex&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;7089-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 12 Apr 2026 14:19:23 +0000</pubDate>
        </item>
        <item>
            <title>Twins</title>
            <link>http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:twins?rev=1761120797&amp;do=diff</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;twins&quot;&gt;Twins&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_start&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;&lt;div class=&quot;wrap_round wrap_important plugin_wrap&quot; style=&quot;width: 60%;&quot;&gt;
&lt;p&gt;
При использовании в качестве прокси, данный сервер «срезает» часть контента (&lt;a href=&quot;https://code.rocket9labs.com/tslocum/twins/issues/18&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://code.rocket9labs.com/tslocum/twins/issues/18&quot; rel=&quot;ugc nofollow noopener&quot;&gt;#18&lt;/a&gt;)
&lt;/p&gt;

&lt;p&gt;
Решение не найдено, если требуется реверсивное проксирование, то лучше сразу использовать сервер &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol:gmid&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol:gmid&quot; data-wiki-id=&quot;gemini_protocol:gmid&quot;&gt;gmid&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;plugin_wrap_end&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;0-&amp;quot;} --&gt;
&lt;p&gt;
Многозадачный сервер для протокола &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/gemini_protocol&quot; class=&quot;wikilink1&quot; title=&quot;gemini_protocol&quot; data-wiki-id=&quot;gemini_protocol&quot;&gt;Gemini&lt;/a&gt; с поддержкой кеширования, реверсивного проксирования и других функций. Написанный на языке Go.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Twins&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;twins&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-738&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;go install code.rocketnine.space/tslocum/twins@latest&lt;/pre&gt;

&lt;p&gt;
Пример маршрутизации общего IPv4 адреса доменов first.host.org и second.host.org на разные ресурсы Yggdrasil:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:twins?codeblock=1&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_yaml&quot;&gt;/home/twins/config.yaml&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;listen: &amp;quot;xx.xx.xx.xx:1965&amp;quot;
hosts:
  first.host.org:
    cert: /home/twins/first.host.org/cert.pem
    key: /home/twins/first.host.org/key.rsa
    paths:
      -
        path: /
        proxy: gemini-insecure://[xxx:xxxx:xxxx:xxxx::xxxx]:1965
  second.host.org:
    cert: /home/twins/second.host.org/cert.pem
    key: /home/twins/second.host.org/key.rsa
    paths:
      -
        path: /
        proxy: gemini-insecure://[xxx:xxxx:xxxx:xxxx::xxxx]:1966&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
По такому же принципу можно запустить службы на свободных локальных адресах IPv4 или использовать разный порт для каждого сервера.&lt;br/&gt;

На целевых (публичных) ресурсах Yggdrasil вместо разных портов, достаточно настроить &lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:subnet_setting&quot; class=&quot;wikilink1&quot; title=&quot;yggdrasil:subnet_setting&quot; data-wiki-id=&quot;yggdrasil:subnet_setting&quot;&gt;Адрес из подсети 300::/64&lt;/a&gt;. 
&lt;/p&gt;

&lt;p&gt;
Сертификаты в данном примере должны быть сконфигурированы на соответствующий домен, например для first.host.org:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl req -x509 -newkey rsa:4096 -keyout key.rsa -out cert.pem -days 365 -nodes -subj &amp;quot;/CN=first.host.org&amp;quot;&lt;/pre&gt;

&lt;p&gt;
* если запись для IPv6 - квадратные скобки в CN не используются
&lt;/p&gt;

&lt;p&gt;
Для запуска указываем путь к бинарному файлу twins и вторым аргументом - путь к файлу конфигурации:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;/home/twins/go/bin/twins -config /home/twins/config.yaml&lt;/pre&gt;

&lt;p&gt;
Можно создать сервис:
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/_export/code/gemini_protocol:twins?codeblock=4&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_service&quot;&gt;/etc/systemd/system/twins.service&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;file&quot;&gt;[Unit]
Description=twins
After=network.target

[Service]
Type=simple
User=twins
Group=twins
WorkingDirectory=/home/twins/
ExecStart=/home/twins/go/bin/twins -config /home/twins/config.yaml
StandardOutput=file:/home/twins/debug.log
StandardError=file:/home/twins/error.log
Restart=on-failure

[Install]
WantedBy=multi-user.target&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
А также добавить автозапуск:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;systemctl daemon-reload
systemctl enable twins
systemctl start twins&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;739-3164&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;заметки&quot;&gt;Заметки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
У сервера twins иногда бывают проблемы с кодировкой кириллических ресурсов, поэтому целевые хосты должны отдавать кодировку в заголовке:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;text/gemini; charset=utf-8&lt;/pre&gt;

&lt;p&gt;
Как указано в readme, важно также указать размер контента (size)
&lt;/p&gt;

&lt;p&gt;
Чтобы отключить проверку сертификата, можно использовать псевдо-протокол gemini-insecure://
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3165-3754&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://code.rocket9labs.com/tslocum/twins&quot; class=&quot;urlextern&quot; target=&quot;_blank&quot; title=&quot;https://code.rocket9labs.com/tslocum/twins&quot; rel=&quot;ugc nofollow noopener&quot;&gt;Домашняя страница проекта&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3755-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 22 Oct 2025 08:13:17 +0000</pubDate>
        </item>
    </channel>
</rss>
