From d38d62ba21f052ccf2c242e0656d24aa5646391f Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 21 Jul 2026 00:20:21 +0200 Subject: [PATCH] fix(vnc): Bridge erreicht QEMU-VNC (Kern-Bug) + Screenshots ins Projekt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live-VNC rendert nie, weil die Bridge die VM nie erreichte: QEMU band 127.0.0.1 (Host-Loopback) und host.docker.internal resolved in der Bridge gar nicht. - aria-vm: --vnc-bind (Default 127.0.0.1 / env ARIA_VM_VNC_BIND). - Brain: _docker_gateway() (aus /proc/net/route) → boot bindet VNC an die Docker-Gateway-IP (container-erreichbar, NICHT im LAN/Internet). - docker-compose: bridge bekommt extra_hosts host.docker.internal:host-gateway. - Screenshot-Endpoint kopiert das PNG zusaetzlich nach /shared/projects//screenshots/ → erscheint im Dateien-Panel. End-to-end auf dem Host validiert: Bridge liest den RFB-Handshake (b'RFB 003.008\n') von der Gateway-gebundenen VNC. aria-vm bereits live. py/bash clean. Deploy: brain rebuild + bridge NEU (extra_hosts). Co-Authored-By: Claude Opus 4.8 --- aria-brain/main.py | 36 +++++++++++++++++++++++++++++++++++- docker-compose.yml | 2 ++ host-provisioning/aria-vm | 10 ++++++++-- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/aria-brain/main.py b/aria-brain/main.py index 5690e17..dbf5c10 100644 --- a/aria-brain/main.py +++ b/aria-brain/main.py @@ -946,6 +946,23 @@ def project_file(project_id: str, path: str, binary: bool = False): _ARIA_VM_HOST = os.environ.get("ARIA_VM_SSH_HOST", "aria-wohnung") +def _docker_gateway() -> str: + """Docker-Gateway-IP (= Host-IP auf dem Container-Netz), an die QEMU sein VNC + binden soll: von der Bridge erreichbar, aber NICHT im LAN/Internet. Aus + /proc/net/route (Default-Route), kein `ip`-Tool noetig.""" + try: + import socket as _sock + import struct as _struct + with open("/proc/net/route") as f: + for line in f.readlines()[1:]: + fields = line.strip().split() + if len(fields) >= 3 and fields[1] == "00000000" and int(fields[3], 16) & 2: + return _sock.inet_ntoa(_struct.pack(" ' oder ein Medium angeben." local args=(-name "${name}" -m "${mem}" - -vnc "127.0.0.1:${display}" + -vnc "${vncbind}:${display}" -monitor "unix:${d}/monitor.sock,server,nowait" -pidfile "${d}/pid" -daemonize) [[ -n "${disk}" ]] && args+=(-drive "file=${disk},format=qcow2") @@ -132,7 +138,7 @@ cmd_boot() { args+=(-boot "${bootdev}") "${bin}" "${args[@]}" - echo "VM '${name}' gestartet (${arch}) — VNC 127.0.0.1:${display} (Port $((5900+display)))." + echo "VM '${name}' gestartet (${arch}) — VNC ${vncbind}:${display} (Port $((5900+display)))." echo "vnc_display=${display} vnc_port=$((5900+display))" }