mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 22:12:39 +00:00
115 lines
No EOL
8.9 KiB
Markdown
115 lines
No EOL
8.9 KiB
Markdown
# Публікація капсули Gemini в I2P на прикладі сервера Agate
|
||
|
||
Стало цікаво перевірити роботу [протоколу Gemini](https://devzone.org.ua/post/protokol-gemini-iak-alternatyva-http) в контексті I2P, адже вочевидь, ці технології - ніби створені одна для одної:
|
||
|
||
1. мінімальний розмір контенту, та одно-поточні запити до сервера: що добре для швидкості відгуку та легкі для мережі I2P в цілому, адже не тягатимуть купу асинхронних скриптів, трекерів, стилів, медіа та іншого мотлоху
|
||
2. приватно-орієнтованість: немає заголовків з рефералами, сторонніх підвантажень контенту, а отже - не потрібні костилі з [ізольованими контейнерами](https://devzone.org.ua/post/izoliatsiia-linux-vid-priamykh-internet-zyednan-na-bazi-qemu-virtual-machine-manager-i-vsock), [окремі браузери з PAC](https://devzone.org.ua/post/bezpechnyy-perehliad-saytiv-yggdrasil-z-yggstack) чи [правила фаєрволу](https://devzone.org.ua/post/obmezennia-vykhidnykh-zyednan-na-internet-z-ufw), що фільтруватимуть потенційні витоки з'єднань на Інтернет
|
||
3. відсутність потреби у виділеному IP: роутер I2P може поставити собі кожен, для цього не потрібно навіть відкривати порт
|
||
4. ідеально для соціальних децентралізованих застосунків: [авторизація на базі TLS](https://geminiprotocol.net/docs/protocol-specification.gmi#client-certificates) не передбачає передачу на сервер класичних для Веб e-mail, паролів та іншої потенційно чутливої інформації
|
||
|
||
Сьогодні таки зібрався і вирішив спробувати опублікувати [свою капсулу](gemini://ps.cities.yesterweb.org) (у просторі Gemini - так називається сайт) При цьому, вирішив не проксувати трафік I2P на віддалений хостинг [Yesterweb](https://yesterweb.org/community/gemini/), а саме задзеркалити копію ресурсу (mirror) на локальному сервері.
|
||
|
||
## I2P
|
||
|
||
Тут передбачається, що вже встановлено роутер I2P. Якщо ні - перегляньте [попередній матеріал](https://devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil) або скористайтесь [офіційною документацією](https://i2pd.readthedocs.io/en/latest/) (i2pd)
|
||
|
||
Для публікації капсули, достатньо додати наступну конфігурацію до файлу `/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) - це [один з відомих](https://github.com/kr1sp1n/awesome-gemini) серверів Gemini для публікації статики Gemtext, написаний мовою Rust.
|
||
|
||
*Взагалі, я хотів би опублікувати дзеркало на усі мережі: I2P, [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom) і Mycelium, але сервер Agate має свою специфіку роботи з SNI: чомусь, більшість розробників в очі не бачили IPv6 і таке поняття як мульти-стек. Тому забігаючи на перед - ця інструкція підходить лише для публікації одного домену в I2P; якщо ви хочете забіндитись на різні мережі, то подивіться сервер [gmid](https://devzone.org.ua/post/gmid-bahatofunktsionalnyy-proksi-server-dlia-gemini) (clang)*
|
||
|
||
### Встановлення
|
||
|
||
Інформація доступна в репозиторії проєкту, але я зібрав для себе по вже натоптаному шляху:
|
||
|
||
``` bash
|
||
git clone https://github.com/mbrubeck/agate.git
|
||
cd agate
|
||
cargo build --release
|
||
sudo install target/release/agate /usr/local/bin/agate
|
||
```
|
||
* [встановлення останньої версії Rust в Linux](https://devzone.org.ua/post/vstanovlennia-ostannyoyi-versiyi-rust-v-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, потрібен клієнт (браузер) 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+
|
||
|
||
В інтерфейсі налаштувань це виглядає так:
|
||
|
||

|
||
* на прикладі видно окремий рядок налаштувань з іншого проксі ([Yggstack](https://github.com/yggdrasil-network/yggstack)) для адрес Yggdrasil, не звертайте на нього уваги - його вимкнено, але якщо у вас є інші активні правила, для них можна вказати пріоритет (замість `0`)
|
||
|
||
Після цього, можна відкрити адресу в браузері, наприклад:
|
||
|
||
[gemini://shxxkkrws2m6qowjse5jpgmu64vzupnnhxrhdzrn6fr6m7ynddbq.b32.i2p](gemini://shxxkkrws2m6qowjse5jpgmu64vzupnnhxrhdzrn6fr6m7ynddbq.b32.i2p) |