# P42 Dashboard – ein Container: FastAPI liefert API und das gebaute React-Frontend aus. # ---------- 1. Frontend bauen ---------- FROM node:22-alpine AS frontend WORKDIR /build # Erst nur die Paketlisten, damit npm ci bei Code-Änderungen aus dem Cache kommt COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # ---------- 2. Laufzeit ---------- FROM python:3.13-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ TZ=Europe/Berlin \ HOST=0.0.0.0 \ PORT=3000 \ P42_DATA_DIR=/data WORKDIR /app/backend COPY backend/requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Aufbau wie im Projekt: /app/backend/app, /app/frontend/dist, /app/config.json (wird eingebunden) COPY backend/app ./app COPY config.example.json /app/config.example.json COPY --from=frontend /build/dist /app/frontend/dist # Ohne Root-Rechte laufen; /data gehört dem Benutzer (UID 1000, wie im Datenordner auf dem Server) RUN useradd --uid 1000 --create-home p42 && mkdir -p /data && chown p42:p42 /data USER p42 EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:3000/api/auth/status', timeout=4).status == 200 else 1)" CMD ["python", "-m", "app"]