RustDesk ist eine Open-Source-Software zur Fernsteuerung von Endgeräten (Windows/macOS/Linux, Smartphones) und eine kostenfreie Alternative z. B. zu TeamViewer. Für die Kommunikation benötigt RustDesk einen zentralen Server (ID/Rendezvous + optional Relay). In dieser Anleitung setzen wir den Server per docker-compose.yml auf und stellen zusätzlich vorkonfigurierte Client-Downloads bereit.
| Datum | Änderungen |
|---|---|
| 26.12.2025 | Erstellung dieser Anleitung |
Dies ist die ursprüngliche Anleitung, welcher hier als Grundlage dient: https://goneuland.de/rustdesk-server-mit-docker-compose-installieren/
Gewählte Optionen in dieser Anleitung
Netzwerk/Reverse Proxy
- RustDesk ist vollständig über Traefik veröffentlicht – auch die UDP-Ports (z. B. 21116/udp).
- Ports werden nicht direkt am Container gebunden, sondern über Traefik EntryPoints geroutet (TCP/UDP).
Sicherheit
- ENCRYPTED_ONLY=1 aktiv (nur verschlüsselte Verbindungen).
- Web-/App-Endpunkte /ws/id und /ws/relay werden in dieser Anleitung bewusst ausgelassen (Sicherheits- und Angriffsflächen-Reduktion), da kein Web-Client benötigt wird.
Support/Bedienung
- Zur Vereinfachung des Supports wird eine kleine Weboberfläche (statischer Downloadbereich) bereitgestellt:
- Einfache Links für Windows/macOS
- Zentrale TOML-Konfigurationen
- VERSION.txt zur Transparenz, welche RustDesk-Version aktuell ausgerollt wird
Clients
- Windows: 3 Optionen
- Quick (EXE mit eingebetteter Serverinfo via Dateiname)
- Unblock (Startscript reduziert typische Windows-“Download-Markierung”-Effekte)
- Standard (klassische start.cmd)
- macOS: ZIP enthält DMG + install.command
- Zwei TOMLs:
- RustDesk2.min.toml (ID + Key)
- RustDesk2.full.toml (ID + Relay + Key)
1) Grundvoraussetzungen
- Docker Engine + Docker Compose
- Traefik mit Crowdsec ist installiert bspw: Traefik V3 Installation, Konfiguration und CrowdSec-Security
- Traefik läuft bereits und nutzt ein externes Docker-Netzwerk (z. B. proxy)
- Tools fürs Build-Skript:
- curl, jq, zip
apt update apt install -y curl jq zip
2) Ordnerstruktur anlegen
mkdir -p /opt/containers/rustdesk/{db,data,clients/{windows,macos,config},client-config}
3) Keys vorab erzeugen (optional – wenn nicht vorhanden)
Damit du KEY_PRIV/KEY_PUB vor dem ersten Start sauber hast (und reproduzierbar in .env ablegst), kannst du die Keys mit dem RustDesk-Tooling erzeugen:
docker run --rm --entrypoint /usr/bin/rustdesk-utils \ ghcr.io/rustdesk/rustdesk-server-s6:latest genkeypair
Die Ausgabe enthält direkt:
- KEY_PRIV=…
- KEY_PUB=…
Diese Werte kopierst du anschließend in die .env.
Private Key niemals teilen.
4) .env anlegen (Beispiel ohne echte Domain)
Nun erstellen wir eine Konfigurationsdatei:
nano /opt/containers/rustdesk/.env
# --- RustDesk --- RUSTDESK_HOST=rustdesk.example.org RUSTDESK_RELAY=rustdesk.example.org:21117 RUSTDESK_ENCRYPTED_ONLY=1 RUSTDESK_DB_URL=/db/db_v2.sqlite3 RUST_LOG=info # Keys (aus Schritt 3 übernehmen!) KEY_PRIV=<<<YOUR_PRIVATE_KEY_BASE64>>> KEY_PUB=<<<YOUR_PUBLIC_KEY_BASE64>>> # --- Traefik / Networking --- TRAEFIK_NETWORK=proxy EP_HBBS_UDP=hbbs-udp EP_HBBS_TCP_1=hbbs-tcp-1 EP_HBBS_TCP_2=hbbs-tcp-2 EP_HBBR_TCP_1=hbbr-tcp-1 EP_WEBSECURE=websecure TRAEFIK_CERTRESOLVER=http_resolver
Notwendige Anpassungen:
- Domain bei RUSTDESK_HOST anpassen (“rustdesk.euredomain.de″)
- KEY_PRIV aus Schritt 3 oder vorhandene
- KEY_PUB aus Schritt 3 oder vorhandene
- (optional) TRAEFIK_CERTRESOLVER Https resolver bspw. http_resolver oder tls_resolver
5) Docker Compose anlegen
Nun die eigentliche Docker Compose Datei:
nano /opt/containers/rustdesk/docker-compose.yml
Hinweis: Die RustDesk-Ports werden komplett über Traefik geroutet, inkl. UDP. /ws/id und /ws/relay sind bewusst nicht aktiv.
services:
rustdesk:
container_name: rustdesk
image: ghcr.io/rustdesk/rustdesk-server-s6:latest
restart: unless-stopped
volumes:
- ./db:/db
- ./data:/data
networks:
proxy: null
environment:
- RELAY=${RUSTDESK_RELAY}
- ENCRYPTED_ONLY=${RUSTDESK_ENCRYPTED_ONLY}
- DB_URL=${RUSTDESK_DB_URL}
- KEY_PRIV=${KEY_PRIV}
- KEY_PUB=${KEY_PUB}
- RUST_LOG=${RUST_LOG:-info}
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
healthcheck:
test: ["CMD-SHELL", "pgrep hbbs >/dev/null && pgrep hbbr >/dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
labels:
- traefik.enable=true
- traefik.docker.network=${TRAEFIK_NETWORK}
# UDP 21116
- traefik.udp.routers.rustdesk-udp.entrypoints=${EP_HBBS_UDP}
- traefik.udp.routers.rustdesk-udp.service=rustdesk-udp
- traefik.udp.services.rustdesk-udp.loadbalancer.server.port=21116
# TCP 21115
- traefik.tcp.routers.rustdesk-tcp-21115.rule=HostSNI(`*`)
- traefik.tcp.routers.rustdesk-tcp-21115.entrypoints=${EP_HBBS_TCP_1}
- traefik.tcp.routers.rustdesk-tcp-21115.service=rustdesk-tcp-21115
- traefik.tcp.services.rustdesk-tcp-21115.loadbalancer.server.port=21115
# TCP 21116
- traefik.tcp.routers.rustdesk-tcp-21116.rule=HostSNI(`*`)
- traefik.tcp.routers.rustdesk-tcp-21116.entrypoints=${EP_HBBS_TCP_2}
- traefik.tcp.routers.rustdesk-tcp-21116.service=rustdesk-tcp-21116
- traefik.tcp.services.rustdesk-tcp-21116.loadbalancer.server.port=21116
# TCP 21117 (Relay)
- traefik.tcp.routers.rustdesk-tcp-21117.rule=HostSNI(`*`)
- traefik.tcp.routers.rustdesk-tcp-21117.entrypoints=${EP_HBBR_TCP_1}
- traefik.tcp.routers.rustdesk-tcp-21117.service=rustdesk-tcp-21117
- traefik.tcp.services.rustdesk-tcp-21117.loadbalancer.server.port=21117
# /ws/id und /ws/relay bewusst NICHT aktiv (Sicherheitsgründe)
# Kleine Weboberfläche für Downloads & Configs (Support-Vereinfachung)
rustdesk-clients:
container_name: rustdesk-clients
image: joseluisq/static-web-server:2-alpine
restart: unless-stopped
command:
- static-web-server
- --port=80
- --root=/srv
- --log-level=info
- --compression=true
- --cache-control-headers=true
- --ignore-hidden-files=true
- --disable-symlinks=true
- --health=true
volumes:
- ./clients:/srv:ro
networks:
proxy: null
labels:
- traefik.enable=true
- traefik.docker.network=${TRAEFIK_NETWORK}
- traefik.http.routers.rustdesk-clients.rule=Host(`${RUSTDESK_HOST}`)
- traefik.http.routers.rustdesk-clients.entrypoints=${EP_WEBSECURE}
- traefik.http.routers.rustdesk-clients.tls.certresolver=${TRAEFIK_CERTRESOLVER}
- traefik.http.services.rustdesk-clients.loadbalancer.server.port=80
networks:
proxy:
external: true

Hallo
Frank, ich habe Rustdesk mal neu nach deiner Anleitung installiert und es hat alles geklappt. Ich kann Verbindungen aufbauen. Aber nur wenn ich den Relayserver mit eintrage. Auch die Webseite mit dem Clients ist echt super. Ich muss mich mal noch weiter damit beschäftigen. Aber vielen Dank für deine gute Anleitung.