gemlog/public/uk/i2p-capsule-in-gemini-space-with-agate.gmi
2025-10-10 01:23:24 +03:00

130 lines
No EOL
8.5 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Публікація капсули 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