gemlog/public/uk/radicle-web-service-deployment.gmi
2026-02-12 09:39:39 +02:00

228 lines
No EOL
11 KiB
Text
Raw 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.

# Розгортання Веб-сервісів 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