devzone.org.ua/post/publikatsiia-kapsuly-gemini-v-i2p-na-prykladi-servera-agate.md
2025-11-01 14:28:20 +02:00

8.9 KiB
Raw Blame History

Публікація капсули Gemini в I2P на прикладі сервера Agate

Стало цікаво перевірити роботу протоколу Gemini в контексті I2P, адже вочевидь, ці технології - ніби створені одна для одної:

  1. мінімальний розмір контенту, та одно-поточні запити до сервера: що добре для швидкості відгуку та легкі для мережі I2P в цілому, адже не тягатимуть купу асинхронних скриптів, трекерів, стилів, медіа та іншого мотлоху
  2. приватно-орієнтованість: немає заголовків з рефералами, сторонніх підвантажень контенту, а отже - не потрібні костилі з ізольованими контейнерами, окремі браузери з PAC чи правила фаєрволу, що фільтруватимуть потенційні витоки з'єднань на Інтернет
  3. відсутність потреби у виділеному IP: роутер I2P може поставити собі кожен, для цього не потрібно навіть відкривати порт
  4. ідеально для соціальних децентралізованих застосунків: авторизація на базі TLS не передбачає передачу на сервер класичних для Веб e-mail, паролів та іншої потенційно чутливої інформації

Сьогодні таки зібрався і вирішив спробувати опублікувати свою капсулу (у просторі Gemini - так називається сайт) При цьому, вирішив не проксувати трафік I2P на віддалений хостинг Yesterweb, а саме задзеркалити копію ресурсу (mirror) на локальному сервері.

I2P

Тут передбачається, що вже встановлено роутер I2P. Якщо ні - перегляньте попередній матеріал або скористайтесь офіційною документацією (i2pd)

Для публікації капсули, достатньо додати наступну конфігурацію до файлу /var/lib/i2pd/tunnels.conf:

[gemini]
type = server
host = 127.0.0.1
port = 1965
keys = gemini.dat
  • gemini - умовна назва вашого профілю
  • шлях до tunnels.conf може відрізнятись, в залежності від налаштувань

Тепер потрібно перезапустити i2pd:

systemctl i2pd restart

Після цього, роутером буде згенеровано ключ тунелю - по суті, він є вашим доменом в мережі I2P (знаходиться відповідно в файлі /var/lib/i2pd/gemini.dat) тому бажано забекапити його копію у надійному місці для можливості відновлення.

Agate

Agate - це один з відомих серверів Gemini для публікації статики Gemtext, написаний мовою Rust.

Взагалі, я хотів би опублікувати дзеркало на усі мережі: I2P, Yggdrasil і Mycelium, але сервер Agate має свою специфіку роботи з SNI: чомусь, більшість розробників в очі не бачили IPv6 і таке поняття як мульти-стек. Тому забігаючи на перед - ця інструкція підходить лише для публікації одного домену в I2P; якщо ви хочете забіндитись на різні мережі, то подивіться сервер gmid (clang)

Встановлення

Інформація доступна в репозиторії проєкту, але я зібрав для себе по вже натоптаному шляху:

git clone https://github.com/mbrubeck/agate.git
cd agate
cargo build --release
sudo install target/release/agate /usr/local/bin/agate

Створімо окремого користувача з домашньою текою, від якого запускатимемо сервер і де зберігатимемо статичні файли:

useradd -m agate

Systemd

#/etc/systemd/system/agate.service

[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 --addr 127.0.0.1:1965 --hostname xxxx.b32.i2p

StandardOutput=file:///home/agate/debug.log
StandardError=file:///home/agate/error.log

[Install]
WantedBy=multi-user.target
  • xxxx.b32.i2p - ваш домен в I2P
  • /home/agate/public - тека зі статичними файлами для публікації

Запуск

Порт 1965 відкривати не потрібно, адже вхідний трафік йтиме з локального роутера i2pd.

  • systemctl start agate - запускаємо сервер
  • systemctl enable agate - додаємо в автозапуск при старті системи
  • systemctl status agate - перевіряємо роботу

Клієнт

Для доступу до ресурсів I2P, потрібен клієнт (браузер) Gemini з функціями проксування SOCKS або HTTP. Наскільки мені відомо, популярний браузер Lagrange (на момент публікації матеріалу) того не вміє. Останнім часом, активно розвивається клієнт Alhena, але там альтернативно реалізована клієнтська частина, що виходить за рамки специфікації і підвантажує inline-медіа на фоні.

Особисто я користуюсь спеціально створеним для моїх потреб GTK браузером Yoda, де реалізовано підтримку різних типів проксі а також маршрутизацію по regex і пріоритетам:

\.i2p$ http://127.0.0.1:4444
  • regex + локальний проксі відповідно
  • стандартно, сервер HTTP в i2pd працює на порту 4444
  • правило регулярного виразу актуальне для версії 0.12.2+

В інтерфейсі налаштувань це виглядає так:

Налаштування проксі I2P в Yoda

  • на прикладі видно окремий рядок налаштувань з іншого проксі (Yggstack) для адрес Yggdrasil, не звертайте на нього уваги - його вимкнено, але якщо у вас є інші активні правила, для них можна вказати пріоритет (замість 0)

Після цього, можна відкрити адресу в браузері, наприклад:

gemini://shxxkkrws2m6qowjse5jpgmu64vzupnnhxrhdzrn6fr6m7ynddbq.b32.i2p