Deploiement de l'API RustDesk via Docker sur Debian 13
Documentation technique pour l'installation du serveur d'API RustDesj Sur Debian 13.
Documentation Technique :
Table des matieres
- Prerequis
- Installation de Docker
- Verification de Docker
- Installation de Docker Compose
- Deploiement de l'API RustDesk
- Configuration
- Lancement
- Tests
- Exploitation
- Troubleshooting
1. Prerequis
1.1 Environnement de reference
| Element | Valeur | |------------------------|-----------------------------------------------| | Systeme d'exploitation | Debian 13 | | Adresse IP du serveur | 10.192.193.110 | | Services RustDesk | hbbs (21115, 21116) + hbbr (21117) | | Docker | Non installe | | Acces | root | | Exposition reseau | LAN uniquement (pas d'acces public) |
1.2 Verification de l'etat des services RustDesk existants
Toutes les commandes de cette section sont a executer en tant que root, depuis n'importe quel repertoire.
Verifier que hbbs et hbbr sont actifs :
systemctl status hbbs
systemctl status hbbr
Les deux services doivent afficher Active: active (running). Si l'un d'eux est stoppe, ne pas continuer et resoudre le probleme RustDesk en priorite.
Verifier les ports utilises par RustDesk :
ss -tlnp | grep -E '21115|21116|21117'
Resultat attendu : trois lignes avec les ports en etat LISTEN.
Verifier que le port 8080 (port par defaut de l'API) est libre :
ss -tlnp | grep 8080
Si la commande ne retourne rien, le port 8080 est disponible. Si une ligne s'affiche, le port est occupe : utiliser le port 8081 a la place (voir section 6.2).
1.3 Mise a jour du systeme
apt update && apt upgrade -y
Installer les dependances necessaires a l'ajout du depot Docker :
apt install -y ca-certificates curl gnupg lsb-release apt-transport-https
2. Installation de Docker
Toutes les commandes de cette section sont a executer en tant que root.
2.1 Ajouter la cle GPG officielle de Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
2.2 Ajouter le depot officiel Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
2.3 Mettre a jour la liste des paquets et installer Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.4 Activer et demarrer le service Docker
systemctl enable docker
systemctl start docker
2.5 Gestion des permissions utilisateur Docker
Par defaut, seul root peut utiliser Docker. Si un utilisateur non-root doit gerer les conteneurs (par exemple un compte nomme adminsisr), l'ajouter au groupe docker :
usermod -aG docker adminsisr
Pour que ce changement soit pris en compte sans deconnexion, executer la commande suivante en tant que cet utilisateur (pas en tant que root) :
newgrp docker
Cette etape est facultative si tout est gere en root.
3. Verification de Docker
3.1 Verifier que le service Docker tourne
systemctl status docker
La sortie doit afficher Active: active (running).
3.2 Verifier la version installee
docker version
docker compose version
3.3 Tester l'installation avec un conteneur de test
docker run --rm hello-world
La sortie doit contenir la ligne : Hello from Docker!
Ce conteneur est temporaire (--rm) et se supprime automatiquement apres execution. Il ne laisse aucun residus.
3.4 Verifier l'absence de conflit reseau avec RustDesk
Docker utilise le sous-reseau 172.17.0.0/16 par defaut pour son bridge interne. Verifier qu'il n'entre pas en conflit avec le reseau local :
ip route
Si 172.17.0.0/16 est deja utilise dans l'infrastructure locale, il faudra definir un sous-reseau Docker personnalise dans le docker-compose.yml (voir section 6.3).
4. Installation de Docker Compose
Docker Compose est installe automatiquement avec le paquet docker-compose-plugin a l'etape 2.3. Il est integre en tant que sous-commande de Docker.
Verifier l'installation :
docker compose version
Resultat attendu (les numeros de version peuvent varier) :
Docker Compose version v2.x.x
La syntaxe utilisee dans toute cette documentation est docker compose (avec espace), et non docker-compose (avec tiret). La version avec tiret est l'ancienne version autonome, desormais obsolete. Ne pas l'utiliser.
5. Deploiement de l'API RustDesk
5.1 Creer le repertoire de travail
Toutes les operations de deploiement se font depuis le repertoire /opt/rustdesk-api. Ce repertoire contiendra les fichiers de configuration et les donnees persistantes.
mkdir -p /opt/rustdesk-api
cd /opt/rustdesk-api
5.2 Creer le fichier de configuration de l'API
Ce fichier server.yaml est le fichier de configuration principal de l'application. Il doit exister avant de lancer le conteneur.
nano /opt/rustdesk-api/server.yaml
Coller le contenu suivant :
signKey: "CHANGEMOICECLEsecrete32caracteres"
debugMode: false
db:
driver: "sqlite"
dsn: "./server.db"
timeZone: "Europe/Paris"
showSql: false
httpConfig:
printRequestLog: false
staticdir: "/app/dist"
port: ":8080"
smtpConfig:
host: "127.0.0.1"
port: 1025
username: ""
password: ""
encryption: "none"
from: "rustdesk@localhost"
jobsConfig:
deviceCheckJob:
duration: 30
Enregistrer et quitter : Ctrl+O, Entree, Ctrl+X.
Remplacer la valeur de signKey par une chaine aleatoire de 32 caracteres minimum. Cette cle signe les tokens d'authentification. Elle ne doit jamais rester avec la valeur d'exemple. Pour en generer une :
openssl rand -base64 32
Copier la valeur affichee et la coller dans server.yaml a la place de CHANGEMOICECLEsecrete32caracteres, en conservant les guillemets.
5.3 Creer le fichier docker-compose.yml
nano /opt/rustdesk-api/docker-compose.yml
Coller le contenu suivant :
services:
rustdesk-api:
container_name: rustdesk-api-server-pro
image: ghcr.io/lantongxue/rustdesk-api-server-pro:latest
environment:
- TZ=Europe/Paris
volumes:
- ./server.yaml:/app/data/server.yaml
- ./data:/app/data
network_mode: host
restart: unless-stopped
Enregistrer et quitter : Ctrl+O, Entree, Ctrl+X.
Explication des parametres :
network_mode: host: le conteneur partage directement la pile reseau de l'hote. Cela evite toute complexite de NAT et permet a l'API d'acceder aux services hbbs/hbbr via localhost. C'est l'option recommandee dans ce contexte purement interne.restart: unless-stopped: le conteneur redemarrera automatiquement au boot du serveur et en cas de crash, sauf s'il est arrete manuellement avecdocker compose down.volumes: le repertoire./dataest monte pour persister la base de donnees SQLite entre les redemarrages du conteneur. Le fichierserver.yamlest monte separement pour permettre sa modification sans reconstruire l'image.
5.4 Creer le repertoire de donnees persistantes
mkdir -p /opt/rustdesk-api/data
chmod 755 /opt/rustdesk-api/data
6. Configuration
6.1 Restriction d'acces reseau (acces LAN uniquement)
Avec network_mode: host, le port 8080 ecoute sur toutes les interfaces du serveur. Pour garantir que l'API n'est accessible que depuis le reseau interne 10.192.193.0/24, ajouter une regle iptables :
iptables -A INPUT -p tcp --dport 8080 ! -s 10.192.193.0/24 -j DROP
Rendre cette regle persistante au redemarrage :
apt install -y iptables-persistent
netfilter-persistent save
6.2 Adaptation si le port 8080 est deja utilise
Si le port 8080 est occupe (detecte a l'etape 1.2), modifier server.yaml :
nano /opt/rustdesk-api/server.yaml
Modifier uniquement la ligne du port :
port: ":8081"
Enregistrer et quitter : Ctrl+O, Entree, Ctrl+X.
Adapter ensuite la regle iptables en remplacant 8080 par 8081 dans la commande de la section 6.1.
6.3 Verification de l'absence de conflit de ports avec RustDesk
Recapitulatif des ports utilises sur le serveur apres le deploiement :
| Service | Port(s) | Protocole | Gere par | |------------------|------------------|-----------|------------| | hbbs | 21115, 21116 | TCP/UDP | systemd | | hbbr | 21117 | TCP | systemd | | rustdesk-api | 8080 (ou 8081) | TCP | Docker |
Aucun conflit n'existe entre ces ports. Les services hbbs et hbbr ne sont pas modifies.
6.4 Connexion de l'API a l'infrastructure RustDesk existante
L'API RustDesk est une couche de gestion des utilisateurs et des sessions. Elle ne remplace pas hbbs ou hbbr et ne necessite aucune modification de leurs fichiers de configuration ni de leurs services systemd.
La connexion se fait cote client RustDesk. Sur chaque poste client, configurer les parametres du serveur comme suit :
- Serveur ID :
10.192.193.110 - Serveur relay :
10.192.193.110 - Serveur API :
http://10.192.193.110:8080
Ces parametres se trouvent dans le client RustDesk sous : Parametres > Reseau > Serveur ID/Relay > et dans le champ "API Server".
7. Lancement
Toutes les commandes de cette section sont a executer depuis /opt/rustdesk-api.
cd /opt/rustdesk-api
7.1 Telecharger l'image Docker
docker compose pull
Cette commande telecharge l'image ghcr.io/lantongxue/rustdesk-api-server-pro:latest depuis le registre GitHub. Cela peut prendre quelques minutes selon la bande passante disponible.
7.2 Demarrer le conteneur
docker compose up -d
L'option -d (detached) lance le conteneur en arriere-plan et rend la main au terminal.
7.3 Creer le compte administrateur
Cette etape est a effectuer une seule fois, juste apres le premier demarrage. Attendre 5 secondes apres docker compose up -d avant d'executer cette commande :
docker exec rustdesk-api-server-pro rustdesk-api-server-pro user add admin VotreMotDePasse --admin
Remplacer VotreMotDePasse par un mot de passe robuste. Ce compte est celui utilise pour se connecter a l'interface web de gestion.
7.4 Verifier que les services RustDesk sont toujours actifs
systemctl status hbbs
systemctl status hbbr
Les deux doivent toujours afficher Active: active (running). Le lancement de Docker et du conteneur ne doit pas avoir affecte ces services.
8. Tests
8.1 Verifier que le conteneur tourne
docker ps
Resultat attendu : une ligne avec rustdesk-api-server-pro et le statut Up.
docker compose ps
Affiche le statut specifique aux services definis dans le docker-compose.yml du repertoire courant.
8.2 Consulter les logs du conteneur
Afficher les logs en temps reel (quitter avec Ctrl+C) :
docker compose logs -f
Afficher uniquement les 50 dernieres lignes :
docker compose logs --tail=50
Verifier l'absence d'erreurs au demarrage dans ces logs. Les lignes normales indiquent que le serveur ecoute sur le port configure.
8.3 Tester la disponibilite de l'API depuis le serveur
curl -s http://127.0.0.1:8080/api/health-check
Une reponse JSON doit s'afficher. Si la commande reste bloquee ou retourne une erreur de connexion, consulter la section Troubleshooting.
8.4 Tester l'acces depuis le reseau interne
Executer depuis un autre poste du reseau interne (pas depuis le serveur lui-meme) :
curl -s http://10.192.193.110:8080/api/health-check
8.5 Verifier l'interface web d'administration
Depuis un navigateur sur le reseau interne, acceder a :
http://10.192.193.110:8080
La page de connexion de l'interface de gestion doit s'afficher. Se connecter avec le compte cree a l'etape 7.3 (exemple : admin / VotreMotDePasse).
8.6 Tester l'authentification via l'API
curl -s -X POST http://127.0.0.1:8080/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"VotreMotDePasse"}'
Une reponse JSON contenant un token est attendue. Cela confirme que l'authentification fonctionne correctement.
8.7 Verifier l'absence de regression sur les services RustDesk
ss -tlnp | grep -E '21115|21116|21117'
Les trois ports doivent toujours etre en ecoute.
systemctl is-active hbbs hbbr
Les deux lignes doivent afficher active.
9. Exploitation
9.1 Demarrer le conteneur API
cd /opt/rustdesk-api
docker compose up -d
9.2 Arreter le conteneur API
cd /opt/rustdesk-api
docker compose down
docker compose down arrete et supprime le conteneur, mais conserve les donnees. Le repertoire ./data est un volume monte sur l'hote : les donnees ne sont pas perdues.
9.3 Redemarrer le conteneur
cd /opt/rustdesk-api
docker compose restart
9.4 Mettre a jour l'image Docker
cd /opt/rustdesk-api
docker compose pull
docker compose up -d
Docker Compose detecte que l'image a change et recrée le conteneur avec la nouvelle version. Les donnees sont preservees grace au volume.
Supprimer les anciennes images pour liberer de l'espace disque :
docker image prune -f
9.5 Verification de la persistance au redemarrage du serveur
Le parametre restart: unless-stopped garantit que le conteneur redemarrera automatiquement si le serveur reboot, a condition que Docker soit actif.
Verifier que Docker demarre au boot :
systemctl is-enabled docker
La reponse doit etre enabled. Si ce n'est pas le cas :
systemctl enable docker
Tester le comportement en simulant un redemarrage :
reboot
Apres redemarrage, verifier :
docker ps
systemctl is-active hbbs hbbr
9.6 Ajouter un utilisateur supplementaire
Utilisateur standard :
docker exec rustdesk-api-server-pro rustdesk-api-server-pro user add nomutilisateur MotDePasse
Utilisateur administrateur :
docker exec rustdesk-api-server-pro rustdesk-api-server-pro user add nomutilisateur MotDePasse --admin
9.7 Sauvegarder les donnees de l'API
Les donnees (base SQLite) sont dans /opt/rustdesk-api/data/. Sauvegarder ce repertoire :
cp -r /opt/rustdesk-api/data /root/backup-rustdesk-api-$(date +%Y%m%d)
Pour une sauvegarde propre, stopper le conteneur avant de copier la base de donnees :
cd /opt/rustdesk-api
docker compose down
cp -r /opt/rustdesk-api/data /root/backup-rustdesk-api-$(date +%Y%m%d)
docker compose up -d
9.8 Consulter l'espace disque utilise par Docker
docker system df
9.9 Rappel : gestion des services RustDesk (sans lien avec Docker)
Ces commandes concernent uniquement hbbs et hbbr, geres par systemd, independamment de Docker :
systemctl restart hbbs
systemctl restart hbbr
systemctl stop hbbs
systemctl stop hbbr
10. Troubleshooting
Probleme 1 : Le conteneur ne demarre pas
Symptome : docker compose up -d s'execute sans erreur visible mais docker ps ne montre pas le conteneur.
Diagnostic :
cd /opt/rustdesk-api
docker compose logs
docker ps -a
L'option -a affiche tous les conteneurs, y compris ceux a l'etat Exited.
Cause : le fichier server.yaml est mal forme
Verifier la syntaxe :
cat /opt/rustdesk-api/server.yaml
S'assurer que l'indentation utilise uniquement des espaces (jamais de tabulations) et que les guillemets sont bien fermes. Corriger le fichier puis relancer :
docker compose down
docker compose up -d
Cause : le port 8080 est deja utilise
ss -tlnp | grep 8080
Si le port est occupe, modifier server.yaml pour utiliser le port 8081 (voir section 6.2) puis relancer :
docker compose down
docker compose up -d
Probleme 2 : L'interface web n'est pas accessible depuis le LAN
Symptome : curl http://127.0.0.1:8080/api/health-check fonctionne depuis le serveur, mais le navigateur depuis un autre poste ne repond pas.
Verifier les regles iptables :
iptables -L INPUT -n --line-numbers
Identifier si une regle bloque le port 8080. Si une regle trop restrictive a ete ajoutee par erreur, la supprimer par son numero de ligne :
iptables -D INPUT <numero_de_ligne>
Verifier si ufw est actif et bloque le port :
ufw status
Si ufw est actif, autoriser le port depuis le reseau interne :
ufw allow from 10.192.193.0/24 to any port 8080
Probleme 3 : Les services hbbs ou hbbr se sont arretes apres l'installation de Docker
Symptome : systemctl status hbbs affiche inactive ou failed.
Docker modifie les regles iptables au demarrage, ce qui peut dans de rares cas perturber des services reseau existants.
Diagnostic :
journalctl -u hbbs -n 50
journalctl -u hbbr -n 50
Solution : redemarrer les services et verifier les regles de la chaine FORWARD :
systemctl restart hbbs
systemctl restart hbbr
iptables -L FORWARD -n
Docker ajoute des regles dans la chaine FORWARD. Elles ne doivent pas bloquer les connexions vers les ports 21115, 21116 et 21117. En cas de persistance du probleme, redemarrer Docker avant les services RustDesk :
systemctl restart docker
systemctl restart hbbs
systemctl restart hbbr
Probleme 4 : Erreur lors de la creation du compte administrateur
Symptome : docker exec retourne une erreur ou n'affiche rien.
Verifier que le conteneur est en cours d'execution :
docker ps | grep rustdesk-api
Si le conteneur n'apparait pas, le demarrer :
cd /opt/rustdesk-api
docker compose up -d
Attendre 5 secondes que l'application s'initialise, puis relancer :
docker exec rustdesk-api-server-pro rustdesk-api-server-pro user add admin VotreMotDePasse --admin
Probleme 5 : L'image Docker ne peut pas etre telechargee
Symptome : docker compose pull echoue avec une erreur reseau ou un timeout.
Verifier la connectivite depuis le serveur :
curl -I https://ghcr.io
Si le serveur n'a pas acces a Internet, proceder en mode deconnecte. Depuis une machine disposant d'un acces Internet :
docker pull ghcr.io/lantongxue/rustdesk-api-server-pro:latest
docker save ghcr.io/lantongxue/rustdesk-api-server-pro:latest -o rustdesk-api.tar
Transferer le fichier vers le serveur via scp :
scp rustdesk-api.tar root@10.192.193.110:/opt/rustdesk-api/
Sur le serveur, charger l'image :
docker load -i /opt/rustdesk-api/rustdesk-api.tar
Demarrer le conteneur normalement :
cd /opt/rustdesk-api
docker compose up -d
Probleme 6 : Le conteneur redemarrage en boucle
Symptome : docker ps montre le conteneur avec le statut Restarting et un compteur de redemarrage croissant.
Diagnostic :
cd /opt/rustdesk-api
docker compose logs --tail=100
Cause : erreur de syntaxe dans server.yaml
Corriger le fichier server.yaml, puis :
docker compose down
docker compose up -d
Cause : permissions incorrectes sur le repertoire data
chmod 755 /opt/rustdesk-api/data
chown root:root /opt/rustdesk-api/data
Puis :
docker compose down
docker compose up -d
Probleme 7 : Audit des ports ouverts par Docker
Pour verifier qu'aucun port inattendu n'est ouvert par Docker :
ss -tlnp | grep docker
docker network ls
docker network inspect bridge
Ces commandes permettent d'auditer les reseaux Docker et de confirmer que seul le port 8080 (ou 8081) est expose par le conteneur.