#!/bin/bash # # Hugging Face VNC Server Startup Script # This script starts the virtual display and VNC server # Optimized for Hugging Face Spaces constraints (no root, single port) # set -e echo "==========================================" echo "HF Custom VNC Server" echo "==========================================" echo "" # Configuration XVFB_RESOLUTION="${XVFB_RESOLUTION:-1280x720x24}" XVFB_DISPLAY="${XVFB_DISPLAY:-:99}" HF_PORT="${HF_PORT:-7860}" VNC_HOST="127.0.0.1" echo "Configuration:" echo " Resolution: $XVFB_RESOLUTION" echo " Display: $XVFB_DISPLAY" echo " Port: $HF_PORT" echo "" # Check if Xvfb is available if command -v Xvfb &> /dev/null; then echo "[OK] Xvfb found" XVFB_AVAILABLE=true else echo "[WARN] Xvfb not found, using fallback mode" XVFB_AVAILABLE=false fi # Check if xdotool is available for input simulation if command -v xdotool &> /dev/null; then echo "[OK] xdotool found" XDOTOOL_AVAILABLE=true else echo "[WARN] xdotool not found, input simulation will be limited" XDOTOOL_AVAILABLE=false fi # Start virtual display start_virtual_display() { if [ "$XVFB_AVAILABLE" = true ]; then echo "" echo "Starting Xvfb..." Xvfb $XVFB_DISPLAY \ -screen 0 $XVFB_RESOLUTION \ -ac \ +extension GLX \ +render \ -noreset \ & XVFB_PID=$! echo "Xvfb started (PID: $XVFB_PID)" # Wait for Xvfb to be ready sleep 2 # Export DISPLAY environment variable export DISPLAY=$XVFB_DISPLAY # Verify Xvfb is running if ! kill -0 $XVFB_PID 2>/dev/null; then echo "[ERROR] Xvfb failed to start" exit 1 fi echo "Virtual display ready" else echo "" echo "Starting in fallback mode (simulated display)..." export DISPLAY=$XVFB_DISPLAY fi } # Start the VNC server start_vnc_server() { echo "" echo "Starting VNC server..." # Set environment variables export NODE_ENV=production export DISPLAY=${DISPLAY:-$XVFB_DISPLAY} # Start Next.js application echo "Starting Next.js application..." exec npm run start -- -p $HF_PORT } # Cleanup function cleanup() { echo "" echo "Shutting down..." if [ ! -z "$XVFB_PID" ]; then kill $XVFB_PID 2>/dev/null || true fi pkill -f "next-server" 2>/dev/null || true pkill -f "next start" 2>/dev/null || true echo "Cleanup complete" } # Set trap for cleanup trap cleanup EXIT INT TERM # Main execution start_virtual_display start_vnc_server