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
This commit is contained in:
XPS\Micro 2026-01-31 16:43:10 +01:00
parent 20a0f3d6af
commit 2016767dcb
2 changed files with 34 additions and 12 deletions

View File

@ -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

View File

@ -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; \