From b31935a7c9da3940ca5c720558911f9356396eb9 Mon Sep 17 00:00:00 2001 From: postscriptum Date: Thu, 9 Oct 2025 23:59:09 +0300 Subject: [PATCH] add `i2p-capsule-in-gemini-space-with-agate.gmi` --- ...i2p-capsule-in-gemini-space-with-agate.gmi | 130 ++++++++++++++++++ public/uk/index.gmi | 1 + 2 files changed, 131 insertions(+) create mode 100644 public/uk/i2p-capsule-in-gemini-space-with-agate.gmi diff --git a/public/uk/i2p-capsule-in-gemini-space-with-agate.gmi b/public/uk/i2p-capsule-in-gemini-space-with-agate.gmi new file mode 100644 index 0000000..393f05c --- /dev/null +++ b/public/uk/i2p-capsule-in-gemini-space-with-agate.gmi @@ -0,0 +1,130 @@ +# Публікація капсули Gemini в I2P на прикладі сервера Agate + +Стало цікаво перевірити роботу протоколу Gemini в контексті I2P, адже вочевидь - ці технології ніби створені одна для одної: + +* мінімальний розмір контенту, та одно-поточні запити до сервера: що добре для швидкості відгуку та легкі для мережі I2P в цілому, адже не тягатимуть купу асинхронних скриптів, трекерів, стилів, медіа та іншого мотлоху +* приватно-орієнтованість: немає заголовків з рефералами, сторонніх підвантажень контенту, а отже - не потрібні костилі з ізольованими контейнерами, окремі браузери з PAC чи правила фаєрволу, що фільтруватимуть потенційні витоки з'єднань на Інтернет +* відсутність потреби у виділеному IP: роутер I2P може поставити собі кожен, для цього не потрібно навіть відкривати порт +* ідеально для соціальних децентралізованих застосунків: авторизація на базі TLS (https://geminiprotocol.net/docs/protocol-specification.gmi#client-certificates) не передбачає передачу на сервер класичних для Веб e-mail, паролів та іншої потенційно чутливої інформації + +Сьогодні таки зібрався і вирішив спробувати опублікувати свою капсулу. При цьому, вирішив не проксувати (proxy) трафік I2P на віддалений хостинг Yesterweb, а саме задзеркалити копію ресурсу (mirror) на локальному сервері. + +## I2P + +Тут передбачається, що вже встановлено роутер I2P. Якщо ні - перегляньте попередній матеріал: +=> setup-i2pd-with-i2p-network-connection-over-yggdrasil.gmi Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil +або скористайтесь офіційною документацією, наприклад i2pd: +=> https://i2pd.readthedocs.io/en/latest/ + +Для публікації капсули, достатньо додати наступну конфігурацію до файлу `/var/lib/i2pd/tunnels.conf`: + +``` tunnels.conf +[gemini] +type = server +host = 127.0.0.1 +port = 1965 +keys = gemini.dat +``` +* `gemini` - умовна назва вашого профілю +* шлях до `tunnels.conf` може відрізнятись, в залежності від налаштувань + +Тепер потрібно перезапустити i2pd: + +``` bash +systemctl i2pd restart +``` + +Після цього, роутером буде згенеровано ключ тунелю - по суті, він є вашим доменом в мережі I2P (знаходиться відповідно в файлі `/var/lib/i2pd/gemini.dat`) тому бажано забекапити його копію у надійному місці для можливості відновлення. + +## Agate + +Agate (https://github.com/mbrubeck/agate) - це один з відомих серверів Gemini для публікації статики Gemtext, написаний мовою Rust. + +Взагалі, я хотів би опублікувати дзеркало на усі мережі: I2P, Yggdrasil і Mycelium, але сервер Agate має свою специфіку роботи з SNI: чомусь, більшість розробників в очі не бачили IPv6 і таке поняття як мульти-стек. Тому забігаючи на перед - ця інструкція підходить лише для публікації одного домену в I2P; якщо ви хочете забіндитись на різні мережі, то подивіться: +=> gmid-server-for-gemini-protocol.gmi Gmid - багатофункціональний сервер для Gemini + +### Встановлення + +Інформація доступна в репозиторії проєкту, але я зібрав для себе по вже натоптаному шляху: + +``` bash +git clone https://github.com/mbrubeck/agate.git +cd agate +cargo build --release +sudo install target/release/agate /usr/local/bin/agate +``` +=> install-latest-rust-version-on-linux.gmi Встановлення останньої версії Rust в Linux + +Створімо окремого користувача з домашньою текою, від якого запускатимемо сервер і де зберігатимемо статичні файли: + +``` bash +useradd -m agate +``` + +### Systemd + +``` /etc/systemd/system/agate.service +#/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. + +### Lagrange + +Якщо ви користуєтесь браузером Lagrange (https://github.com/skyjake/lagrange), налаштування проксі знаходяться в меню "File" > "Preferences" > "Network" > "Proxies" при цьому, підтримується тільки SOCKS5, тому ваш роутер в налаштуваннях повинен мати увімкнену опцію `socksproxy.enabled` + +=> i2p-capsule-in-gemini-space-with-agate/lagrange-proxy-settings.png Налаштування проксі I2P в Lagrange +* стандартно, сервер SOCKS в i2pd працює на порту 4447 + +Тут вже самі вирішуйте як розподіляти трафік між різними доменами Інтернет/I2P: на момент публікації, з коробки - такої зручності в Lagrange немає. + +### Yoda + +Для навігації простором Gemini, особисто я користуюсь браузером Yoda (https://github.com/YGGverse/Yoda), де реалізовано підтримку різних типів проксі а також маршрутизацію по regex і пріоритетам: + +``` +\.i2p$ http://127.0.0.1:4444 +``` +* regex + локальний проксі відповідно +* стандартно, сервер HTTP в i2pd працює на порту 4444 +* правило регулярного виразу актуальне для версії 0.12.2+ + +В інтерфейсі налаштувань це виглядає так: + +=> i2p-capsule-in-gemini-space-with-agate/yoda-proxy-settings-i2p.png Налаштування проксі I2P в Yoda +* на прикладі видно окремий рядок налаштувань з іншого проксі (Yggstack) для адрес Yggdrasil, не звертайте на нього уваги - його вимкнено, але якщо у вас є інші активні правила, для них можна вказати пріоритет (замість `0`) + +Після цього, можна відкрити адресу в браузері, наприклад: + +=> gemini://shxxkkrws2m6qowjse5jpgmu64vzupnnhxrhdzrn6fr6m7ynddbq.b32.i2p \ No newline at end of file diff --git a/public/uk/index.gmi b/public/uk/index.gmi index 988a914..ad022a7 100644 --- a/public/uk/index.gmi +++ b/public/uk/index.gmi @@ -9,6 +9,7 @@ ### Нотатки +=> i2p-capsule-in-gemini-space-with-agate.gmi 2025-10-09 Публікація капсули Gemini в I2P на прикладі сервера Agate => squid-out-proxy.gmi 2025-10-08 Налаштування вихідного проксі на базі squid => reticulum-meshchat-with-connection-over-yggdrasil.gmi 2025-10-07 Reticulum / MeshChat з підключенням через Yggdrasil => pyseeder-i2p-ecosystem-support-with-yggdrasil.gmi 2025-10-04 Pyseeder: підтримка екосистеми I2P в мережі Yggdrasil