yao/sandbox/docker/vnc/start-vnc.sh
Max 28363b973e Fix sandbox compatibility, claude-proxy streaming, and rename playwright to browser
- Fix ListDir to support BusyBox/Alpine ls by falling back from GNU
  --time-style format, resolving CI test failures
- Update parseLS to handle both GNU (epoch) and BusyBox (date string) formats
- Fix claude-proxy streaming: always include usage in message_delta events
  to prevent Claude CLI from falling back to non-streaming mode
- Fix claude-proxy non-streaming: ensure usage is always present in responses
- Add paragraph separators between text blocks in Claude executor stream parser
- Translate VNC proxy UI from Chinese to English
- Rename sandbox-claude-playwright to sandbox-claude-browser across
  Dockerfiles, build scripts, and documentation

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 12:31:07 +08:00

132 lines
4 KiB
Bash

#!/bin/bash
# VNC services startup script
# Shared by sandbox-claude-browser and sandbox-claude-desktop
# Starts: Xvfb (virtual display) + Window Manager + x11vnc + websockify (noVNC)
set -e
DISPLAY_NUM="${DISPLAY_NUM:-99}"
RESOLUTION="${RESOLUTION:-1920x1080x24}"
VNC_PORT="${VNC_PORT:-5900}"
NOVNC_PORT="${NOVNC_PORT:-6080}"
VNC_PASSWORD="${VNC_PASSWORD:-}"
DESKTOP="${SANDBOX_DESKTOP:-fluxbox}"
export DISPLAY=:${DISPLAY_NUM}
echo "[VNC] Starting VNC services..."
echo "[VNC] Display: :${DISPLAY_NUM}"
echo "[VNC] Resolution: ${RESOLUTION}"
echo "[VNC] Desktop: ${DESKTOP}"
# Start Xvfb (virtual framebuffer)
echo "[VNC] Starting Xvfb..."
Xvfb :${DISPLAY_NUM} -screen 0 ${RESOLUTION} &
XVFB_PID=$!
sleep 1
if ! kill -0 $XVFB_PID 2>/dev/null; then
echo "[VNC] ERROR: Xvfb failed to start"
exit 1
fi
echo "[VNC] Xvfb started (PID: $XVFB_PID)"
# Start D-Bus session bus (required for XFCE)
if [ "$DESKTOP" = "xfce" ] || [ "$DESKTOP" = "xfce4" ]; then
echo "[VNC] Starting D-Bus session bus..."
if command -v dbus-launch &> /dev/null; then
eval $(dbus-launch --sh-syntax)
export DBUS_SESSION_BUS_ADDRESS
echo "[VNC] D-Bus started: $DBUS_SESSION_BUS_ADDRESS"
else
echo "[VNC] WARNING: dbus-launch not found, XFCE may have limited functionality"
fi
fi
# Start window manager / desktop environment
echo "[VNC] Starting ${DESKTOP}..."
case "$DESKTOP" in
xfce|xfce4)
# Run XFCE setup script if exists (for Yao branding)
if [ -x /usr/local/bin/setup-xfce.sh ]; then
echo "[VNC] Running XFCE setup..."
/usr/local/bin/setup-xfce.sh || true
fi
# XFCE desktop environment
startxfce4 &
;;
fluxbox)
# Run Fluxbox setup script if exists (Yao branding, disable toolbar)
if [ -x /usr/local/bin/setup-fluxbox.sh ]; then
echo "[VNC] Running Fluxbox setup..."
/usr/local/bin/setup-fluxbox.sh || true
fi
# Minimal window manager for Playwright
fluxbox &
sleep 1
# Set wallpaper with feh if available (for Yao branding)
WALLPAPER="$HOME/.local/share/wallpapers/yao-wallpaper.png"
if [ -f "$WALLPAPER" ] && command -v feh &> /dev/null; then
echo "[VNC] Setting wallpaper..."
feh --bg-center "$WALLPAPER" || true
fi
;;
*)
# Default to fluxbox
if [ -x /usr/local/bin/setup-fluxbox.sh ]; then
/usr/local/bin/setup-fluxbox.sh || true
fi
fluxbox &
sleep 1
# Set wallpaper with feh if available
WALLPAPER="$HOME/.local/share/wallpapers/yao-wallpaper.png"
if [ -f "$WALLPAPER" ] && command -v feh &> /dev/null; then
feh --bg-center "$WALLPAPER" || true
fi
;;
esac
sleep 2
# Start x11vnc server
echo "[VNC] Starting x11vnc on port ${VNC_PORT}..."
VNC_ARGS="-display :${DISPLAY_NUM} -forever -shared -rfbport ${VNC_PORT} -noxdamage"
if [ -n "$VNC_PASSWORD" ]; then
mkdir -p ~/.vnc
x11vnc -storepasswd "$VNC_PASSWORD" ~/.vnc/passwd
VNC_ARGS="$VNC_ARGS -rfbauth ~/.vnc/passwd"
else
VNC_ARGS="$VNC_ARGS -nopw"
fi
x11vnc $VNC_ARGS &
X11VNC_PID=$!
sleep 1
if ! kill -0 $X11VNC_PID 2>/dev/null; then
echo "[VNC] ERROR: x11vnc failed to start"
exit 1
fi
echo "[VNC] x11vnc started (PID: $X11VNC_PID)"
# Start websockify (noVNC WebSocket proxy)
echo "[VNC] Starting websockify on port ${NOVNC_PORT}..."
websockify --web=/usr/share/novnc/ ${NOVNC_PORT} localhost:${VNC_PORT} &
WEBSOCKIFY_PID=$!
sleep 1
if ! kill -0 $WEBSOCKIFY_PID 2>/dev/null; then
echo "[VNC] ERROR: websockify failed to start"
exit 1
fi
echo "[VNC] websockify started (PID: $WEBSOCKIFY_PID)"
echo "[VNC] =================================="
echo "[VNC] VNC services started successfully"
echo "[VNC] Desktop: ${DESKTOP}"
echo "[VNC] VNC port: ${VNC_PORT}"
echo "[VNC] noVNC port: ${NOVNC_PORT}"
echo "[VNC] =================================="
# Note: Don't wait here - let the entrypoint continue
# Background processes will keep running