Files
knowledge-base/projects/dttb/rustdesk.md
dttb ebe435842d RustDesk: задокументировать что NPM streams недоступны извне и web-client отложен
При попытке завести web-client (wss://remot.dttb.ru:21118) выяснилось что
docker port для NPM публикует только 80/81/443. Streams 21115-21119
работают только внутри docker-сети — desktop-клиенты ходят на 10.0.0.244
напрямую через LAN/NetBird. Web-client требует rebuild NPM compose с ports.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 13:29:35 +03:00

158 lines
8.1 KiB
Markdown
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.
---
date: 2026-04-28
type: project-reference
tags: [rustdesk, lxc116, lejianwen, dttb]
---
# RustDesk Server — справочник
## Что это
Self-hosted Remote Desktop сервер для парка ~30-50 машин (НИИКН + клиенты).
Стек **`lejianwen/rustdesk-server-pro` 1.1.14** (`hbbs`/`hbbr`) + **`lejianwen/rustdesk-api` 2.7** на нативной Debian-установке (без Docker), с `MUST_LOGIN=Y`.
История миграции: [[../../decisions/2026-04-28-rustdesk-lejianwen-pro-migration]]
## Где живёт
- **LXC 116** `rustdeskserver` на Proxmox 10.0.0.250
- IP: `10.0.0.244` (LAN) / `100.70.191.161` (NetBird)
- Debian 12, 1 vCPU / 512M / 2G — community-script установка
## Домен
- Внешний: **`remot.dttb.ru`** (Cloudflare → роутер dttb.ru → NPM 10.0.0.195 → 10.0.0.244)
- Web-админка: https://remot.dttb.ru/_admin/
- Swagger: https://remot.dttb.ru/swagger/index.html
- Login: см. [[credentials#RustDesk Server (LXC 116)]]
## Сервисы (systemd)
```
rustdesk-hbbs.service — ID/Rendezvous server (hbbs --must-login Y -k _ -r remot.dttb.ru:21117)
rustdesk-hbbr.service — Relay server (hbbr -k _)
rustdesk-api.service — Web admin + REST API (на 21114)
```
Бинари:
- `/usr/bin/hbbs` — pro 1.1.14 (с патчем `--must-login Y`)
- `/usr/bin/hbbr` — pro 1.1.14
- `/usr/bin/rustdesk-api` — 2.7
- `/usr/bin/{hbbs,hbbr}.oss-1.1.14` — rollback-копии
`apt-mark hold rustdesk-server-hbbs rustdesk-server-hbbr` — apt не перезапишет.
Override-конфиги:
- `/etc/systemd/system/rustdesk-hbbs.service.d/override.conf`
- `/etc/systemd/system/rustdesk-hbbr.service.d/override.conf`
## Порты
| Порт | Протокол | Назначение |
|------|----------|------------|
| 21114 | TCP | rustdesk-api HTTP (только через NPM HTTPS!) |
| 21115 | TCP | hbbs NAT-test |
| 21116 | TCP+UDP | hbbs ID/rendezvous (UDP — основной) |
| 21117 | TCP | hbbr relay |
| 21118 | TCP | hbbs WebSocket (для All-In-HTTPS клиентов через `/ws/id`) |
| 21119 | TCP | hbbr WebSocket (через `/ws/relay`) |
NPM Proxy Host id=14: `https://remot.dttb.ru → 10.0.0.244:21114` + custom nginx с `/ws/id` и `/ws/relay`.
NPM Streams: id 38-43 (21115/TCP, 21116/UDP, 21116/TCP, 21117/TCP, 21118/TCP, 21119/TCP) → 10.0.0.244.
## Ключи
- `/var/lib/rustdesk-server/id_ed25519` — приватный (88 байт)
- `/var/lib/rustdesk-server/id_ed25519.pub``R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU=`
**Не перегенерировать!** Иначе все ~30-50 клиентов перестанут подключаться.
## БД
- `/var/lib/rustdesk-server/db_v2.sqlite3` — БД hbbs (peers state)
- `/var/lib/rustdesk-api/data/rustdeskapi.db` — БД api (users, groups, address_books, audit_logs)
Пока SQLite. План: MySQL когда дойдём до HA.
## Конфиг api
`/var/lib/rustdesk-api/conf/config.yaml` — основные параметры:
- `lang: ru`
- `app.register: false` (регистрация выключена — юзеров создаёт админ)
- `app.show-swagger: 1`
- `app.ban-threshold: 5`
- `app.captcha-threshold: 3`
- `rustdesk.id-server: remot.dttb.ru:21116`
- `rustdesk.relay-server: remot.dttb.ru:21117`
- `rustdesk.api-server: https://remot.dttb.ru`
- `rustdesk.key: <id_ed25519.pub>`
- `jwt.key: <см. credentials>`
- `ldap.enable: false`
## Шаблон RustDesk2.toml для клиентов
`/root/RustDesk2.toml` на LXC 116:
```toml
rendezvous_server = "remot.dttb.ru:21116"
nat_type = 1
serial = 1
[options]
custom-rendezvous-server = "remot.dttb.ru"
relay-server = "remot.dttb.ru"
api-server = "https://remot.dttb.ru"
key = "R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU="
allow-websocket = "Y"
verification-method = "use-permanent-password"
approve-mode = "password"
```
## CLI-команды (на LXC 116)
```bash
# Сменить пароль admin
cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-admin-pwd <new-pw>
# Сменить пароль обычного юзера
cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-pwd <username> <new-pw>
# Список peers через sqlite
sqlite3 /var/lib/rustdesk-api/data/rustdeskapi.db \
"select id, last_online_ip, datetime(last_online_time,'unixepoch') from peers order by last_online_time desc limit 10;"
# Список юзеров
sqlite3 /var/lib/rustdesk-api/data/rustdeskapi.db \
"select id, username, group_id, status, is_admin from users;"
# Логи
tail -f /var/log/rustdesk-server/hbbs.log
tail -f /var/log/rustdesk-server/hbbr.log
tail -f /var/log/rustdesk-api/rustdesk-api.log
```
## Бэкап и rollback
- `/root/rustdesk-backup-20260428-1134/` — бэкап от 2026-04-28 миграции (ключи, БД, config.yaml.orig)
- `/root/rustdesk-rollback.sh` — откат к OSS bin'ам за 30 сек
## Известные нюансы
- **MUST_LOGIN работает только в pro-бинаре hbbs.** OSS hbbs (как был до 2026-04-28) этот флаг игнорирует. См. [[../../decisions/2026-04-28-rustdesk-lejianwen-pro-migration]].
- **Admin REST API через curl без web-сессии не пускает.** Юзеров/группы создавать через https://remot.dttb.ru/_admin/.
- **Admin генерит `/webclient2/`-ссылки на peer'ы, а api отдаёт WebClient на `/webclient/`** — баг lejianwen 2.7. В NPM Proxy Host 14 (advanced_config) добавлен `return 301 /webclient/$1$is_args$args` для `/webclient2/...`.
- **NPM streams API** — PUT не работает (валидатор `additional properties`). Только DELETE + POST.
- **NPM streams 21115-21119 не публикуются наружу docker-контейнера.** `docker port npm-app-1` показывает только 80/81/443. То есть `10.0.0.195:21118` снаружи **closed**, хотя внутри nginx слушает. Поэтому desktop RustDesk-клиенты подключаются напрямую на `10.0.0.244:21116` (LAN) или `100.70.191.161:21116` (NetBird), минуя NPM streams. Streams через NPM работают только если NPM был запущен через `docker compose up` с `ports: 21118:21118` и т.д. в compose-файле.
- **WebClient в браузере (https://remot.dttb.ru/webclient/) НЕ работает.** Flutter app старый (rustdesk-api 2.7), он жёстко строит `wss://<id-host>:<id-port+2>` = `wss://remot.dttb.ru:21118` и игнорирует `window.ws_host`. Чтобы заработал — нужно (a) опубликовать порты 21118/21119 в docker-mapping NPM через compose, (b) включить TLS termination в NPM stream (через `ssl_certificate` в custom `/data/nginx/custom/stream.conf`), (c) при необходимости открыть эти порты на роутере dttb.ru. Отложено как отдельная задача — desktop-клиент покрывает основные потребности.
- **community-script может пытаться обновить пакеты** — `apt-mark hold` защищает hbbs/hbbr, но если запустить полный re-run скрипта community-scripts, могут быть сюрпризы. Не запускать без необходимости.
- **`/proc/loadavg` в LXC = нагрузка хоста**, не контейнера ([[../../../knowledge-base/feedback_lxc_loadavg]] в memory).
## TODO
- Раскатать `RustDesk2.toml` на парк через GPO/скрипт
- Заполнить группы клиентских организаций
- Бэкап на ArtLeon через cron + rsync (NetBird)
- Через 2-4 недели — миграция в Docker `lejianwen/rustdesk-server-s6` (Вариант A3 из decision-файла)
- MCP-обёртка поверх Swagger API для управления из Claude Code
- HA-схема на втором экземпляре (НИИКН Proxmox) с общей MySQL