# RustDesk-Server (hbbs/hbbr) in k3s, Umzug vom Portainer-Stack „rustdesk“ auf appsrv08 (15.10.2026). # Läuft auf ops: ansible-playbook playbooks/rustdesk-k3s.yml [-e rustdesk_public_host=] # # Voraussetzung: Schlüsselpaar des bisherigen Servers unter /root/.config/knaster/rustdesk/{id_ed25519,id_ed25519.pub} # auf ops (aus dem Docker-Volume rustdesk_rustdesk-data von appsrv08, Pfad /root). Damit bleiben die in den # Clients hinterlegten Public Keys gültig. Die Clients selbst zeigen weiter auf appsrv08, bis ihre # Server-Adresse umgestellt wird (Installer-Name im Stack rustdesk-updater und bestehende Installationen). - name: RustDesk nach k3s hosts: localhost connection: local gather_facts: false vars: manifest: "{{ playbook_dir }}/../../../../deploy/k8s/rustdesk/rustdesk.yaml" key_dir: /root/.config/knaster/rustdesk # Adresse, die hbbs den Clients als Relay nennt (Port 21117). Standard: die k3s-VM; ServiceLB stellt die Ports # auf jeder Knoten-Adresse bereit. Nach DHCP-Reservierung/DNS-Name hier bzw. per -e anpassen. rustdesk_public_host: "{{ hostvars['k3s'].ansible_host }}" tasks: - name: Schlüsseldateien vorhanden? ansible.builtin.stat: path: "{{ key_dir }}/{{ item }}" loop: [id_ed25519, id_ed25519.pub] register: keys failed_when: not keys.stat.exists - name: Namespace ansible.builtin.shell: > kubectl create namespace rustdesk --dry-run=client -o yaml | kubectl apply -f - register: ns changed_when: "'created' in ns.stdout" - name: Secret rustdesk-keys aus den Schlüsseldateien ansible.builtin.shell: > kubectl -n rustdesk create secret generic rustdesk-keys --from-file=id_ed25519={{ key_dir }}/id_ed25519 --from-file=id_ed25519.pub={{ key_dir }}/id_ed25519.pub --dry-run=client -o yaml | kubectl apply -f - register: secret changed_when: "'configured' in secret.stdout or 'created' in secret.stdout" no_log: true - name: Manifest mit Relay-Adresse anwenden ansible.builtin.shell: > sed 's/__RELAY_HOST__/{{ rustdesk_public_host }}/' {{ manifest }} | kubectl apply -f - register: dep changed_when: "'configured' in dep.stdout or 'created' in dep.stdout" - name: Neustart, wenn sich nur das Secret geändert hat ansible.builtin.command: kubectl -n rustdesk rollout restart deployment/rustdesk when: secret.changed and not dep.changed - name: Warten, bis bereit ansible.builtin.command: kubectl -n rustdesk rollout status deployment/rustdesk --timeout=300s changed_when: false - name: Public Key im Cluster entspricht der Datei (Image hat keine Shell, daher über das Secret) ansible.builtin.shell: > set -o pipefail; kubectl -n rustdesk get secret rustdesk-keys -o go-template='{{ "{{" }}index .data "id_ed25519.pub"{{ "}}" }}' | base64 -d | cmp - {{ key_dir }}/id_ed25519.pub args: {executable: /bin/bash} changed_when: false - name: Ports von außen erreichbar (ID-Server 21116/tcp, Relay 21117/tcp auf {{ rustdesk_public_host }}) ansible.builtin.wait_for: host: "{{ rustdesk_public_host }}" port: "{{ item }}" timeout: 30 loop: [21115, 21116, 21117, 21118, 21119] - name: Ergebnis ansible.builtin.debug: msg: "RustDesk in k3s bereit: ID-Server/Relay {{ rustdesk_public_host }}, Public Key {{ lookup('file', key_dir + '/id_ed25519.pub') }}"