#!/bin/bash set -euo pipefail export DISPLAY="${DISPLAY:-:1}" mkdir -p /workspace /home/box/Desktop /home/box/.config/autostart /tmp chmod 1777 /workspace /tmp cp -n /usr/share/lazyboy/desktop/*.desktop /home/box/Desktop/ 2>/dev/null || true chmod +x /home/box/Desktop/*.desktop 2>/dev/null || true if [[ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]]; then eval "$(dbus-launch --sh-syntax)" fi display_number="${DISPLAY#:}" display_number="${display_number%%.*}" if [[ ! "$display_number" =~ ^[0-9]+$ ]]; then echo "Unsupported local display: $DISPLAY" >&2 exit 1 fi if ! xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then lock_file="/tmp/.X${display_number}-lock" lock_pid="" if [[ -f "$lock_file" ]]; then lock_pid=$(tr -d '[:space:]' < "$lock_file") fi if [[ "$lock_pid" =~ ^[0-9]+$ ]] && kill -0 "$lock_pid" 2>/dev/null; then echo "Display lock is held by live process $lock_pid" >&2 exit 1 fi rm -f -- "$lock_file" "/tmp/.X11-unix/X${display_number}" fi Xvfb "$DISPLAY" -screen 0 1280x720x24 -ac +extension GLX +render -noreset >/tmp/xvfb.log 2>&1 & for _ in 1 2 3 4 5 6 7 8 9 10; do if xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then break fi sleep 0.3 done if ! xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then cat /tmp/xvfb.log >&2 exit 1 fi startxfce4 >/tmp/xfce.log 2>&1 & # Only websockify (same container) talks to VNC; keep the passwordless port # off the Docker bridge so sibling containers cannot attach. (libvncserver # still binds [::]:5900, but the container has no routable IPv6 address.) x11vnc -display "$DISPLAY" -forever -shared -nopw -rfbport 5900 -listen localhost -xkb -repeat -noxdamage >/tmp/x11vnc.log 2>&1 & if command -v autocutsel >/dev/null 2>&1; then autocutsel -fork -selection CLIPBOARD >/dev/null 2>&1 || true autocutsel -fork -selection PRIMARY >/dev/null 2>&1 || true fi websockify --web /usr/share/novnc 6080 localhost:5900 >/tmp/novnc.log 2>&1 & echo "[lazyboy-box] desktop up display=$DISPLAY vnc=6080 xfce chrome terminal" >/tmp/start-desktop.log trap 'node /usr/local/bin/stop-browser.mjs || python3 /usr/local/bin/stop-browser.py; exit 0' TERM INT while true; do sleep 3600 & wait $! done