From acf7ce53c81b98d1ad24816cbd55cedfa4d6d587 Mon Sep 17 00:00:00 2001 From: postscriptum Date: Thu, 12 Feb 2026 09:39:39 +0200 Subject: [PATCH] add `radicle-web-service-deployment.gmi` --- public/uk/index.gmi | 1 + .../radicle-is-decentralized-p2p-git-dvcs.gmi | 1 + .../radicle-multi-network-seed-deployment.gmi | 6 +- public/uk/radicle-web-service-deployment.gmi | 228 ++++++++++++++++++ 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 public/uk/radicle-web-service-deployment.gmi diff --git a/public/uk/index.gmi b/public/uk/index.gmi index affbced..6d2565c 100644 --- a/public/uk/index.gmi +++ b/public/uk/index.gmi @@ -16,6 +16,7 @@ ### Нотатки +=> radicle-web-service-deployment.gmi 2026-02-12 Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж => radicle-multi-network-seed-deployment.gmi 2026-02-11 Розгортання сіда Radicle в мульти-мережному середовищі => monitoring-ups-status-on-linux-with-nut.gmi 2026-02-09 Моніторинг статусу UPS в Linux на прикладі NUT => measuring-220v-ac-mains-frequency-acoustic-method.gmi 2026-02-08 Вимірювання частоти змінного струму 220В акустичним способом diff --git a/public/uk/radicle-is-decentralized-p2p-git-dvcs.gmi b/public/uk/radicle-is-decentralized-p2p-git-dvcs.gmi index 39596e0..860c3f5 100644 --- a/public/uk/radicle-is-decentralized-p2p-git-dvcs.gmi +++ b/public/uk/radicle-is-decentralized-p2p-git-dvcs.gmi @@ -281,4 +281,5 @@ rad:z4FoMnoSve6Ku6gz4qiuSpzmGr1YE ### Дивіться також => radicle-multi-network-seed-deployment.gmi Розгортання сіда Radicle в мульти-мережному середовищі +=> radicle-web-service-deployment.gmi Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж => rust-cross-compilation-with-cross-crate.gmi Простий спосіб крос-компіляції Rust з cross \ No newline at end of file diff --git a/public/uk/radicle-multi-network-seed-deployment.gmi b/public/uk/radicle-multi-network-seed-deployment.gmi index a49ee91..3069182 100644 --- a/public/uk/radicle-multi-network-seed-deployment.gmi +++ b/public/uk/radicle-multi-network-seed-deployment.gmi @@ -299,4 +299,8 @@ DID did:key:z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU ## Посилання -=> https://radicle.xyz/guides/seeder Radicle Seeder Guide \ No newline at end of file +=> https://radicle.xyz/guides/seeder Radicle Seeder Guide + +### Дивіться також + +=> radicle-web-service-deployment.gmi Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж \ No newline at end of file diff --git a/public/uk/radicle-web-service-deployment.gmi b/public/uk/radicle-web-service-deployment.gmi new file mode 100644 index 0000000..73caa18 --- /dev/null +++ b/public/uk/radicle-web-service-deployment.gmi @@ -0,0 +1,228 @@ +# Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж + +В попередньому гайді серії про децентралізований Git-хостинг Radicle, було розглянуто приклад налаштування публічного сіда для поширення персональних репозиторіїв в оверлейному режимі з політикою "Selective": +=> radicle-multi-network-seed-deployment.gmi Розгортання сіда Radicle в мульти-мережному середовищі + +Варіанти Веб-сервісу можуть різнитися, в залежності від сфери використання: локальний хост в браузері, десктоп-застосунок або ж публічний сервіс. + +У даному матеріалі - буде розглянуто розгортання саме публічного Веб-інтерфейсу для користувачів оверлейних мереж Yggdrasil і Mycelium (та можливо Tor і I2P) в яких немає прямого доступу до Інтернет і/або встановленого клієнтського вузла Radicle. Тобто, мотивація - зробити сідуючий сервер доступним для локальних користувачів, які бажають переглядати репозиторії "всередині" оверлейної мережі анонімно та забирати код через протокол HTTP звичною командою `git clone`. + +Веб-інфраструктура Radicle ділиться на дві основні частини: бекенд JSON/API (за яку відповідає пакунок radicle-httpd) і асинхронний фронтенд (на базі технологій HTML і JavaScript). Обидва рішення є частиною репозиторію radicle-explorer. + +## Отримання початкового коду + +У попередньому гайді, на сервері вже було створено користувача `radicle`, тож спочатку залогінимось і продовжимо від нього: + +``` bash +su radicle +``` + +Оскільки на моєму сервері немає Інтернет-інтерфейсу як такого, але вже є підключений до глобальної мережі (засобами Tor over Yggdrasil) radicle-node, я буду тягнути вихідний код засобами команди `rad` а не `git` (для якого в моєму випадку потрібен проксі). Це заодно дозволить звикнути до нової обгортки Radicle і скористатись перевагами пірингового обміну без прив'язки до конкретної мережі: + +``` bash +rad clone rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5 radicle-explorer +``` + +Якщо ви все-таки збираєте клієнт на ПК, без локального вузла Radicle: + +``` bash +git clone https://iris.radicle.xyz/z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git radicle-explorer +``` + +## Веб-API (radicle-httpd) + +Інструкції з розгортання Web UI, також описані в офіційній документації: +=> https://radicle.xyz/guides/seeder#running-the-http-daemon Radicle Seeder Guide: Running the HTTP Daemon + +Якщо коротко, то робимо наступне: + +``` bash +cd radicle-explorer/radicle-httpd +cargo build --release +``` + +Копіюємо отриманий бінарник `target/release/radicle-httpd` до `/usr/local/bin` на сервері і переконуємось що користувач `radicle` має відповідні права на виконання: + +``` bash +sudo chown radicle:radicle /usr/local/bin/radicle-httpd +sudo chmod +x /usr/local/bin/radicle-httpd +``` + +### Системний сервіс + +Сервіс я оголосив на локальному інтерфейсі `[::1]` (для IPv4 - це може бути `127.0.0.1`) з портом `8788` і подальшим проксуванням через Nginx з публічних IP відповідних мереж. + +``` /etc/systemd/system/radicle-httpd.service +[Unit] +Description=Radicle HTTP Daemon +After=network.target network-online.target +Requires=network-online.target + +[Service] +User=radicle +Group=radicle +ExecStart=/usr/local/bin/radicle-httpd --listen [::1]:8788 +Environment=RAD_HOME=/home/radicle/.radicle RUST_BACKTRACE=1 RUST_LOG=info NO_COLOR=1 +KillMode=process +Restart=always +RestartSec=1 + +StandardOutput=file:///home/radicle/httpd-debug.log +StandardError=file:///home/radicle/httpd-error.log + +[Install] +WantedBy=multi-user.target +``` + +Додаємо сервіс до авто-запуску зі стартом системи і запускаємо сервер: + +``` bash +sudo systemctl enable --now radicle-httpd +`` + +=> https://seed.radicle.xyz/raw/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/570a7eb141b6ba001713c46345d79b6fead1ca15/systemd/radicle-httpd.service Приклад конфігурації в офіційному репозиторії + +### Nginx + +Сервіс вище "слухатиме" на локальному сокеті `[::1]:8788`, на який потрібно перекинути публічний проксі Nginx. Важливо в `proxy_pass` вказати слеш у якості кореню, інакше буде помилка. + +``` /etc/nginx/sites-available/default +server { + listen [202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8788; + listen [505:6847:c778:61a1:5c6d:e802:d291:8191]:8788; + + # поки не використовується, але згодом створю для нього піддомени Alfis DNS + # server_name _; + + access_log /var/log/nginx/radicle.access.log; + + location / { + proxy_pass http://[::1]:8788/; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_redirect off; + } +} +``` +* для оверлейних мереж HTTPS звичайно не використовується, тому приклад налаштування спрощено + +Застосовуємо оновлення конфігурації: + +``` bash +systemctl reload nginx +``` + +### Фаєрвол + +``` +sudo ufw allow from 0200::/7 to 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port 8788 proto tcp comment 'radicle-httpd' +sudo ufw allow from 0400::/7 to 505:6847:c778:61a1:5c6d:e802:d291:8191 port 8788 proto tcp comment 'radicle-httpd' +``` + +### Тестування бекенду + +В рамках цього прикладу, перевірити роботу JSON/API, можна за адресами: + +=> http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8788 +=> http://[505:6847:c778:61a1:5c6d:e802:d291:8191]:8788 + +## Веб-інтерфейс (radicle-explorer) + +По суті, це статичний Веб-клієнт на базі HTML/JavaScript, який потрібно зібрати засобами пакетного менеджера `npm` і скопіювати отримані статичні файли до публічного простору Nginx: `/var/www/radicle`. Хто далекий від Node.Js - вказаний в документації запуск `npm start` на публічному сервері не використовується і тим паче не проксується. + +### Налаштування підключення до бекенду + +Перед тим, як збирати оптимізований білд, важливо спочатку вказати актуальні налаштування підключення до серверів JSON/API. Робиться це у файлі `config/default.json`, який залінковується на `config/production.json`. Після збірки, ці налаштування буде вбудовано в компонент `build/assets/components-xxx.js` + +У своїй конфігурації, я поки використовую два інтерфейси Yggdrasil і Mycelium свого сіда, налаштованого у попередньому гайді. По аналогії, до масиву об'єктів `preferredSeeds` додаються альтернативні DNS, тунелі I2P або приховані сервіси Tor: + +``` config/default.json +{ + "nodes": { + "fallbackPublicExplorer": "https://app.radicle.xyz/nodes/$host/$rid$path", + "requiredApiVersion": "~0.18.0", + "defaultHttpdPort": 443, + "defaultLocalHttpdPort": 8080, + "defaultHttpdScheme": "https" + }, + "source": { + "commitsPerPage": 30 + }, + "supportWebsite": "https://radicle.zulipchat.com", + "deploymentId": null, + "preferredSeeds": [ + { + "hostname": "[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]", + "port": 8788, + "scheme": "http" + }, + { + "hostname": "[505:6847:c778:61a1:5c6d:e802:d291:8191]", + "port": 8788, + "scheme": "http" + } + ] +} +``` +* `fallbackPublicExplorer` - це сервер-заглушка, куди у разі помилки підключення `preferredSeeds` буде перенаправлено запити JSON/API (radicle-httpd) + +### Компіляція + +Після завершення конфігурації, на локальній машині збираємо оптимізовану статику та для зручності передачі на сервер запаковуємо отриману теку `build` до архіву `radicle-explorer.tar.gz`: + +``` bash +cd radicle-explorer +npm install && npm run build +tar -czvf radicle-explorer.tar.gz -C build . +``` + +### Встановлення + +Отриманий архів `radicle.tar.gz` копіюємо на сервер до якоїсь тимчасової теки і розпаковуємо вміст архіву за призначенням `/var/www/radicle`, оновивши за одно права для доступу Nginx: + +``` +sudo mkdir -p /var/www/radicle +sudo tar -xzvf /tmp/radicle-explorer.tar.gz -C /var/www/radicle +sudo rm /tmp/radicle-explorer.tar.gz +sudo chown www-data:www-data /var/www/radicle +``` + +### Nginx + +Тут все просто: вказуємо актуальний шлях до статики `/var/www/radicle`: + +``` /etc/nginx/sites-available/default +server { + listen [202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8780; + listen [505:6847:c778:61a1:5c6d:e802:d291:8191]:8780; + + #server_name _; + + access_log /var/log/nginx/radicle.access.log; + root /var/www/radicle; + index index.html; +} +``` + +Застосовуємо оновлення конфігурації: + +``` bash +systemctl reload nginx +``` + +### Фаєрвол + +``` +sudo ufw allow from 0200::/7 to 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port 8780 proto tcp comment 'radicle-explorer' +sudo ufw allow from 0400::/7 to 505:6847:c778:61a1:5c6d:e802:d291:8191 port 8780 proto tcp comment 'radicle-explorer' +``` + +### Тестування фронтенду + +В рамках цього прикладу, перевірити роботу бекенду API, можна за адресами: + +=> http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8780 +=> http://[505:6847:c778:61a1:5c6d:e802:d291:8191]:8780 \ No newline at end of file