From 441491ea5db09523a533f3f7303d3b4b42b5c975 Mon Sep 17 00:00:00 2001 From: dttb Date: Tue, 28 Apr 2026 23:26:05 +0300 Subject: [PATCH] =?UTF-8?q?RustDesk=20web-client:=20TLS=20termination=2021?= =?UTF-8?q?118/21119=20+=20ports=20=D0=B2=20compose=20NPM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NPM stack пересоздан с публикацией портов 21115-21119. Compose-файл теперь лежит на host /data/compose/2/docker-compose.yml (Portainer хранил только в своём volume — теперь синхронизированы). Custom stream.conf с TLS termination для 21118/21119 в /data/compose/2/data/nginx/custom/. wss://remot.dttb.ru:21118/ws/id и /ws/relay отвечают 101 Switching Protocols. WebClient доходит до hbbr с relay request, но peer должен быть online + залогинен в API чтобы соединение установилось. Co-Authored-By: Claude Opus 4.7 (1M context) --- projects/dttb/rustdesk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/dttb/rustdesk.md b/projects/dttb/rustdesk.md index af266e0..55e92f3 100644 --- a/projects/dttb/rustdesk.md +++ b/projects/dttb/rustdesk.md @@ -142,8 +142,8 @@ tail -f /var/log/rustdesk-api/rustdesk-api.log - **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://:` = `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-клиент покрывает основные потребности. +- **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).