devzone.org.ua/post/misfin-poshtovyy-satelit-geminispace.md
2025-11-01 14:28:20 +02:00

169 lines
No EOL
15 KiB
Markdown
Raw Permalink 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.

# Misfin - поштовий сателіт Geminispace
Про Misfin я знаю давно, декілька разів намагався ним користуватись, але жодного - не доводилось перевірити його в реальних умовах. Зокрема, через брак аудиторії та відсутність такої необхідності в сучасному світі месенджерів, де й сама пошта є епохою динозаврів. Утім, хотілось би трішки освітити цю альтернативну технологію для широкого загалу, адже з протоколом [Gemini](https://devzone.org.ua/post/protokol-gemini-iak-alternatyva-http) - знайомий не заочно і вже встиг написати для його специфікації, у свій час, повнофункціональний GTK браузер [Yoda](https://github.com/YGGverse/Yoda) а також ряд [інших серверних рішень](https://github.com/orgs/YGGverse/repositories?q=gemini) різними мовами.
Протокол доставки повідомлень Misfin - названо на честь космічного проєкту [MSFN](https://en.wikipedia.org/wiki/Manned_Space_Flight_Network) і в цілому, він є спробою реалізації мінімалістичної альтернативи класичній пошті e-mail, за образом і подобою концепції протоколу Gemini.
З офіційного маніфесту:
> Електронна пошта така ж погана, як і Інтернет. Вона стала складною, захищеною лише за допомогою інших протоколів, які до неї приєднані, і підтримує всі неприємні функції, які є в Інтернеті, такі як Cookies та трекінгові маячки. Ще гірше, що вона зазнає активної ворожості з боку великих гравців Інтернету. Більшість провайдерів блокують трафік на порту 25, і ви не можете доставити пошту до жодного з великих сервісів (як-от Gmail), не проходячи через численні перешкоди - і навіть тоді це лотерея.
Від себе зауважу, що вбачаю в ньому не стільки боротьбу з корпораціями та монополією, але опцію отримувати чистий вміст листів: без розмітки та зайвих заголовків, що можуть бути частиною трекінгу, характерних для сучасного Веб 2.0 та вище. Якщо ж у вас є проблеми з 25 портом чи бажаєте розгорнути повноцінну локальну пошту за NAT, ознайомтесь з наступними матеріалами:
* [Організація поштової скриньки e-mail для локальних мереж без DNS](https://devzone.org.ua/post/orhanizatsiia-poshtovoyi-skrynky-e-mail-dlia-lokalnykh-merez-bez-dns)
* [Yggmail - месенджер з поштовим інтерфейсом](https://devzone.org.ua/post/yggmail-mesendzer-z-poshtovym-interfeysom)
## Реалізація
На мою думку, Misfin не є альтернативною класичній пошті, це швидше модифікація протоколу відправки даних Titan для Gemini або NPS для [Nex](https://devzone.org.ua/post/protokol-nex-lehka-alternatyva-gemini), але на відміну від таких, не є частиною інфраструктури жодного з них.
Схоже до Titan, Misfin використовує сервер, який працює на сокеті з виділеним портом (стандартно `1958`) і отримує на нього дані через обов'язковий шар шифрування TLS. Окрім тексту повідомлень, дані містять мінімалістичні заголовки (які на відміну від Titan, орієнтовані не на файл, а текст) і включають:
* `USER_ID` - поштова скринька користувача (`admin`, `santa` і тд.)
* `COMMON_NAME` - псевдонім користувача
* `SUBJECT_ALT_NAME` - хост (`example.com`, `misfin.org`, тощо)
Сирий рядок запиту виглядатиме як:
```
misfin://mailbox@hostname.com \r\n
Текст повідомлення
```
Відповідь сервера-отримувача при цьому буде такою:
```
20 <fingerprint of the recipient>\r\n
```
Хто вже працював з Gemini, може побачити, що ці протоколи - між собою схожі, як дві краплі води. Більш детально вдаватись в специфікацію тут не буду, вона описана на офіційному сайті (посилання внизу сторінки). Занотую тільки, що наразі існує три базові редакції протоколу:
* `A` - сама перша, рання офіційна редакція (наразі вважається архівною)
* `B` - друга офіційна редакція протоколу, що включає корекції `A`
* `C` - після релізу версії `B` його автор (Лем) на деякий час пропав з радарів, тому декілька користувачів не дочекавшись випустили версію `C`, яка збільшує довжину повідомлення та включає деякі оптимізації, що стосуються формату заголовків
Наскільки мені відомо, автор редакцій `A` і `B` згодом вийшов на зв'язок та збирався включити редакцію `C` в офіційну специфікацію, але потім зник. Формально, протоколи `B` і `C` є сумісними, а новий софт пишеться з урахуванням специфікації останнього. Тому майте на увазі цю невеличку історію. Більше про неї вам розкаже один з учасників цього процесу - [@clseibold](gemini://bbs.geminispace.org/u/clseibold).
## Програмне забезпечення
Для доставки пошти, передбачається класична пара клієнт-сервер, при цьому для сервера відкривається вказаний в його налаштуваннях порт TCP:
``` bash
ufw allow 1958/tcp
```
### Сервер
Є різні реалізації, але мені відомо про щонайменше дві стабільні:
* [estampa](https://sr.ht/~nixgoat/estampa/) - Rust
* [misfin-server](https://gitlab.com/clseibold/misfin-server) - Go
#### estampa
Так як сам розробляю програмне забезпечення на Rust, для себе обрав `estampa`. Встановлюється цей сервер наступним чином:
``` bash
git clone https://git.sr.ht/~nixgoat/estampa
cd estampa
cargo build --release
install target/release/estampa /usr/local/bin/estampa
```
* останньою командою ми встановлюємо `estampa` до канонічного розташування бінарних програм Linux, для подальшої роботи сервера з `systemd`; якщо ви не плануєте встановлення, цей крок можна пропустити і пускатись через звернення до `target/release/estampa`
* для першої збірки програм на Rust, дивіться [Встановлення останньої версії Rust в Linux](https://devzone.org.ua/post/vstanovlennia-ostannyoyi-versiyi-rust-v-linux)
У поточній теці проєкту, відкриваємо файл конфігурації `nano config.toml` та додаємо в кінці поштові скриньки користувачів:
``` config.toml
[mailbox.user1]
enabled = true
name = "user 1"
[mailbox.user2]
enabled = true
name = "user 2"
```
Опціонально, можна вказати й інші налаштування (якщо плануєте запуск від `systemd`) але я лишив стандартно. Далі, сервер запускається командою:
``` bash
estampa
```
При першому запуску, у поточній теці буде згенеровано сертифікат сервера TLS (такий само як для сервера Gemini) - `server.crt` і `server.key`, у цій же теці буде створено файлову структуру для збереження листів, за адресою в прикладі це буде:
```
store/
certs/
user1.pem
user2.pem
priv/
user1.pem
user2.pem
mbox/
user1/
user2/
```
* таким чином, при отриманні листів, вони будуть зберігатись у теці `store/mbox/user/*.gmi`
##### systemd
Публічний сервер можна (і варто) запускати від окремого користувача `useradd -m estampa`:
```
# /etc/systemd/system/estampa.service
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=estampa
Group=estampa
# Якщо в конфігурації вказано відносні шляхи до сховища та сертифікатів,
# важливо вказати шлях до робочої теки:
# WorkingDirectory=/path/to/working/directory
ExecStart=/usr/local/bin/estampa
# Вкажіть null якщо не бажаєте журналювати роботу сервера
StandardOutput=file:/home/estampa/debug.log
StandardError=file:/home/estampa/error.log
[Install]
WantedBy=multi-user.target
```
* `systemctl daemon-reload` - оновити конфігурацію
* `systemctl enable estampa` - автостарт при запуску системи
* `systemctl start estampa` - запуск
* `systemctl status estampa` - перевірити статус
### Клієнт
Наразі, я не знайшов готового рішення для десктоп чи мобільних платформ, як це можна було б очікувати від класичного поштового клієнта. Натомість, листи що надходять - складаються в файлову систему, з розширенням `.gmi` (Gemtext) і читаються вручну. Можливо, колись таки зроблю повноцінний GUI клієнт зі сповіщеннями і .. блек джеком, а наразі - маємо наступні опції:
#### Lagrange
Найпростіший спосіб відправити листа - зробити це через GUI браузер [Lagrange](https://gmi.skyjake.fi/lagrange/) (адже з вірогідністю 99% ви будете користуватись саме ним).
Для цього потрібно відкрити в основному меню `Identity` > `Import` та додати сертифікат (я просто зкопіював туди згенерований сертифікат одного з юзерів `store/certs`). Після цього, в боковому меню `Identities` (`Ctrl`+`4`) на імпортованому сертифікаті правою кнопкою миші відкриваємо контекстне меню та шукаємо пункт `Send mail as...`, пишемо адресу отримувача, повідомлення та тиснемо кнопку `Send`.
#### CLI
У якості клієнта, можна використовувати командний рядок, засобами утиліт, які розраховані на відправлення даних через сокет з шаром SSL:
``` bash
echo -e "misfin://test@localhost < test@localhost2 Test \r\nMESSAGE" | openssl s_client -connect localhost:1958 -cert /path/to/cert.pem -key /path/to/key.pem -ign_eof
```
* вказуючи `< test@localhost2` ми додаємо відправника і підписуємо його `/path/to/cert.pem` і `/path/to/key.pem` з набору згенерованих скриньок, що вказані в прикладі `estampa`, тобто лежать вони в `store/certs/*` (запуск окремого сервера `localhost2` не потрібен)
* згідно [специфікації](gemini://misfin.org/specification.gmi), тут важливо зберегти пробіл перед `\r\n` інакше буде помилка `59`
* нагадаю, що для сумісності з редакцією `B`, максимальна довжина повідомлення разом із заголовком, повинна складати не більше `2048` байт
* при успішному відправленні, як і у випадку з Gemini, має бути код `20` (успішно)
## Висновки
Як писав вище, я не вважаю даний експеримент заміною e-mail, адже той пройшов довгий шлях еволюції і став таким в умовах промислової реальності. Misfin, може стати хіба що базою для альтернативного обміну повідомленнями в локальних мережах або для спілкування з друзями-гіками, особливо, якщо ви - користувач CLI (хоча й тут, мабуть я обрав би комунікацію сокетами через `telnet` або IRC).
Тут також немає відповіді на питання щодо боротьби з потенційним спамом, але як вказано на офіційному сайті, в Geminispace це явище майже відсутнє через малу популярність протоколів сімейства Gopher.
## Посилання
Надаю список локальних ресурсів, адже веб-дзеркала для них не знаю. Відкрити ці посилання можна у будь якому [браузері для протоколу Gemini](https://github.com/kr1sp1n/awesome-gemini#clients). Посилання також мають відкриватись, якщо відповідний браузер вже встановлено.
* [Офіційний сайт](gemini://misfin.org/)
* [Група Misfin на BBS](gemini://bbs.geminispace.org/s/misfin)