--- 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: ` - `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 # Сменить пароль обычного юзера cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-pwd # Список 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 через UI/API не публикуются наружу docker-контейнера.** Нужно править compose-файл и пересоздавать контейнер. Compose лежит в `/data/compose/2/docker-compose.yml` на host LXC 103 (мы его положили туда, ранее Portainer хранил только в своём volume). При обновлении stack ВАЖНО: `cd /data/compose/2 && docker compose -p npm up -d` — relative `./data` resolve в `/data/compose/2/data` (где реальные данные NPM). НЕ обновляй stack через Portainer UI — он работает со своей копией compose в `/var/lib/docker/volumes/portainer_data/_data/compose/2/`, может перезаписать. Текущий compose содержит ports: 80, 81, 443, 21115-21119 (TCP+UDP где надо). - **WebClient в браузере** работает на инфра-уровне (wss://remot.dttb.ru:21118/ws/id и :21119/ws/relay → 101 Switching Protocols). TLS termination для 21118/21119 через `/data/compose/2/data/nginx/custom/stream.conf` (custom stream block в NPM с `listen 21118 ssl` + `ssl_certificate /etc/letsencrypt/live/npm-41/...`). Streams 21115/21117/21116-tcp/udp идут через обычные NPM streams (id 38, 39, 40, 43). Чтобы реально использовать — нужны online peers с api-server login. Подключение Mac→Mac через WebClient невозможно (это и есть `MUST_LOGIN`-style ошибка "не удалось подключиться к серверу ретрансляции"). - **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