From 51438aa5db1f39667402cb44e2bbee96a3c192fc Mon Sep 17 00:00:00 2001 From: Jamie Brunton Date: Sat, 8 Aug 2026 15:16:51 +0100 Subject: [PATCH] Keep x11vnc alive for remote login --- docker/entrypoint.sh | 23 ++++++++++++++++++++++- tests/vnc-entrypoint.test.ts | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/vnc-entrypoint.test.ts diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 96aa255..d85df72 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -54,7 +54,7 @@ if command -v fluxbox >/dev/null 2>&1; then fluxbox >/dev/null 2>&1 & fi -VNC_ARGS=(-display "${DISPLAY}" -forever -shared -rfbport "${VNC_PORT}" -nopw_warn) +VNC_ARGS=(-display "${DISPLAY}" -forever -shared -rfbport "${VNC_PORT}") if [ -n "${VNC_PASSWORD:-}" ]; then mkdir -p /root/.vnc x11vnc -storepasswd "${VNC_PASSWORD}" /root/.vnc/passwd >/dev/null @@ -68,6 +68,27 @@ fi x11vnc "${VNC_ARGS[@]}" >/var/log/x11vnc.log 2>&1 & X11VNC_PID=$! +VNC_READY=0 +for i in $(seq 1 50); do + if ! kill -0 "${X11VNC_PID}" 2>/dev/null; then + echo "[entrypoint] FATAL: x11vnc exited before becoming ready" >&2 + cat /var/log/x11vnc.log >&2 + exit 1 + fi + if (: /dev/null; then + echo "[entrypoint] VNC server is ready after ${i} checks" + VNC_READY=1 + break + fi + sleep 0.2 +done + +if [ "${VNC_READY}" != "1" ]; then + echo "[entrypoint] FATAL: x11vnc did not listen on port ${VNC_PORT} after 10s" >&2 + cat /var/log/x11vnc.log >&2 + exit 1 +fi + echo "[entrypoint] starting noVNC (websockify) on :${NOVNC_PORT}" websockify --web "${NOVNC_WEB_DIR}" "${NOVNC_PORT}" "localhost:${VNC_PORT}" \ >/var/log/websockify.log 2>&1 & diff --git a/tests/vnc-entrypoint.test.ts b/tests/vnc-entrypoint.test.ts new file mode 100644 index 0000000..4cf752f --- /dev/null +++ b/tests/vnc-entrypoint.test.ts @@ -0,0 +1,16 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; + +describe('VNC container entrypoint', () => { + it('starts x11vnc with supported arguments and verifies its port before noVNC', () => { + const script = fs.readFileSync(path.resolve('docker/entrypoint.sh'), 'utf8'); + + expect(script).not.toContain('-nopw_warn'); + expect(script).toContain('kill -0 "${X11VNC_PID}"'); + expect(script).toContain('/dev/tcp/127.0.0.1/${VNC_PORT}'); + expect(script.indexOf('VNC server is ready')).toBeLessThan( + script.indexOf('starting noVNC'), + ); + }); +});