Spaces:
Paused
Paused
| # | |
| # 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 | |