Публікація капсули 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. Якщо ні - перегляньте попередній матеріал:
Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil
або скористайтесь офіційною документацією, наприклад 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 (https://github.com/mbrubeck/agate) - це один з відомих серверів Gemini для публікації статики Gemtext, написаний мовою Rust.
Взагалі, я хотів би опублікувати дзеркало на усі мережі: I2P, Yggdrasil і Mycelium, але сервер Agate має свою специфіку роботи з SNI: чомусь, більшість розробників в очі не бачили IPv6 і таке поняття як мульти-стек. Тому забігаючи на перед - ця інструкція підходить лише для публікації одного домену в I2P; якщо ви хочете забіндитись на різні мережі, то подивіться:
Gmid - багатофункціональний сервер для Gemini
Встановлення
Інформація доступна в репозиторії проєкту, але я зібрав для себе по вже натоптаному шляху:
git clone https://github.com/mbrubeck/agate.git cd agate cargo build --release sudo install target/release/agate /usr/local/bin/agate
Встановлення останньої версії Rust в Linux
Створімо окремого користувача з домашньою текою, від якого запускатимемо сервер і де зберігатимемо статичні файли:
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 (https://github.com/skyjake/lagrange/) (на момент публікації матеріалу) того не вміє. Останнім часом, активно розвивається клієнт Alhena (https://github.com/mochaman/alhena), але там альтернативно реалізована клієнтська частина, що виходить за рамки специфікації і підвантажує inline-медіа на фоні.
Особисто я користуюсь спеціально створеним для моїх потреб GTK браузером Yoda (https://github.com/YGGverse/Yoda), де реалізовано підтримку різних типів проксі а також маршрутизацію по regex і пріоритетам:
\.i2p$ http://127.0.0.1:4444
- regex + локальний проксі відповідно
- стандартно, сервер HTTP в i2pd працює на порту 4444
- правило регулярного виразу актуальне для версії 0.12.2+
В інтерфейсі налаштувань це виглядає так:
Налаштування проксі I2P в Yoda
- на прикладі видно окремий рядок налаштувань з іншого проксі (Yggstack) для адрес Yggdrasil, не звертайте на нього уваги - його вимкнено, але якщо у вас є інші активні правила, для них можна вказати пріоритет (замість `0`)
Після цього, можна відкрити адресу в браузері, наприклад:
Source