English · Русский
Небольшая утилита для Windows, которая автоматически настраивает существующий клиент RustDesk OSS для работы с собственным self-hosted сервером.
Не требует RustDesk Pro, API или прав администратора.
Проект закрывает весь минимальный сценарий:
VPS
|
+--> hbbs ID / rendezvous
|
+--> hbbr relay
|
+--> id_ed25519.pub
|
v
support.exe
|
v
RustDesk клиента
- настройка существующего RustDesk одним запуском
support.exe - собственный RustDesk OSS Server без RustDesk Pro
hbbsиhbbrчерез Docker Compose- постоянное хранение серверной пары ключей
- автоматическая настройка:
custom-rendezvous-serverrelay-serverkey
- сохранение остальных настроек RustDesk и истории подключений
- автоматический перезапуск установленного RustDesk
- relay по тому же домену, что и ID Server
- готовая схема обновления и backup сервера
Программа изменяет только три параметра в:
%APPDATA%\RustDesk\config\RustDesk2.toml
custom-rendezvous-server
relay-server
key
Остальная конфигурация файла сохраняется.
RustDesk должен быть установлен по стандартному пользовательскому пути:
%LOCALAPPDATA%\rustdesk\rustdesk.exe
Linux: Debian / Ubuntu
Public IPv4: требуется
Domain name: требуется
Docker: Docker Engine + Docker Compose
Пример домена в инструкции:
example.relay.net
DNS A-запись должна указывать на публичный IPv4 сервера.
Проверка:
getent ahostsv4 example.relay.netМинимальные порты RustDesk OSS Server:
| Port | Protocol | Purpose |
|---|---|---|
21115 |
TCP | NAT type test |
21116 |
TCP | ID / rendezvous / hole punching |
21116 |
UDP | ID registration / heartbeat |
21117 |
TCP | Relay |
21118/tcp и 21119/tcp используются Web Client и для обычного RustDesk-клиента не требуются.
OS: Windows
Go: установлен
Git: установлен
На компьютере конечного пользователя Go и Git не нужны.
Создайте DNS A-запись:
example.relay.net -> PUBLIC_VPS_IP
Замените example.relay.net на свой домен и выполните на VPS от root:
set -euo pipefail
DOMAIN="example.relay.net"
# ------------------------------------------------------------
# Проверка
# ------------------------------------------------------------
if [ "$(id -u)" -ne 0 ]; then
echo "ERROR: run as root"
exit 1
fi
echo "DNS:"
getent ahostsv4 "$DOMAIN" || {
echo "ERROR: $DOMAIN does not resolve"
exit 1
}
# ------------------------------------------------------------
# Docker
# ------------------------------------------------------------
apt update
apt install -y ca-certificates curl
if ! command -v docker >/dev/null 2>&1; then
curl -fsSL https://get.docker.com | sh
fi
docker --version
docker compose version
# ------------------------------------------------------------
# RustDesk
# ------------------------------------------------------------
mkdir -p /opt/rustdesk/data
cd /opt/rustdesk
cat >/opt/rustdesk/compose.yml <<'EOF'
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs
volumes:
- ./data:/root
network_mode: "host"
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./data:/root
network_mode: "host"
restart: unless-stopped
EOF
docker compose pull
docker compose up -d
# ------------------------------------------------------------
# Firewall
# ------------------------------------------------------------
if command -v ufw >/dev/null 2>&1 && ufw status | grep -q '^Status: active'; then
ufw allow 21115/tcp
ufw allow 21116/tcp
ufw allow 21116/udp
ufw allow 21117/tcp
else
echo
echo "NOTE: UFW is inactive or not installed."
echo "Open manually:"
echo " 21115/tcp"
echo " 21116/tcp"
echo " 21116/udp"
echo " 21117/tcp"
fi
# ------------------------------------------------------------
# Ожидание генерации ключа hbbs
# ------------------------------------------------------------
for _ in $(seq 1 30); do
[ -s /opt/rustdesk/data/id_ed25519.pub ] && break
sleep 1
done
if [ ! -s /opt/rustdesk/data/id_ed25519.pub ]; then
echo "ERROR: hbbs public key was not created"
docker logs hbbs --tail 100
exit 1
fi
# ------------------------------------------------------------
# Проверка
# ------------------------------------------------------------
echo
docker compose ps
echo
echo "Listening ports:"
ss -lntup | grep -E ':2111[5-9]\b' || true
echo
echo "============================================================"
echo "RustDesk Server is ready"
echo "============================================================"
echo
echo "ID Server:"
echo " $DOMAIN"
echo
echo "Relay Server:"
echo " $DOMAIN"
echo
echo "Public Key:"
cat /opt/rustdesk/data/id_ed25519.pub
echo
echo "============================================================"При первом запуске hbbs автоматически создаёт серверную пару ключей:
/opt/rustdesk/data/id_ed25519
/opt/rustdesk/data/id_ed25519.pub
Публичный ключ:
cat /opt/rustdesk/data/id_ed25519.pubПриватный ключ:
/opt/rustdesk/data/id_ed25519
Приватный ключ нельзя передавать клиентам или публиковать.
Контейнеры:
cd /opt/rustdesk
docker compose psЛоги hbbs:
docker logs hbbs --tail 100Логи relay:
docker logs hbbr --tail 100Порты:
ss -lntup | grep -E ':2111[5-9]\b'Ожидаемый минимум:
21115/tcp
21116/tcp
21116/udp
21117/tcp
Клонируйте репозиторий на Windows-машину с установленным Go:
git clone https://github.com/dimadr/rustdesk-bootstrap.git
cd rustdesk-bootstrapПолучите публичный ключ на сервере:
cat /opt/rustdesk/data/id_ed25519.pubСоберите support.exe:
go build -buildvcs=false -ldflags "-H windowsgui -s -w -X main.serverValue=example.relay.net -X main.relayValue=example.relay.net -X main.keyValue=PUBLIC_KEY" -o support.exe .Замените:
example.relay.net -> ваш домен
PUBLIC_KEY -> содержимое id_ed25519.pub
Если main.relayValue не задан, программа автоматически использует main.serverValue и как Relay Server.
Готовые бинарные файлы в репозитории не публикуются.
На удалённом компьютере уже должен быть установлен RustDesk.
Запустите:
support.exe
Программа:
находит RustDesk
|
v
находит RustDesk2.toml
|
v
меняет только server / relay / key
|
v
останавливает запущенный RustDesk
|
v
запускает RustDesk снова
После этого клиент использует ваш self-hosted RustDesk Server.
Internet
|
+--------------+--------------+
| |
v v
hbbs :21116 hbbr :21117
ID / rendezvous relay
| |
+--------------+--------------+
|
v
RustDesk clients
hbbs используется для регистрации клиентов, rendezvous и попытки прямого соединения.
Если прямое соединение невозможно, трафик проходит через hbbr.
/opt/rustdesk/
├── compose.yml
└── data/
├── id_ed25519
└── id_ed25519.pub
Каталог data подключается в оба контейнера:
./data -> /root
Поэтому удаление или пересоздание контейнеров не меняет серверный ключ, пока сохранён /opt/rustdesk/data.
Создать backup:
tar czf /root/rustdesk-data-backup.tar.gz -C /opt/rustdesk dataПроверить:
tar tzf /root/rustdesk-data-backup.tar.gzКритически важный файл:
data/id_ed25519
Backup рекомендуется хранить вне VPS.
Перед обновлением создайте backup:
tar czf /root/rustdesk-data-backup.tar.gz -C /opt/rustdesk dataОбновление:
cd /opt/rustdesk
docker compose pull
docker compose up -d
docker compose psПроверка:
docker logs hbbs --tail 50
docker logs hbbr --tail 50Пара ключей сохраняется в /opt/rustdesk/data и при обычном обновлении не меняется.
Публиковать можно:
домен ID Server
домен Relay Server
id_ed25519.pub
support.exe
Не публиковать:
/opt/rustdesk/data/id_ed25519
backup-архивы с приватным ключом
доступ к VPS
SSH private keys
Для обычного RustDesk OSS Client не открывайте без необходимости:
21118/tcp
21119/tcp
Эти порты предназначены для Web Client.
Ожидаемый путь:
%LOCALAPPDATA%\rustdesk\rustdesk.exe
Проверьте:
Test-Path "$env:LOCALAPPDATA\rustdesk\rustdesk.exe"Ожидаемый файл:
%APPDATA%\RustDesk\config\RustDesk2.toml
Проверьте:
Test-Path "$env:APPDATA\RustDesk\config\RustDesk2.toml"Если RustDesk только что установлен, запустите его хотя бы один раз, чтобы конфигурация была создана.
Проверьте hbbs:
docker ps
docker logs hbbs --tail 100
ls -la /opt/rustdesk/data/Проверьте relay:
docker logs -f hbbrИ firewall:
ss -lntup | grep -E ':2111[5-9]\b'Должны быть доступны:
21115/tcp
21116/tcp
21116/udp
21117/tcp
getent ahostsv4 example.relay.netАдрес должен соответствовать публичному IPv4 VPS.
Сначала создайте backup:
tar czf /root/rustdesk-data-backup.tar.gz -C /opt/rustdesk dataОстановите контейнеры:
cd /opt/rustdesk
docker compose downПолное удаление данных:
rm -rf /opt/rustdeskПоследняя команда уничтожает серверную пару ключей. После этого ранее настроенные клиенты потребуют новый публичный ключ.
MIT License — see LICENSE
Проект предоставляется как есть, без гарантий работы, совместимости или сохранности данных.
Администратор самостоятельно отвечает за сервер, DNS, firewall, обновления, резервные копии, безопасность инфраструктуры и соответствие применимому законодательству.
Перед использованием на важной системе проверьте доступность сервера, создайте backup приватного ключа и протестируйте подключение с внешней сети.