magic / scripts /start-hf.sh
diamond-in's picture
Rename start-hf.sh to scripts/start-hf.sh
fdc7836 verified
#!/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