FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive ENV DISPLAY=:1 ENV HOME=/tmp/godot-home ENV GODOT_PROJECTS=/data/GodotProjects # ============================================================ # Install desktop, VNC, noVNC and libraries # ============================================================ RUN apt-get update && apt-get install -y \ xfce4 \ xfce4-goodies \ xfce4-terminal \ tigervnc-standalone-server \ novnc \ websockify \ dbus-x11 \ wget \ curl \ unzip \ git \ git-lfs \ ca-certificates \ mesa-utils \ libgl1-mesa-dri \ libglx-mesa0 \ libegl1 \ libx11-6 \ libxcursor1 \ libxinerama1 \ libxrandr2 \ libxi6 \ libxrender1 \ libxfixes3 \ libfontconfig1 \ libfreetype6 \ libasound2t64 \ libpulse0 \ xterm \ && rm -rf /var/lib/apt/lists/* # ============================================================ # Install Godot # ============================================================ RUN cd /tmp && \ wget -O godot.zip \ https://github.com/godotengine/godot/releases/download/4.7.1-stable/Godot_v4.7.1-stable_linux.x86_64.zip && \ unzip godot.zip && \ mv Godot_v4.7.1-stable_linux.x86_64 /usr/local/bin/godot && \ chmod +x /usr/local/bin/godot && \ rm -f godot.zip # ============================================================ # Create XFCE startup script # ============================================================ RUN printf '%s\n' \ '#!/bin/sh' \ 'unset SESSION_MANAGER' \ 'unset DBUS_SESSION_BUS_ADDRESS' \ 'export XDG_CURRENT_DESKTOP=XFCE' \ 'export XDG_SESSION_DESKTOP=xfce' \ 'export XDG_CONFIG_DIRS=/etc/xdg/xdg-xfce:/etc/xdg' \ 'export XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share:/usr/share' \ 'dbus-launch --exit-with-session startxfce4' \ > /usr/local/bin/start-xfce.sh \ && chmod +x /usr/local/bin/start-xfce.sh # ============================================================ # Run as Hugging Face UID 1000 # ============================================================ USER 1000 WORKDIR /tmp EXPOSE 7860 # ============================================================ # Start VNC + XFCE + noVNC + Godot # ============================================================ CMD ["bash", "-c", "\ set -e; \ \ echo '========================================'; \ echo ' GODOT REMOTE EDITOR'; \ echo '========================================'; \ \ if [ -z \"$VNC_PASSWORD\" ]; then \ echo 'ERROR: VNC_PASSWORD is not configured.'; \ echo 'Create a Space Secret named VNC_PASSWORD.'; \ exit 1; \ fi; \ \ if [ ! -d /data ]; then \ echo 'ERROR: /data Storage Bucket is not mounted.'; \ exit 1; \ fi; \ \ mkdir -p /tmp/godot-home; \ mkdir -p /tmp/godot-home/.config; \ mkdir -p /tmp/godot-home/.vnc; \ mkdir -p /data/GodotProjects; \ \ export HOME=/tmp/godot-home; \ \ VNC_DIR=$(mktemp -d /tmp/godot-vnc-XXXXXX); \ \ echo 'Creating VNC password...'; \ printf '%s\\n' \"$VNC_PASSWORD\" | vncpasswd -f > \"$VNC_DIR/passwd\"; \ chmod 600 \"$VNC_DIR/passwd\"; \ \ echo 'Cleaning old display files...'; \ vncserver -kill :1 >/dev/null 2>&1 || true; \ rm -f /tmp/.X1-lock; \ rm -f /tmp/.X11-unix/X1; \ mkdir -p /tmp/.X11-unix; \ \ echo 'Starting VNC + XFCE desktop...'; \ vncserver :1 \ -geometry 1280x720 \ -depth 24 \ -localhost no \ -rfbauth \"$VNC_DIR/passwd\" \ -xstartup /usr/local/bin/start-xfce.sh; \ \ sleep 6; \ \ echo 'Starting noVNC...'; \ websockify \ --web=/usr/share/novnc \ 7860 \ localhost:5901 & \ \ sleep 4; \ \ echo 'Starting Godot Editor...'; \ echo 'Persistent projects: /data/GodotProjects'; \ \ godot \ --editor \ --path /data/GodotProjects \ >/tmp/godot.log 2>&1 & \ \ echo '========================================'; \ echo ' GODOT IS RUNNING'; \ echo '========================================'; \ echo 'Browser port: 7860'; \ echo 'Projects: /data/GodotProjects'; \ echo '========================================'; \ \ wait \ "]