mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 06:12:39 +00:00
initial commit
This commit is contained in:
commit
d4994cde4c
61 changed files with 7044 additions and 0 deletions
169
post/misfin-poshtovyy-satelit-geminispace.md
Normal file
169
post/misfin-poshtovyy-satelit-geminispace.md
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
# 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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue