This commit is contained in:
2025-12-04 03:34:11 +01:00
parent 95fe3e0573
commit 80ac574116
57 changed files with 583 additions and 1418 deletions
+94
View File
@@ -0,0 +1,94 @@
# ===================================================================
# Multi-Stage Dockerfile für Meldestelle Desktop-App (VNC)
# ===================================================================
# ===================================================================
# Stage 1: Build Stage - Kotlin Desktop-App kompilieren
# ===================================================================
FROM gradle:8-jdk21-alpine AS builder
WORKDIR /app
# Kopiere Gradle-Konfiguration und Wrapper
COPY build.gradle.kts settings.gradle.kts gradle.properties ./
COPY gradle ./gradle
COPY gradlew ./
# Kopiere alle notwendigen Module für Multi-Modul-Projekt
COPY frontend ./frontend
COPY backend ./backend
COPY core ./core
COPY domains ./domains
COPY platform ./platform
COPY docs ./docs
# Setze Gradle-Wrapper Berechtigung
RUN chmod +x ./gradlew
# Dependencies downloaden (für besseres Caching)
RUN ./gradlew :frontend:shells:meldestelle-portal:dependencies --no-configure-on-demand
# Desktop-App kompilieren (createDistributable für native Distribution)
RUN ./gradlew :frontend:shells:meldestelle-portal:createDistributable --no-configure-on-demand
# ===================================================================
# Stage 2: Runtime Stage - Ubuntu mit VNC + noVNC
# ===================================================================
FROM ubuntu:22.04
# Verhindere interaktive Installationen
ENV DEBIAN_FRONTEND=noninteractive
# Installiere System-Dependencies
RUN apt-get update && apt-get install -y \
openjdk-21-jdk \
xvfb \
x11vnc \
novnc \
websockify \
xfce4 \
xfce4-goodies \
curl \
wget \
unzip \
supervisor \
&& rm -rf /var/lib/apt/lists/*
# Arbeitsverzeichnis
WORKDIR /app
# Kopiere kompilierte Desktop-App von Build-Stage
COPY --from=builder /app/frontend/shells/meldestelle-portal/build/compose/binaries/main/desktop/ ./desktop-app/
# Kopiere Scripts
COPY dockerfiles/clients/desktop-app/entrypoint.sh /entrypoint.sh
COPY dockerfiles/clients/desktop-app/health-check.sh /opt/health-check.sh
COPY dockerfiles/clients/desktop-app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Setze Permissions
RUN chmod +x /entrypoint.sh /opt/health-check.sh
# Erstelle VNC-User
RUN useradd -m -s /bin/bash vncuser && \
mkdir -p /home/vncuser/.vnc && \
chown -R vncuser:vncuser /home/vncuser && \
chown -R vncuser:vncuser /app
# VNC und noVNC Ports
EXPOSE 5901 6080
# Environment Variables
ENV DISPLAY=:99
ENV VNC_PORT=5901
ENV NOVNC_PORT=6080
ENV API_BASE_URL=http://api-gateway:8081
# Health-Check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD /opt/health-check.sh
# User wechseln
USER vncuser
# Entrypoint
ENTRYPOINT ["/entrypoint.sh"]
+104
View File
@@ -0,0 +1,104 @@
#!/bin/bash
# ===================================================================
# Entrypoint-Script für Meldestelle Desktop-App (VNC)
# ===================================================================
set -e
# Logging-Funktion
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
log "Starting Meldestelle Desktop-App VNC Container..."
# Environment-Variablen setzen
export DISPLAY=${DISPLAY:-:99}
export VNC_PORT=${VNC_PORT:-5901}
export NOVNC_PORT=${NOVNC_PORT:-6080}
export API_BASE_URL=${API_BASE_URL:-http://api-gateway:8081}
log "Environment:"
log " DISPLAY: $DISPLAY"
log " VNC_PORT: $VNC_PORT"
log " NOVNC_PORT: $NOVNC_PORT"
log " API_BASE_URL: $API_BASE_URL"
# Erstelle .Xauthority wenn nicht vorhanden
touch /home/vncuser/.Xauthority
# 1. Starte X11 Virtual Display (Xvfb)
log "Starting Xvfb on display $DISPLAY..."
Xvfb $DISPLAY -screen 0 1280x1024x24 -ac +extension GLX +render -noreset &
XVFB_PID=$!
# Warte bis X11 bereit ist
sleep 3
# 2. Starte Desktop Environment (XFCE4)
log "Starting XFCE4 desktop environment..."
startxfce4 &
XFCE_PID=$!
# Warte bis Desktop bereit ist
sleep 5
# 3. Starte VNC Server
log "Starting VNC server on port $VNC_PORT..."
x11vnc -display $DISPLAY -forever -usepw -create -rfbport $VNC_PORT -nopw -shared -bg
VNC_PID=$!
# 4. Starte noVNC Web Interface
log "Starting noVNC web interface on port $NOVNC_PORT..."
websockify --web=/usr/share/novnc/ $NOVNC_PORT localhost:$VNC_PORT &
NOVNC_PID=$!
# 5. Warte bis Services bereit sind
sleep 10
# 6. Starte Desktop-App
log "Starting Meldestelle Desktop-App..."
cd /app/desktop-app
export API_BASE_URL=$API_BASE_URL
# Finde die ausführbare Datei
if [ -f "client/bin/client" ]; then
DESKTOP_APP="client/bin/client"
elif [ -f "bin/client" ]; then
DESKTOP_APP="bin/client"
elif [ -f "client" ]; then
DESKTOP_APP="client"
else
log "ERROR: Desktop-App executable not found!"
log "Contents of /app/desktop-app:"
ls -la /app/desktop-app/
exit 1
fi
log "Found desktop app: $DESKTOP_APP"
chmod +x "$DESKTOP_APP"
# Starte Desktop-App
./"$DESKTOP_APP" &
APP_PID=$!
log "All services started successfully!"
log "VNC: vnc://localhost:$VNC_PORT"
log "noVNC: http://localhost:$NOVNC_PORT/vnc.html"
# Cleanup-Funktion
cleanup() {
log "Shutting down services..."
kill $APP_PID 2>/dev/null || true
kill $NOVNC_PID 2>/dev/null || true
kill $VNC_PID 2>/dev/null || true
kill $XFCE_PID 2>/dev/null || true
kill $XVFB_PID 2>/dev/null || true
exit 0
}
# Signal-Handler
trap cleanup SIGTERM SIGINT
# Warten auf Prozesse
wait $APP_PID
@@ -0,0 +1,63 @@
#!/bin/bash
# ===================================================================
# Health-Check-Script für Meldestelle Desktop-App (VNC)
# ===================================================================
set -e
# Environment-Variablen
VNC_PORT=${VNC_PORT:-5901}
NOVNC_PORT=${NOVNC_PORT:-6080}
DISPLAY=${DISPLAY:-:99}
# Logging-Funktion
log() {
echo "[HEALTH] $1"
}
# 1. Überprüfe X11 Display
if ! xdpyinfo -display $DISPLAY >/dev/null 2>&1; then
log "ERROR: X11 display $DISPLAY is not running"
exit 1
fi
log "✓ X11 display $DISPLAY is running"
# 2. Überprüfe VNC Server
if ! netstat -ln | grep -q ":$VNC_PORT "; then
log "ERROR: VNC server is not listening on port $VNC_PORT"
exit 1
fi
log "✓ VNC server is running on port $VNC_PORT"
# 3. Überprüfe noVNC Web Interface
if ! curl -f -s "http://localhost:$NOVNC_PORT/" > /dev/null 2>&1; then
log "ERROR: noVNC web interface is not responding on port $NOVNC_PORT"
exit 1
fi
log "✓ noVNC web interface is running on port $NOVNC_PORT"
# 4. Überprüfe ob Desktop-App läuft (optional, da sie crashen könnte)
if pgrep -f "client" >/dev/null 2>&1; then
log "✓ Desktop-App is running"
else
log "⚠ Desktop-App is not running (may have crashed or not started yet)"
# Nicht als Fehler behandeln, da die App crashen könnte
fi
# 5. Überprüfe Xvfb
if ! pgrep -f "Xvfb" >/dev/null 2>&1; then
log "ERROR: Xvfb is not running"
exit 1
fi
log "✓ Xvfb is running"
# 6. Überprüfe XFCE4
if ! pgrep -f "xfce4" >/dev/null 2>&1; then
log "WARNING: XFCE4 desktop might not be running"
# Nicht als kritischer Fehler behandeln
else
log "✓ XFCE4 desktop environment is running"
fi
log "All critical services are healthy"
exit 0
@@ -0,0 +1,54 @@
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:xvfb]
command=Xvfb :99 -screen 0 1280x1024x24 -ac +extension GLX +render -noreset
user=vncuser
autostart=true
autorestart=true
priority=100
stdout_logfile=/var/log/supervisor/xvfb.log
stderr_logfile=/var/log/supervisor/xvfb.log
[program:xfce4]
command=startxfce4
user=vncuser
environment=DISPLAY=":99"
autostart=true
autorestart=true
priority=200
stdout_logfile=/var/log/supervisor/xfce4.log
stderr_logfile=/var/log/supervisor/xfce4.log
[program:vnc]
command=x11vnc -display :99 -forever -usepw -create -rfbport 5901 -nopw -shared
user=vncuser
environment=DISPLAY=":99"
autostart=true
autorestart=true
priority=300
stdout_logfile=/var/log/supervisor/vnc.log
stderr_logfile=/var/log/supervisor/vnc.log
[program:novnc]
command=websockify --web=/usr/share/novnc/ 6080 localhost:5901
user=vncuser
autostart=true
autorestart=true
priority=400
stdout_logfile=/var/log/supervisor/novnc.log
stderr_logfile=/var/log/supervisor/novnc.log
[program:desktop-app]
command=/app/desktop-app/client/bin/client
user=vncuser
environment=DISPLAY=":99",API_BASE_URL="http://api-gateway:8081"
directory=/app/desktop-app
autostart=true
autorestart=false
priority=500
stdout_logfile=/var/log/supervisor/desktop-app.log
stderr_logfile=/var/log/supervisor/desktop-app.log