Initial commit: CTmine-client (ContainerMine Client)
Docker-WebApp, die einen echten Minecraft Java-Client (Prism Launcher) in einem Container mit virtuellem Display betreibt und per noVNC im Browser anzeigt. Gedacht, um Accounts AFK an Farmen zu stellen. - Multi-Stage Dockerfile: Vite/Vue-Build + Ubuntu-Runtime (Xvfb, x11vnc, websockify, noVNC, openbox, nginx, Prism Launcher 11.0.3) - Vue 3 + Vite + TypeScript Dashboard (noVNC-iframe, Start/Stop, Status-Anzeige, Schnellstart-Anleitung) - Node-Status-API ohne externe Dependencies (/api/status, /api/mc/*) - docker-compose.yml mit PUID/PGID, konfigurierbarer Auflösung, shm_size - Persistente Accounts/Instanzen in /config (Volume)
This commit is contained in:
commit
b8a99e6e9e
25 changed files with 1766 additions and 0 deletions
165
Dockerfile
Normal file
165
Dockerfile
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
# =============================================================================
|
||||
# CTmine-client · ContainerMine Client
|
||||
# Multi-Stage Dockerfile:
|
||||
# Stage 1 (web-build): baut das Vue 3 + Vite Dashboard
|
||||
# Stage 2 (final): Ubuntu mit Xvfb/x11vnc/websockify/openbox/nginx,
|
||||
# Prism Launcher, echtem Minecraft-Client, Node-API
|
||||
# =============================================================================
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Stage 1: Vue Dashboard bauen
|
||||
# ----------------------------------------------------------------------------
|
||||
FROM node:22-slim AS web-build
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
# Erst nur Abhängigkeiten (besserer Layer-Cache).
|
||||
COPY web/package.json web/package-lock.json* ./
|
||||
RUN npm install --no-audit --no-fund
|
||||
|
||||
# Quellen kopieren und Produktions-Build erstellen.
|
||||
COPY web/ ./
|
||||
RUN npm run build
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Stage 2: Runtime
|
||||
# ----------------------------------------------------------------------------
|
||||
FROM ubuntu:24.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive \
|
||||
TZ=Europe/Berlin \
|
||||
DISPLAY=:0 \
|
||||
CONFIG_DIR=/config \
|
||||
PRISM_DIR=/config/prism \
|
||||
WEB_ROOT=/var/www/ctmine \
|
||||
MC_API_PORT=3000 \
|
||||
PUID=1000 \
|
||||
PGID=1000
|
||||
|
||||
# --- Systempakete ----------------------------------------------------------
|
||||
# Xvfb virtuelles Display
|
||||
# x11vnc VNC-Server auf Xvfb
|
||||
# websockify VNC → WebSocket für noVNC
|
||||
# novnc Browser-VNC-Client (wird hier nur als Fallback gehostet)
|
||||
# openbox leichter Windowmanager (sonst kein Fokus/Rahmen für MC)
|
||||
# nginx liefert Dashboard + proxyt API/Websockify
|
||||
# nodejs Status-API
|
||||
# supervisord Prozess-Manager
|
||||
# gosu Prozess als Runtime-Benutzer starten
|
||||
# xdpyinfo Auflösung auslesen (für /api/status)
|
||||
# Prism Launcher benötigt Qt6 + multimediale Libs.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
wget \
|
||||
gnupg \
|
||||
xz-utils \
|
||||
\
|
||||
xvfb \
|
||||
x11vnc \
|
||||
python3 \
|
||||
python3-websockify \
|
||||
novnc \
|
||||
openbox \
|
||||
nginx \
|
||||
supervisor \
|
||||
gosu \
|
||||
x11-utils \
|
||||
\
|
||||
nodejs \
|
||||
\
|
||||
qt6-base-dev \
|
||||
qt6-wayland \
|
||||
libqt6core6 \
|
||||
libqt6gui6 \
|
||||
libqt6network6 \
|
||||
libqt6widgets6 \
|
||||
libqt6svg6 \
|
||||
libqt6opengl6 \
|
||||
libqt6multimedia6 \
|
||||
libgl1 \
|
||||
libglx-mesa0 \
|
||||
libegl1 \
|
||||
libegl-mesa0 \
|
||||
mesa-utils \
|
||||
libopenal1 \
|
||||
libpulse0 \
|
||||
libglfw3 \
|
||||
libflac12 \
|
||||
libvorbisfile3 \
|
||||
libopengl0 \
|
||||
locales \
|
||||
tzdata \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Locale generieren (Qt verlangt ein funktionierendes utf8-Locale).
|
||||
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
|
||||
ENV LANG=en_US.UTF-8 \
|
||||
LANGUAGE=en_US:en \
|
||||
LC_ALL=en_US.UTF-8
|
||||
|
||||
# --- Runtime-Benutzer (UID/GID 1000) ---------------------------------------
|
||||
# Ubuntu hat bereits eine Gruppe/einen User mit ID 1000 (»ubuntu«). Wir nutzen
|
||||
# diese, statt sie neu anzulegen: bestehende Gruppe/User werden umbenannt.
|
||||
RUN if getent group 1000 >/dev/null; then \
|
||||
existing_group=$(getent group 1000 | cut -d: -f1) && \
|
||||
groupmod -n ctmine "$existing_group"; \
|
||||
else \
|
||||
groupadd -g 1000 ctmine; \
|
||||
fi && \
|
||||
if getent passwd 1000 >/dev/null; then \
|
||||
existing_user=$(getent passwd 1000 | cut -d: -f1) && \
|
||||
usermod -l ctmine -d /home/ctmine -m -s /bin/bash "$existing_user" && \
|
||||
usermod -g 1000 ctmine; \
|
||||
else \
|
||||
useradd -m -u 1000 -g 1000 -s /bin/bash ctmine; \
|
||||
fi && \
|
||||
mkdir -p /config /var/www/ctmine /app/mc-api && \
|
||||
chown -R ctmine:ctmine /config /app
|
||||
|
||||
# --- Prism Launcher installieren -------------------------------------------
|
||||
# Wir laden den offiziellen portable Linux-Build (Qt6) herunter. Prism ist
|
||||
# eine portable Qt-App — kein systemweites Installieren nötig. Das Archiv
|
||||
# entpackt *flach* (Dateien liegen direkt im Root, kein Unterverzeichnis).
|
||||
ARG PRISM_VERSION=11.0.3
|
||||
RUN mkdir -p /opt/prism && cd /opt/prism && \
|
||||
wget -q "https://github.com/PrismLauncher/PrismLauncher/releases/download/${PRISM_VERSION}/PrismLauncher-Linux-Qt6-Portable-${PRISM_VERSION}.tar.gz" -O prism.tar.gz && \
|
||||
tar -xzf prism.tar.gz && \
|
||||
rm prism.tar.gz && \
|
||||
chmod +x /opt/prism/PrismLauncher /opt/prism/bin/prismlauncher
|
||||
|
||||
# --- Vue-Dashboard aus Stage 1 übernehmen ----------------------------------
|
||||
COPY --from=web-build /build/dist/ /var/www/ctmine/
|
||||
|
||||
# --- Node-API übernehmen ---------------------------------------------------
|
||||
COPY docker/mc-api/ /app/mc-api/
|
||||
|
||||
# --- Docker-Konfigurationsdateien ------------------------------------------
|
||||
COPY docker/supervisor.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
COPY docker/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh /opt/prism/PrismLauncher
|
||||
|
||||
# --- Prism beim ersten Start ins Volume entpacken --------------------------
|
||||
# So liegen Accounts, Instanzen und Launcher persistent in /config und
|
||||
# überstehen Container-Neustarts. Prism erwartet $HOME als Datenverzeichnis.
|
||||
RUN echo '#!/usr/bin/env bash' > /opt/bootstrap-prism.sh && \
|
||||
echo 'set -e' >> /opt/bootstrap-prism.sh && \
|
||||
echo 'if [ ! -x "${PRISM_DIR}/PrismLauncher" ]; then' >> /opt/bootstrap-prism.sh && \
|
||||
echo ' mkdir -p "${PRISM_DIR}"' >> /opt/bootstrap-prism.sh && \
|
||||
echo ' cp -r /opt/prism/* "${PRISM_DIR}/"' >> /opt/bootstrap-prism.sh && \
|
||||
echo ' chmod +x "${PRISM_DIR}/PrismLauncher"' >> /opt/bootstrap-prism.sh && \
|
||||
echo ' chown -R ctmine:ctmine "${PRISM_DIR}"' >> /opt/bootstrap-prism.sh && \
|
||||
echo 'fi' >> /opt/bootstrap-prism.sh && \
|
||||
chmod +x /opt/bootstrap-prism.sh
|
||||
|
||||
# Volumes: persistente Daten (Accounts, Instanzen, .minecraft).
|
||||
VOLUME ["/config"]
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
# Healthcheck: ist das Dashboard erreichbar?
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
|
||||
CMD wget -qO- http://127.0.0.1:8080/ >/dev/null 2>&1 || exit 1
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue