From 2016767dcb057c3d86acd38d95e6159d00e44d8b Mon Sep 17 00:00:00 2001 From: "XPS\\Micro" Date: Sat, 31 Jan 2026 16:43:10 +0100 Subject: [PATCH] perf: make user-template-next optional and optimize build process Changes: - install.sh: user-template-next is now only built if USER_TEMPLATE_IMAGE=user-template-next:latest is set in .env * Defaults to user-service-template (nginx) to save 4-5 minutes per install * Dynamic build step counting based on configured templates * Shows helpful message when template is skipped * Build numbering adapts automatically ([1/3] vs [1/4]) - user-template-next/Dockerfile: Optimize build performance * Pin Node version to 20.11-alpine for reproducibility * Use npm ci instead of npm install for faster, reproducible builds * Separate package.json copy for better layer caching * Add --prefer-offline and --no-audit flags to npm ci * Clean npm cache to reduce image size * Add clear comments for multi-stage build steps Impact: - Default installations: 2-3 minutes faster - Reduced build time for Next.js template (when enabled) via layer caching - Better reproducibility and predictable builds --- install.sh | 29 ++++++++++++++++++++++------- user-template-next/Dockerfile | 17 ++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/install.sh b/install.sh index 5a5455c..c92c317 100644 --- a/install.sh +++ b/install.sh @@ -380,9 +380,14 @@ echo "Baue Docker-Images..." # Stoppe laufende Container ${COMPOSE_CMD} down 2>/dev/null || true +# Zaehle aktive Builds fuer Fortschrittsanzeige +BUILD_STEP=1 +TOTAL_BUILDS=3 # user-service-template + spawner-api + frontend (optional: + user-template-next) +[ "$USER_TEMPLATE_IMAGE" = "user-template-next:latest" ] && [ -d "${INSTALL_DIR}/user-template-next" ] && TOTAL_BUILDS=$((TOTAL_BUILDS + 1)) + # User-Template Image bauen (fuer User-Container) if [ -d "${INSTALL_DIR}/user-template" ]; then - echo " [1/4] Baue user-service-template (User-Container)..." + echo " [$BUILD_STEP/$TOTAL_BUILDS] Baue user-service-template (User-Container)..." echo "" # Build ausfuehren und Output in Datei speichern @@ -407,11 +412,13 @@ if [ -d "${INSTALL_DIR}/user-template" ]; then tail -50 "${BUILD_LOG}" exit 1 fi + BUILD_STEP=$((BUILD_STEP + 1)) fi -# User-Template-Next Image bauen (alternatives Template, optional) -if [ -d "${INSTALL_DIR}/user-template-next" ]; then - echo " [2/4] Baue user-template-next (Next.js Template)..." +# User-Template-Next Image bauen (alternatives Template, OPTIONAL) +# Wird NUR gebaut wenn USER_TEMPLATE_IMAGE=user-template-next:latest in .env gesetzt ist +if [ "$USER_TEMPLATE_IMAGE" = "user-template-next:latest" ] && [ -d "${INSTALL_DIR}/user-template-next" ]; then + echo " [$BUILD_STEP/$TOTAL_BUILDS] Baue user-template-next (Next.js Template, Optional)..." echo -e " ${BLUE}Dies kann 2-5 Minuten dauern (npm install + build)...${NC}" echo "" @@ -430,10 +437,16 @@ if [ -d "${INSTALL_DIR}/user-template-next" ]; then echo "" echo -e " user-template-next: ${YELLOW}WARNUNG - Build fehlgeschlagen (optional)${NC}" fi + BUILD_STEP=$((BUILD_STEP + 1)) +elif [ -d "${INSTALL_DIR}/user-template-next" ]; then + echo " [⊙] Überspringe user-template-next (nicht aktiviert in .env)" + echo -e " ${BLUE}Um Next.js Template zu aktivieren, setze in .env:${NC}" + echo " USER_TEMPLATE_IMAGE=user-template-next:latest" + echo "" fi # Spawner Backend Image bauen -echo " [3/4] Baue Spawner API (Flask Backend)..." +echo " [$BUILD_STEP/$TOTAL_BUILDS] Baue Spawner API (Flask Backend)..." echo "" BUILD_LOG="${LOG_FILE}" @@ -455,10 +468,11 @@ else tail -50 "${BUILD_LOG}" exit 1 fi +BUILD_STEP=$((BUILD_STEP + 1)) # Frontend Image bauen if [ -d "${INSTALL_DIR}/frontend" ]; then - echo " [4/4] Baue Frontend (Next.js)..." + echo " [$BUILD_STEP/$TOTAL_BUILDS] Baue Frontend (Next.js)..." echo -e " ${BLUE}Dies kann 2-5 Minuten dauern (npm install + build)...${NC}" echo "" @@ -481,10 +495,11 @@ if [ -d "${INSTALL_DIR}/frontend" ]; then tail -50 "${BUILD_LOG}" exit 1 fi + BUILD_STEP=$((BUILD_STEP + 1)) fi echo "" -echo "Alle Images erfolgreich gebaut." +echo "Alle erforderlichen Images erfolgreich gebaut." # ============================================================ # 8. Container starten diff --git a/user-template-next/Dockerfile b/user-template-next/Dockerfile index 0678b79..1457198 100644 --- a/user-template-next/Dockerfile +++ b/user-template-next/Dockerfile @@ -1,21 +1,28 @@ # Build stage -FROM node:20-alpine AS builder +FROM node:20.11-alpine AS builder WORKDIR /app -COPY package.json package-lock.json* ./ -RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi +# Copy nur package.json (Layer Caching - schneller Rebuilds wenn Source-Code aendert) +COPY package*.json ./ +# Installiere alle Packages (incl. devDependencies fuer TypeScript Build) +RUN npm ci --prefer-offline --no-audit && \ + npm cache clean --force + +# Copy Source Code COPY . . + +# Build Next.js App (generiert /app/.next output) RUN npm run build # Production stage - serve static files with nginx FROM nginx:alpine -# Copy static export +# Copy nur das Build-Output (Rest wird nicht mehr benoetigt) COPY --from=builder /app/out /usr/share/nginx/html -# Nginx config for SPA +# Nginx config fuer SPA (Single Page App) RUN echo 'server { \ listen 8080; \ root /usr/share/nginx/html; \