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_resolverCode-Sprache: PHP (php)
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: trueCode-Sprache: PHP (php)

Hallo Frank,
ich habe in meinem trafik-crowsec-stack schon einen Container laufen, welcher über Port 80/443 angebunden ist. Wie schaut den die config aus, wenn ich den Rustdesk-Webserver auf Port 8000 betreiben möchte und über https 4443 zugreifen möchte? Ich habe mir zwar schon die Ports soweit eingebaut, aber es hapert bei mir noch mit den EntryPoints im trafik-crowsec-stack
2.Thema: Kann man auch die Linux-Clients (z.B. Debian) bauen lassen mit dem Skipt?
Hallo Frank, danke für die Anleitung und auch die super Idee mit der Downloadseite.
Mir ist ein kleiner Fehler beim Generieren der Windows Quick-Start-EXE über dein build_client.sh Scriptaufgefallen.
Problem: Im Abschnitt
Windows Option 1: QUICKwird am Ende des Dateinamens hartcodiert ein zusätzliches Gleichheitszeichen eingefügt:RENAMED_EXE="rustdesk-host=${RUSTDESK_HOST},key=${KEY_PUB_SAFE}=.exe"Dies führt dazu, dass der Public Key im Dateinamen ungültig wird (da er nun auf ein
=zu viel endet), wodurch der RustDesk-Client den Key nicht mehr korrekt ausliest und keine Verbindung zum Server herstellen kann.Lösung: Das zusätzliche
=vor der Dateiendung muss entfernt werden, da der Key in der Variable${KEY_PUB_SAFE}bereits das korrekte Base64-Format (inkl. notwendigem Padding) besitzt.# Vorher: RENAMED_EXE=“rustdesk-host=${RUSTDESK_HOST},key=${KEY_PUB_SAFE}=.exe”
# Nachher: RENAMED_EXE=“rustdesk-host=${RUSTDESK_HOST},key=${KEY_PUB_SAFE}.exe”
Hallo Frank, danke nochmal für die tolle Anleitung.
Ich habe Aliase zum Öffnen und Schließen der Ports angelegt, weil ich Rustdesk nur gelegentlich brauche und ich die Ports nicht dauerhaft geöffnet haben möchte.
Wer die ufw aktiviert hat muss die folgenden Befehle nehmen:
# Zum Öffnen der Ports
sudo ufw allow proto tcp from any to any port 21115,21116,21117 && sudo ufw allow 21116/udp && sudo ufw status
# Zum Schließen der Ports
sudo ufw deny proto tcp from any to any port 21115,21116,21117 && sudo ufw deny 21116/udp && sudo ufw status
Zum dauerhaften Anlegen der Aliase kann ich das Ubuntu-Wiki empfehlen, da ist das Anlegen der Aliase sehr gut beschrieben.
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.