File size: 2,626 Bytes
6504adf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/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