FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive # Update with future time fix and install build dependencies RUN apt-get -o Acquire::Max-FutureTime=86400 update -y RUN apt-get install -y build-essential xorg libx11-dev libxext-dev libbsd-dev libpthread-stubs0-dev libasound2-dev libxrandr-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libxcursor-dev libxinerama-dev libwayland-dev libxkbcommon-dev # Build the miniRT project WORKDIR /best_rt COPY . . RUN make # Install VNC and graphics dependencies RUN apt-get update && apt-get install -y \ tigervnc-standalone-server \ python3 \ python3-pip \ wget \ git \ openbox \ x11-utils \ libgl1-mesa-dev \ libglu1-mesa-dev \ net-tools \ procps \ lsof \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install websockify RUN pip3 install websockify --break-system-packages # Install noVNC RUN git clone https://github.com/novnc/noVNC.git /opt/noVNC # Create VNC directory and set password RUN mkdir -p /root/.vnc && \ echo "password" | vncpasswd -f > /root/.vnc/passwd && \ chmod 600 /root/.vnc/passwd RUN rm /opt/noVNC/*.html RUN mv /best_rt/vnc/minimal.html /opt/noVNC/vnc.html RUN echo '\n\ \n\ \n\ miniRT\n\ \n\ \n\ \n\ \n\ \n\ ' > /opt/noVNC/minimal.html # Create VNC startup script that keeps session alive RUN echo '#!/bin/bash\n\ export USER=root\n\ export HOME=/root\n\ xsetroot -solid grey\n\ # Start openbox to keep session alive\n\ openbox-session &\n\ # Keep the session running\n\ while true; do sleep 3600; done\n\ ' > /root/.vnc/xstartup && chmod +x /root/.vnc/xstartup # Create connection monitor script RUN echo '#!/bin/bash\n\ \n\ APP_PID=""\n\ CLIENT_TIMEOUT=30 # Stop app after 30 seconds of no clients\n\ CHECK_INTERVAL=5 # Check every 5 seconds\n\ \n\ log() {\n\ echo "[$(date "+%H:%M:%S")] $1"\n\ }\n\ \n\ has_vnc_clients() {\n\ # Check for active VNC connections\n\ netstat -tn 2>/dev/null | grep -q ":5901.*ESTABLISHED"\n\ }\n\ \n\ has_websocket_clients() {\n\ # Check for active WebSocket connections (noVNC)\n\ netstat -tn 2>/dev/null | grep -q ":6080.*ESTABLISHED"\n\ }\n\ \n\ start_app() {\n\ if [ -z "$APP_PID" ] || ! kill -0 "$APP_PID" 2>/dev/null; then\n\ log "Starting miniRT application..."\n\ cd /best_rt\n\ /best_rt/miniRT /best_rt/scenes/multilight.rt &\n\ APP_PID=$!\n\ log "miniRT started with PID: $APP_PID"\n\ fi\n\ }\n\ \n\ stop_app() {\n\ if [ -n "$APP_PID" ] && kill -0 "$APP_PID" 2>/dev/null; then\n\ log "Stopping miniRT application (PID: $APP_PID)..."\n\ kill "$APP_PID" 2>/dev/null\n\ wait "$APP_PID" 2>/dev/null\n\ APP_PID=""\n\ log "miniRT stopped"\n\ fi\n\ }\n\ \n\ # Main monitoring loop\n\ last_client_time=0\n\ \n\ while true; do\n\ current_time=$(date +%s)\n\ \n\ if has_vnc_clients || has_websocket_clients; then\n\ # Client connected\n\ last_client_time=$current_time\n\ start_app\n\ else\n\ # No clients\n\ if [ "$last_client_time" -gt 0 ]; then\n\ time_since_last_client=$((current_time - last_client_time))\n\ if [ "$time_since_last_client" -gt "$CLIENT_TIMEOUT" ]; then\n\ stop_app\n\ last_client_time=0\n\ fi\n\ fi\n\ fi\n\ \n\ sleep "$CHECK_INTERVAL"\n\ done\n\ ' > /monitor-clients.sh && chmod +x /monitor-clients.sh # Create smart startup script RUN echo '#!/bin/bash\n\ export USER=root\n\ export HOME=/root\n\ export DISPLAY=:1\n\ \n\ log() {\n\ echo "[$(date "+%H:%M:%S")] $1"\n\ }\n\ \n\ log "Starting VNC server..."\n\ vncserver :1 -geometry 1600x900 -depth 24 -localhost no\n\ sleep 5\n\ \n\ log "Starting noVNC web interface..."\n\ cd /opt/noVNC\n\ python3 -m websockify --web --max-connections=2 . 6080 localhost:5901 &\n\ NOVNC_PID=$!\n\ \n\ sleep 3\n\ xhost + 2>/dev/null || true\n\ \n\ log "VNC ready at http://localhost:6080/vnc.html"\n\ log "Starting client monitor..."\n\ log "miniRT will start automatically when a client connects"\n\ log "miniRT will stop automatically when no clients for 30 seconds"\n\ \n\ # Start the client monitor\n\ /monitor-clients.sh &\n\ MONITOR_PID=$!\n\ \n\ # Handle cleanup on exit\n\ cleanup() {\n\ log "Shutting down..."\n\ kill $NOVNC_PID 2>/dev/null\n\ kill $MONITOR_PID 2>/dev/null\n\ vncserver -kill :1 2>/dev/null\n\ exit 0\n\ }\n\ \n\ trap cleanup SIGTERM SIGINT\n\ \n\ # Wait for processes\n\ wait\n\ ' > /start.sh && chmod +x /start.sh EXPOSE 6080 5901 CMD ["/start.sh"]