Розгортання сіда Radicle в мульти-мережному середовищі
Давно планував організувати автономний сервер Radicle, щоб не залежати від наявних публічних сідів. Нижче наведено приклад мого налаштування персонального (Selective) сід-вузла, орієнтованого в першу чергу на мережі Yggdrasil, Mycelium і Tor.
Radicle - це платформа децентралізованого хостингу Git, що працює на базі пірингової технології Gossip:
https://radicle.xyz/guides/protocol#gossip-protocol
У цьому випадку, роль сіда (англ. seed) подібна класичним торентам і так само полягає в поширенні вузлом завантажених на нього даних.
Окремо про клієнтське використання цього програмного забезпечення вже було описано в матеріалі:
Radicle: децентралізований P2P хостинг Git/DVCS
Підготовка системи
Спочатку, створюється системний користувач з обмеженими правами:
useradd -mr radicle
- `m` - створення домашньої теки (для зберігання даних профілю)
- `r` - системний користувач (для використання сервісом systemd)
Встановлення бінарних `rad`, `radicle-node` і `git-remote-rad` відбувається до теки глобального простору `/usr/local/bin`, куди буде надалі звертатись системний сервіс (інакше можливі проблеми з правами на запуск)
Конфігурація вузла
Якщо запуск вузла Radicle відбувався раніше, то в домашній теці користувача вже буде автоматично створено стандартний файл конфігурації. Дізнатись шлях до нього можна командою:
$ rad self --config /home/radicle/.radicle/config.json
Якщо запуск (в рамках гайду) раніше ще не здійснювався, і оскільки це серверний вузол, краще заздалегідь створити актуальну версію файлу через CLI до запуску. Для цього потрібно авторизуватись від створеного раніше користувача:
su radicle $ rad self --config ✗ Error: Radicle profile not found in '/home/radicle/.radicle'. ✗ Hint: To setup your radicle profile, run `rad auth`.
Як бачимо, файл конфігурації ще не існує і менеджер пропонує виконати команду:
rad auth
Після введення команди, відповідаємо на питання конфігуратора. Для серверного вузла - особисто я не вказую пароль, щоб потім не вказувати його в systemd змінною середовища (не бачу у цьому необхідності, адже це всього лише ресід мого віддалено-підписаного облікового запису)
Також, на цьому етапі важливо визначитись з політикою сідування (seedingPolicy)
Radicle Seeder Guide: Seeding policies
Поточну політику (якщо файл конфігурації було створено раніше) можна дізнатися командою:
rad config get node.seedingPolicy
Нижче розглянемо дві базові.
Дозвільна політика (Permissive policy)
Лояльний режим роботи вузла. Він автоматично приймає будь-які поширення з інших вузлів, тим само найкраще підтримує глобальну мережу Radicle. Утім, такий спосіб вимагає чимало дискового простору і може тягнути за собою не бажані наслідки, зокрема юридичного характеру: адже будь-хто зможе розмістити на вашому сервері будь що.
Обираючи цей тип, політика встановлюється наступним чином:
"node": {
"seedingPolicy": {
"default": "allow",
"scope": "all"
}
}
При виявленні не бажаного вмісту, заблокувати окремий вузол можна командою:
rad block rad:z9DV738hJpCa6aQXqvQC4SjaZvsi
Вибіркова політика (Selective policy)
Дана конфігурація вузла (що також є стандартною) вимагатиме від його адміністратора обліку "білого списку" клієнтських вузлів, від яких надходитимуть запити на сідування їх репозиторіїв. Прикладом такого вузла є `seed.radicle.xyz`, куди на відміну від `seed.radicle.xyz` та `iris.radicle.xyz` - ніхто не зможе надіслати свої дані.
Цей тип є оптимальним для організацій та приватних осіб, які бажають забезпечити хорошу конективність для своїх репозиторіїв (наприклад, не маючи достатньо ресурсів сервера для підтримки усієї мережі в форматі Permissive) та/або не бути залежними від онлайну інших учасників мережі.
Кейс `seedingPolicy` у цьому випадку, матиме наступний вигляд:
"node": {
"seedingPolicy": {
"default": "block"
}
}
Тим не менше, якщо ви помітили цікавий проєкт, що не входить до "білого списку" додати виключення можна командою:
rad seed rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
І навпаки, видалити зі списку зберігання і роздач:
rad unseed rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Приклад мого файлу конфігурації
Після ініціації засобами CLI, можна продовжити керування цією ж утилітою (див. `rad --help`) але мені простіше буде відкрити файл конфігурації та відтюнити в ньому деякі моменти вручну, зокрема:
"node": {
"alias": "YGGverse",
"listen": [
"[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8776",
"[505:6847:c778:61a1:5c6d:e802:d291:8191]:8776"
],
"externalAddresses": [
"[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8776", "ygg.ua.srv:8776",
"[505:6847:c778:61a1:5c6d:e802:d291:8191]:8776", "myc.ua.srv:8776"
],
"seedingPolicy": {
"default": "block"
}
}
- як бачимо, я "роздаю" на мережі Yggdrasil та Mycelium, а також використовую вибіркову політику "Selective", адже мій вузол має обмежені ресурси та певні юридичні вимоги
Оскільки вхід на вузол орієнтований в першу чергу на оверлейні мережі а також має виключно такий інтерфейс, додав до списку один відомий мені сід Yggdrasil:
"preferredSeeds": [
"z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@irisradizskwweumpydlj4oammoshkxxjur3ztcmo7cou5emc6s5lfid.onion:8776",
"z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@rosarad5bxgdlgjnzzjygnsxrwxmoaj4vn7xinlstwglxvyt64jlnhyd.onion:8776",
"z6MkocYY4dgMjo2YeUEwQ4BP4AotL7MyovzJCPiEuzkjg127@[202:f094:502b:1b03:9e0:2c3d:bc8b:428b]:8776"
]
- роутер Tor у мене працює також через Yggdrasil, тому я не дуже залежу від сідів саме цієї мережі, але додав на випадок, якщо сіди Tor будуть не доступні (і навпаки)
Перевірити актуальні сіди Yggdrasil
Таким чином, сід Yggdrasil буде підключено через наявний IPv6 інтерфейс "напряму". Для підтримки вказаних вище сідів мережі Tor - потрібно окремо вказати налаштування відповідного проксі:
"node": {
"onion": {
"mode": "proxy",
"address": "[::1]:9150"
}
}
- стандартний порт `9050` замінено на `9150` (сучасна імплементація Arti на Rust)
- на моєму сервері для роутера Tor використовується локалхост IPv6, для IPv4 - це буде хост `127.0.0.1` (за умови локального розташування роутера)
Про мій сетап Arti, детальніше написано тут:
Встановлення Onion-роутера Arti з підключенням до мережі Tor через Yggdrasil
Щодо налаштування вхідного трафіку (hidden service) від пірів з мережі Tor, можна почитати окремо:
Radicle User Guide: Setting up a Tor Onion Service for Radicle
В мене ще крутиться роутер I2P, але цю тему я поки не копав, бо вузлів вище - цілком вистачає для синхронізації з глобальною мережею. Але додам деякі посилання по темі на майбутнє:
Add docs for I2P use in addition to Tor
Офіційний гайд стосовно гібридної конфігурації мереж:
Radicle User Guide: Configuring Radicle in Mixed Mode
Фаєрвол
Якщо у вас використовується виключно Tor або I2P - відкривати порти не потрібно!
В інших випадках (на базі оверлеїв класичного стеку) дивимось потрібні нам IP інтерфейсів:
ifconfig
Після чого додаємо записи `iptables`, особисто я надаю перевагу `ufw`:
ufw allow from 0200::/7 to 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port 8776 proto TCP comment 'radicle' ufw allow from 0400::/7 to 505:6847:c778:61a1:5c6d:e802:d291:8191 port 8776 proto TCP comment 'radicle'
- мій сервер працюватиме тільки на дві мережі: Mycelium та Yggdrasil; у вас це може бути й Інтернет IP, або ж "лояльне" правило типу `ufw allow 8776`
Radicle Seeder Guide: Firewalls
Запуск вузла
Для запуску і контролю процесом, використовується сервіс systemd, для цього створімо новий юніт:
[Unit] Description=Radicle Node After=network.target network-online.target Requires=network-online.target [Service] # використовується IPv6, оскільки я пускаю вузол в мережах Mycelium та Yggdrasil ExecStart=/usr/local/bin/radicle-node --listen [::]:8776 --force KillMode=process Restart=always RestartSec=3 # Базові параметри жорсткого підсилення. # Для докладнішої інформації див. `systemd-analyze security` PrivateTmp=true ProtectSystem=strict NoNewPrivileges=true MemoryDenyWriteExecute=true # Якщо ваш ключ Radicle захищено фразою-паролем, # потрібно встановити змінну середовища `RAD_PASSPHRASE` зі значенням фрази-пароля, # вказаної під час `rad auth` #Environment=RAD_PASSPHRASE=snickerdoodle # Запуск від створеного раніше користувача User=radicle Group=radicle # Журнали, опціонально: # * розмістити в `/var/log` попередньо створивши теку та надавши відповідні дозволи # * закоментувати або вказати як `null` StandardOutput=file:///home/radicle/debug.log StandardError=file:///home/radicle/error.log [Install] WantedBy=multi-user.target
Приклад systemd в офіційному репозиторії
Керування системним сервісом
Автоматично запускати вузол Radicle при старті системи:
systemctl enable radicle
Запуск (або перезапуск) якщо служба активна:
systemctl restart radicle
Перевірка статусу:
systemctl status radicle
При змінах конфігурації системного сервісу, перед запуском, потрібно застосувати зміни:
systemctl daemon-reload
Резервні копії
Для "повного бекапу" достатньо створити архів з підтримкою прав файлової системи `.tar.gz` для теки `/home/radicle/.radicle`. Але якщо ви не хочете тягати туди-сюди великі об'єми даних (що й так поширені між іншими вузлами) рекомендую здійснити резервні копії саме ключів, які знаходяться у теці `/home/radicle/.radicle/keys`.
Публікація
Подібно оверлейним мережам, якщо ваш вузол Radicle підключено щонайменше до одного сіда - його рано чи пізно зможуть побачити інші учасники пірингової мережі. Переконатись у цьому можна виконавши команду на стороні клієнтського піра:
rad sync status
Утім, якщо треба опублікувати реквізити вузла у різних каталогах, або потрібно пріоритезувати синхронізацію змін саме до нашого сіду під час виконання `git push`, тоді на клієнтській машині додається рядок з параметрами так званого "preferred" підключення у форматі `DID@IP:PORT`. Якщо хост і порт ми вказували під час оголошення мережного інтерфейсу, то тримати `DID` можна командою:
$ rad self Alias YGGverse DID did:key:z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU ...
- де `z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU` - без префіксу `did:key:`
Отже, на клієнтському вузлі додаю два нові рядки з реквізитами нашого сід-вузла (який згідно конфігурації слухає з'єднання на `[::]:8776`)
"preferredSeeds": [
"z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU@202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148:8776",
"z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU@505:6847:c778:61a1:5c6d:e802:d291:8191:8776"
]
- зверніть увагу: я не вказую типові квадратні дужки для хосту IPv6
Якщо є налаштовані приховані сервіси Tor або тунелі I2P, вони додаються по аналогії.
Посилання
Дивіться також
Розгортання Веб-інфраструктури Radicle на прикладі оверлейних мереж
/uk/