mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-18 22:12:40 +00:00
add radicle-web-service-deployment.gmi
This commit is contained in:
parent
a86289e495
commit
acf7ce53c8
4 changed files with 235 additions and 1 deletions
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
### Нотатки
|
### Нотатки
|
||||||
|
|
||||||
|
=> radicle-web-service-deployment.gmi 2026-02-12 Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж
|
||||||
=> radicle-multi-network-seed-deployment.gmi 2026-02-11 Розгортання сіда 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
|
=> 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В акустичним способом
|
=> measuring-220v-ac-mains-frequency-acoustic-method.gmi 2026-02-08 Вимірювання частоти змінного струму 220В акустичним способом
|
||||||
|
|
|
||||||
|
|
@ -281,4 +281,5 @@ rad:z4FoMnoSve6Ku6gz4qiuSpzmGr1YE
|
||||||
### Дивіться також
|
### Дивіться також
|
||||||
|
|
||||||
=> radicle-multi-network-seed-deployment.gmi Розгортання сіда Radicle в мульти-мережному середовищі
|
=> radicle-multi-network-seed-deployment.gmi Розгортання сіда Radicle в мульти-мережному середовищі
|
||||||
|
=> radicle-web-service-deployment.gmi Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж
|
||||||
=> rust-cross-compilation-with-cross-crate.gmi Простий спосіб крос-компіляції Rust з cross
|
=> rust-cross-compilation-with-cross-crate.gmi Простий спосіб крос-компіляції Rust з cross
|
||||||
|
|
@ -299,4 +299,8 @@ DID did:key:z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU
|
||||||
|
|
||||||
## Посилання
|
## Посилання
|
||||||
|
|
||||||
=> https://radicle.xyz/guides/seeder Radicle Seeder Guide
|
=> https://radicle.xyz/guides/seeder Radicle Seeder Guide
|
||||||
|
|
||||||
|
### Дивіться також
|
||||||
|
|
||||||
|
=> radicle-web-service-deployment.gmi Розгортання Веб-сервісів Radicle на прикладі оверлейних мереж
|
||||||
228
public/uk/radicle-web-service-deployment.gmi
Normal file
228
public/uk/radicle-web-service-deployment.gmi
Normal file
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue