RustDesk в Docker Compose: готовый файл
Если вы подключаетесь через публичный relay RustDesk (rustdesk.com), рано или поздно упрётесь в его лимиты: скорость проседает в часы пик, соединение рвётся без объяснений, а трафик с чужого рабочего стола идёт через сервер, который вам не принадлежит. Решение простое — поднять собственный RustDesk-сервер (hbbs + hbbr) на своём VPS через Docker Compose. Ниже — рабочий файл, который можно скопировать и запустить за пять минут, плюс всё, что вокруг него обычно ломается.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое hbbs и hbbr и зачем свой relay
RustDesk — open-source аналог TeamViewer/AnyDesk с end-to-end шифрованием. У него две логически разные роли на сервере, и обе реализованы одним и тем же бинарником rustdesk-server, просто с разными командами запуска:
- hbbs (host & broker server) — сервер идентификации и рандеву. Он не видит содержимое сессии: клиенты регистрируются с уникальным ID, hbbs помогает им найти друг друга и по возможности установить прямое P2P-соединение (через NAT-холпанчинг).
- hbbr (relay server) — сервер-ретранслятор. Включается, когда прямое P2P-соединение не удалось (симметричный NAT, жёсткий корпоративный firewall) — тогда весь трафик экрана и управления идёт транзитом через него.
По умолчанию клиент RustDesk использует публичные hbbs/hbbr от разработчиков. Это удобно для разового подключения к знакомому, но для рабочего парка машин — плохая идея: скорость relay зависит от загрузки чужого сервера, есть неявные лимиты на объём трафика при бесплатном использовании, а весь ключевой обмен идёт через инфраструктуру, которую вы не контролируете. Свой сервер снимает все три проблемы разом: скорость упирается в канал вашего VPS, а не в чужую очередь, а метаданные о том, кто и когда подключался, остаются у вас.
Оговорка: даже с собственным hbbs/hbbr трафик между двумя P2P-клиентами остаётся end-to-end зашифрованным — сервер его не расшифровывает. Но если соединение уходит через relay (hbbr), весь зашифрованный поток физически проходит через вашу машину, поэтому канал и CPU сервера должны быть приличными, особенно при нескольких пользователях одновременно.
Требования к серверу
RustDesk-сервер лёгкий по CPU и памяти — узкое место почти всегда сеть, а не вычисления.
| Параметр | Минимум | Рекомендовано |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 512 МБ | 1 ГБ |
| Диск | 5 ГБ | 10 ГБ (для логов) |
| Канал | 100 Мбит/с | 1 Гбит/с при нескольких активных сессиях |
| ОС | любая с Docker | Ubuntu 24.04 / Debian 12 |
Ключевое требование — белый статический IP без CGNAT и открытые порты наружу. Если сервер стоит за NAT провайдера (частая история с домашним интернетом), hbbs/hbbr снаружи будут недоступны и вся конструкция не заработает. Арендованный VPS с публичным IP закрывает этот вопрос по умолчанию.
Если Docker ещё не установлен, разверните его по инструкции Ubuntu 24.04: установка Docker с нуля — там же есть шаги для установки Docker Compose plugin, который понадобится дальше.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Создайте рабочую директорию и файл:
mkdir -p ~/rustdesk-server/data
cd ~/rustdesk-server
nano docker-compose.yml
Содержимое файла:
services:
hbbs:
image: rustdesk/rustdesk-server:latest
container_name: rustdesk-hbbs
restart: unless-stopped
ports:
- "21115:21115"
- "21116:21116"
- "21116:21116/udp"
- "21118:21118"
command: hbbs -r rustdesk.example.com:21117
volumes:
- ./data:/root
networks:
- rustdesk-net
depends_on:
- hbbr
hbbr:
image: rustdesk/rustdesk-server:latest
container_name: rustdesk-hbbr
restart: unless-stopped
ports:
- "21117:21117"
- "21119:21119"
command: hbbr
volumes:
- ./data:/root
networks:
- rustdesk-net
networks:
rustdesk-net:
driver: bridge
Замените rustdesk.example.com на реальный домен или IP-адрес вашего сервера — этот флаг -r в команде hbbs говорит клиентам, куда обращаться за relay-сервером (hbbr), если P2P не сложится. Если домена пока нет, можно временно указать голый IP — работать будет так же, просто менее удобно при смене сервера в будущем.
Обратите внимание на том ./data:/root — он общий для обоих контейнеров и критически важен. При первом запуске hbbs генерирует в /root пару ключей id_ed25519 / id_ed25519.pub. Публичный ключ из этого файла нужно будет прописать в каждом клиенте — без него клиенты не смогут проверить подлинность вашего сервера. Если том не примонтирован (или вы случайно удалите контейнер вместе с анонимным volume), при пересоздании контейнера сгенерируется новая пара ключей — и все ранее настроенные клиенты перестанут подключаться, пока вы не обновите ключ вручную на каждом из них.
Запуск:
docker compose up -d
docker compose logs -f hbbs
В логах hbbs должна появиться строка о запуске relay-сервера на 21116 и путь к сгенерированным ключам. Публичный ключ достаём так:
cat ~/rustdesk-server/data/id_ed25519.pub
Сохраните эту строку — она понадобится при настройке каждого клиента.
Firewall и открытие портов
RustDesk-серверу нужны пять портов, три из них — на hbbs, два — на hbbr:
| Порт | Протокол | Сервис | Назначение |
|---|---|---|---|
| 21115 | TCP | hbbs | Тест типа NAT |
| 21116 | TCP + UDP | hbbs | Регистрация ID, heartbeat, punch hole |
| 21117 | TCP | hbbr | Relay-трафик |
| 21118 | TCP | hbbs | Веб-клиент (опционально) |
| 21119 | TCP | hbbr | Веб-клиент, relay через WebSocket (опционально) |
Если у вас поднят UFW, откройте их так — подробный разбор самого UFW и типичных ошибок есть в статье UFW на Ubuntu 24.04: пошаговая установка:
sudo ufw allow 21115/tcp
sudo ufw allow 21116/tcp
sudo ufw allow 21116/udp
sudo ufw allow 21117/tcp
sudo ufw allow 21118/tcp
sudo ufw allow 21119/tcp
sudo ufw reload
Порт 21116/udp часто именно тот, который забывают — без него P2P-хендшейк не работает, и все соединения принудительно идут через relay даже там, где мог бы установиться прямой канал. Если сервер арендован у провайдера с собственным сетевым firewall (security group), продублируйте те же правила и там — UFW внутри VM их не заменяет.
Настройка клиентов на свой сервер
На каждой машине, которую хотите подключить через свой сервер:
- Откройте RustDesk → значок трёх точек → Настройки сети (Network).
- Отметьте «Свой сервер» / «Unlock Network Settings» (может потребоваться ввести пароль, если он задан).
- Заполните поля:
- ID Server:
rustdesk.example.com(или IP) - Relay Server:
rustdesk.example.com(или IP) — обычно достаточно того же адреса, hbbs сам перенаправит на hbbr по флагу-r - Key: содержимое
id_ed25519.pub, которое вы сохранили на предыдущем шаге
- Сохраните и перезапустите приложение.
Проверить, что клиент действительно смотрит на ваш сервер, статус соединения в интерфейсе покажет «Ready» с указанием вашего адреса вместо публичного пула. Для массового парка машин удобнее не настраивать каждую машину вручную, а собрать кастомный инсталлятор с зашитыми ID Server/Key (через MSI-конфиг на Windows или сборочные параметры клиента) — это отдельная тема, но такая возможность у RustDesk есть.
Домен, TLS и веб-клиент
Протоколы hbbs/hbbr — не HTTP, а собственный бинарный протокол RustDesk поверх TCP/UDP, поэтому классический сертификат Let's Encrypt на эти порты не навешивается и не нужен — шифрование сессии обеспечивается самим RustDesk на уровне приложения (ключевая пара + сквозное шифрование клиент-клиент). Если видели у кого-то в инструкциях reverse-proxy с SSL перед hbbs — это, как правило, избыточно для типового кейса и нужно только тем, кто разворачивает у себя ещё и веб-клиент RustDesk (Flutter Web) как отдельный HTTP-сервис на своём поддомене — тогда TLS ставится перед этим HTTP-фронтом, а не перед самим hbbs. Если такой сценарий вам нужен, посмотрите общий подход в статье про Traefik как reverse proxy для Docker или про Caddy с авто-SSL на Ubuntu 24.04 — оба варианта заведутся поверх уже поднятых контейнеров без конфликта портов, если веб-клиент слушает отдельный порт.
Домен вместо голого IP оправдан по одной практической причине: если когда-нибудь придётся переезжать на другой сервер (например, добавить резервный или сменить локацию), вы просто поменяете A-запись — и все клиенты, у которых ID Server указан доменным именем, продолжат работать без переустройки. При IP в поле придётся вручную обновлять адрес на каждой машине.
Отдельно стоит сказать про GUI-панель управления: у RustDesk есть платная Pro-версия с веб-консолью для управления пользователями, группами и аудитом подключений (rustdesk-server-pro). Бесплатная community-версия, которую разворачивает docker-compose выше, консоли не имеет — управление ключами и доступом делается вручную через файл id_ed25519.pub и, при необходимости, через переменные окружения HBBS_HTTP_TOKEN для базового REST API самого hbbs. Для парка в 5-20 машин этого обычно достаточно, для крупного парка с ролями пользователей стоит присмотреться к Pro или к готовым обёрткам вроде rustdesk-api от сообщества.
Диагностика и типичные проблемы
Клиент показывает «Connecting…» и обрывается. Чаще всего не открыт UDP 21116 — проверьте с внешней машины:
nc -vzu ваш-ip 21116
Если TCP-часть (21115, 21116) проходит, а соединение всё равно не устанавливается напрямую и всегда идёт через relay — это нормальное поведение при симметричном NAT на одной из сторон, тут поможет только relay (hbbr), а не настройка сервера.
После перезапуска контейнера все клиенты отвалились с ошибкой ключа. Почти всегда причина — том ./data:/root не был примонтирован при первом деплое (например, тестировали командой docker run без -v), и при пересоздании контейнера hbbs сгенерировал новую пару ключей. Проверьте, что docker compose config показывает нужный volume, и обновите ключ на клиентах из актуального id_ed25519.pub.
Relay работает, но с задержками и рывками видео. Проверьте загрузку исходящего канала сервера:
docker stats rustdesk-hbbr
Если CPU или сеть контейнера упираются в потолок при нескольких одновременных сессиях — это повод расширить тариф VPS по CPU/каналу, а не перенастраивать сам RustDesk.
Логи ничего не показывают. По умолчанию verbose-логирование выключено. Добавьте переменную окружения в оба сервиса для диагностики:
environment:
- RUST_LOG=info
и пересоздайте контейнеры (docker compose up -d --force-recreate), после чего смотрите docker compose logs -f.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли отдельный сервер для hbbs и hbbr или можно на одной машине?
Можно и нужно на одной для большинства сценариев — оба сервиса лёгкие, файл выше как раз запускает их вместе на одном VPS. Разносить по разным серверам имеет смысл только при очень большой нагрузке или требовании географически ближайшего relay для разных регионов пользователей.
Работает ли это на ARM-сервере (например, Oracle Free Tier или ARM-инстансах)?
Да, официальный образ rustdesk/rustdesk-server мультиархитектурный и поддерживает arm64 — команда docker compose up -d сама подтянет нужный вариант образа.
Можно ли использовать один сервер для нескольких организаций/команд без пересечения?
Технически да — привязка идёт по ID клиента и ключу сервера, а не по «организациям». Изоляция между командами на уровне community-версии условная: все, кто знает ваш сервер и публичный ключ, физически могут пытаться подключаться к любому зарегистрированному ID, если знают пароль устройства. Для строгого разделения нужен либо отдельный сервер на команду, либо Pro-версия с ACL.
Что будет, если публичные rustdesk.com-серверы станут недоступны?
Ничего — как только клиенты настроены на ваш собственный hbbs/hbbr, зависимость от инфраструктуры разработчиков RustDesk для установления соединений отсутствует, обновления самого клиента по-прежнему подтягиваются штатно.
Сколько одновременных сессий выдержит минимальный VPS (1 vCPU/512 МБ)?
Точных цифр без вашего профиля нагрузки не дадим — сильно зависит от того, сколько сессий реально идёт через relay (а не P2P) и разрешения экрана. Как ориентир: для 3-5 одновременных relay-сессий с обычным офисным разрешением такого VPS чаще всего достаточно, но проверяйте docker stats под реальной нагрузкой и увеличивайте тариф при необходимости.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →