mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-18 22:02:41 +00:00
add rozhortannia-veb-infrastruktury-radicle-na-prykladi-overleynykh-merez.md
This commit is contained in:
parent
3b1bf1b46e
commit
d9a9c23db6
1 changed files with 261 additions and 0 deletions
|
|
@ -0,0 +1,261 @@
|
|||
# Розгортання Веб-інфраструктури Radicle на прикладі оверлейних мереж
|
||||
|
||||
У попередньому гайді [серії](https://devzone.org.ua/tag/radicle) про децентралізований Git-хостинг [Radicle](https://radicle.xyz/), було розглянуто приклад [налаштування публічного сіда](https://devzone.org.ua/post/rozhortannia-sida-radicle-v-multy-mereznomu-seredovyshchi), для поширення коду персональних репозиторіїв в оверлейному режимі з вибірковою політикою "*Selective*".
|
||||
|
||||
Цього разу, опишу особистий досвід розгортання публічного Веб-інтерфейсу на його основі, для користувачів оверлейних IPv6 мереж [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom) і [Mycelium](https://github.com/threefoldtech/mycelium). Мотивація - зробити сідуючий сервер доступним для локальних користувачів, які бажають переглядати репозиторії "всередині" оверлейної мережі та мати можливість забирати код як з `rad clone` так і через шлюз HTTP звичною командою `git clone`.
|
||||
|
||||
Веб-інфраструктура Radicle ділиться на дві основні частини: сервер JSON/API (за яку відповідає пакунок `radicle-httpd`) і статичний асинхронний клієнт (на базі технологій HTML і JavaScript). Обидва рішення є частиною репозиторію `radicle-explorer`.
|
||||
|
||||
## Отримання початкового коду
|
||||
|
||||
У попередньому гайді, на сервері вже було створено користувача `radicle`, тож спочатку залогінимось від нього:
|
||||
|
||||
``` bash
|
||||
su radicle
|
||||
```
|
||||
|
||||
Оскільки на моєму сервері немає Інтернет-інтерфейсу як такого, але вже є підключений до глобальної мережі (засобами Tor over Yggdrasil) `radicle-node`, я буду тягнути вихідний код засобами команди `rad` а не `git` (для якого в моєму випадку знадобився б вихідний проксі). Це за одно дозволить звикнути до нової обгортки і скористатись перевагами пірингового обміну без прив'язки до конкретної мережі:
|
||||
|
||||
``` bash
|
||||
rad clone rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5 radicle-explorer
|
||||
```
|
||||
|
||||
Якщо таки збираєте клієнт без локального вузла Radicle:
|
||||
|
||||
``` bash
|
||||
git clone https://iris.radicle.xyz/z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git radicle-explorer
|
||||
```
|
||||
|
||||
## Сервер JSON/API (radicle-httpd)
|
||||
|
||||
Інструкції з розгортання також описані в офіційній документації:
|
||||
[Radicle Seeder Guide: Running the HTTP Daemon](https://radicle.xyz/guides/seeder#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
|
||||
```
|
||||
|
||||
* [приклад конфігурації systemd в офіційному репозиторії](https://seed.radicle.xyz/raw/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/570a7eb141b6ba001713c46345d79b6fead1ca15/systemd/radicle-httpd.service)
|
||||
|
||||
Додаємо сервіс до авто-запуску зі стартом системи і запускаємо сервер:
|
||||
|
||||
``` bash
|
||||
sudo systemctl enable --now radicle-httpd
|
||||
```
|
||||
|
||||
### Nginx
|
||||
|
||||
``` /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;
|
||||
|
||||
# поки не визначився
|
||||
# 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;
|
||||
}
|
||||
}
|
||||
```
|
||||
* для мереж Yggdrasil і Mycelium - 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
|
||||
|
||||
Якщо встановлено Alfis DNS:
|
||||
|
||||
* http://ygg.ua.srv:8788
|
||||
* http://myc.ua.srv:8788
|
||||
|
||||
По аналогії, на бекенд можна легко причепити тунелі I2P і Tor.
|
||||
|
||||
## Клієнт (radicle-explorer)
|
||||
|
||||
По суті, це статичний Веб-компонент на базі HTML/JavaScript, що звертається до вказаного в його налаштуваннях сервера. Оптимізована статика збирається засобами пакетного менеджера `npm`, після чого отримані файли з теки `build` копіюються до публічного простору, наприклад Nginx: `/var/www/radicle`.
|
||||
|
||||
### Налаштування підключення до бекенду
|
||||
|
||||
Перед тим, як збирати оптимізований білд, важливо спочатку вказати актуальні налаштування підключення до серверів JSON/API - власних або сторонніх. Робиться це у файлі `config/default.json`. Після збірки, ці налаштування будуть "вбудовані" в компонент `build/assets/components-xxx.js` і при наступних оновленнях конфігу, особисто я перезбираю клієнт видаливши попередню теку `build`.
|
||||
|
||||
У своїй конфігурації, поки використовую два інтерфейси: Yggdrasil і Mycelium свого сіда. По аналогії, до масиву об'єктів `preferredSeeds` додаються й альтернативні DNS, тунелі I2P або приховані сервіси Tor.
|
||||
|
||||
Важливим є той факт, що поточна версія `radicle-explorer` ніяк не проксує через бекенд `preferredSeeds` і тому якщо в клієнта не встановлено роутер Mycelium, то перебуваючи на хості Yggdrasil - він не зможе з меню `0200::/7` відкрити сід `0400::/7`. Більше того, там є баг, який при відсутності зв'язку з сідом буде зависати на його сесії, допоки руками не почистити Локальне сховище. Навожу приклад міксованого з'єднання, але рекомендую користуватись одним сімейством адрес для одного фронтенду.
|
||||
|
||||
``` 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": "ygg.ua.srv",
|
||||
"port": 8788,
|
||||
"scheme": "http"
|
||||
},
|
||||
{
|
||||
"hostname": "[505:6847:c778:61a1:5c6d:e802:d291:8191]",
|
||||
"port": 8788,
|
||||
"scheme": "http"
|
||||
},
|
||||
{
|
||||
"hostname": "myc.ua.srv",
|
||||
"port": 8788,
|
||||
"scheme": "http"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Стандартні поля секції `nodes` - свідомо не зміню, бо в коді клієнта є такі упороті моменти:
|
||||
|
||||
``` radicle-explorer/src/views/repos/Header/CloneButton.svelte
|
||||
$: portFragment =
|
||||
baseUrl.scheme === config.nodes.defaultHttpdScheme &&
|
||||
baseUrl.port === config.nodes.defaultHttpdPort
|
||||
? ""
|
||||
: `:${baseUrl.port}`;
|
||||
```
|
||||
* через що може не працювати внутрішня навігація по сідам а також приклади команд типу `git clone`, виключаючи з URL не типовий для HTTP/80 порт (`8788`) якщо той використовується
|
||||
|
||||
### Компіляція
|
||||
|
||||
Після завершення конфігурації, на локальній машині збираємо оптимізовану статику і для зручності передачі на сервер, запаковуємо вміст `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:
|
||||
|
||||
``` bash
|
||||
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` з адресацією усіх запитів на `index.html`:
|
||||
|
||||
``` /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;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Застосовуємо оновлення конфігурації:
|
||||
|
||||
``` bash
|
||||
systemctl reload nginx
|
||||
```
|
||||
|
||||
### Фаєрвол
|
||||
|
||||
``` bash
|
||||
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'
|
||||
```
|
||||
|
||||
### Тестування фронтенду
|
||||
|
||||
В рамках цього прикладу, перевірити роботу можна за адресами:
|
||||
|
||||
* http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8780
|
||||
* http://[505:6847:c778:61a1:5c6d:e802:d291:8191]:8780
|
||||
|
||||
Якщо встановлено Alfis DNS:
|
||||
|
||||
* http://ygg.ua.srv:8780
|
||||
* http://myc.ua.srv:8780
|
||||
Loading…
Add table
Add a link
Reference in a new issue