website/miniRT/Dockerfile
2025-06-03 17:02:01 +02:00

195 lines
5.2 KiB
Docker

FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
# Update with future time fix and install build dependencies
RUN apt-get -o Acquire::Max-FutureTime=86400 update -y --fix-missing
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 "1312" | 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 '<!DOCTYPE html>\n\
<html>\n\
<head>\n\
<title>miniRT</title>\n\
<style>\n\
body { margin: 0; padding: 0; background: #000; overflow: hidden; }\n\
iframe { width: 100vw; height: 100vh; border: none; }\n\
</style>\n\
</head>\n\
<body>\n\
<iframe src="/clean.html"></iframe>\n\
</body>\n\
</html>' > /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 a simple mime.types file for websockify
RUN echo 'text/html html htm shtml;\n\
application/javascript js;\n\
text/css css;\n\
image/png png;\n\
image/jpeg jpg jpeg;\n\
image/gif gif;\n\
image/svg+xml svg;\n\
' > /opt/noVNC/mime.types
# 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 1920x1080 -depth 24 -localhost no\n\
sleep 5\n\
\n\
log "Starting noVNC web interface..."\n\
cd /opt/noVNC\n\
python3 -m websockify 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"]