From 3223cf93106fd833e69ac6d169107a0af84eddd6 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Fri, 19 Sep 2025 16:37:08 -0500 Subject: [PATCH] fix --- Dockerfile | 38 +++++++++++++++++++------ docker-compose.yml | 71 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 86 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6b94973..b7c726e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,39 @@ -FROM node:18-alpine - +# ---- deps ---- +FROM node:18-alpine AS deps WORKDIR /app - COPY package*.json ./ +# Für reproduzierbare Builds: CI bevorzugt +RUN npm ci -RUN npm install - +# ---- builder ---- +FROM node:18-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules COPY . . - +ENV NODE_ENV=production +# Falls du Prisma o.ä. verwendest, optional vor dem Build: +# RUN npx prisma generate RUN npm run build +# ---- runner (Variante A: Standard "npm start") ---- +# Nutze diese Runner-Stufe, wenn du KEIN 'output: standalone' hast: +FROM node:18-alpine AS runner +WORKDIR /app ENV NODE_ENV=production - +ENV PORT=3000 +COPY --from=builder /app ./ EXPOSE 3000 +CMD ["npm", "start"] -CMD ["npm", "start"] \ No newline at end of file +# ---- runner-standalone (Variante B: Next.js Standalone) ---- +# Wenn du in next.config.js 'output: "standalone"' gesetzt hast, +# kannst du stattdessen diese Runner-Stufe verwenden und die obere auskommentieren: +# FROM node:18-alpine AS runner +# WORKDIR /app +# ENV NODE_ENV=production +# ENV PORT=3000 +# COPY --from=builder /app/.next/standalone ./ +# COPY --from=builder /app/.next/static ./.next/static +# COPY --from=builder /app/public ./public +# EXPOSE 3000 +# CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index c071b0c..7cb687b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,32 +1,73 @@ +version: "3.9" + services: + # ======== PROD ======== mail-admin: + # Nur aktiv, wenn Profil 'prod' gesetzt ist + profiles: ["prod"] container_name: mail-s3-admin - build: . + build: + context: . + dockerfile: Dockerfile + environment: + # Next.js & DB + NODE_ENV: production + DATABASE_URL: postgresql://postgres:fiesta@postgres:5432/mydb + # Deine App-Variablen + APP_PASSWORD: ${APP_PASSWORD} + PROCESSED_META_KEY: ${PROCESSED_META_KEY} + PROCESSED_META_VALUE: ${PROCESSED_META_VALUE} + # Optional hilfreich: + NEXT_TELEMETRY_DISABLED: "1" ports: - "3060:3000" - environment: - - DATABASE_URL=${DATABASE_URL} - - APP_PASSWORD=${APP_PASSWORD} - - PROCESSED_META_KEY=${PROCESSED_META_KEY} - - PROCESSED_META_VALUE=${PROCESSED_META_VALUE} depends_on: - - postgres - volumes: - - .:/app # Mount local code for dev changes - command: npm run dev # Run dev mode in container + postgres: + condition: service_healthy + restart: unless-stopped + # ======== DEV ======== + mail-admin-dev: + profiles: ["dev"] + container_name: mail-s3-admin-dev + image: node:18-alpine + working_dir: /app + command: sh -c "npm install && npm run dev" + environment: + NODE_ENV: development + DATABASE_URL: postgresql://postgres:fiesta@postgres:5432/mydb + APP_PASSWORD: ${APP_PASSWORD} + PROCESSED_META_KEY: ${PROCESSED_META_KEY} + PROCESSED_META_VALUE: ${PROCESSED_META_VALUE} + NEXT_TELEMETRY_DISABLED: "1" + ports: + - "3060:3000" + depends_on: + postgres: + condition: service_healthy + volumes: + - .:/app:cached # Quellcode aus dem Host + - /app/node_modules # Anonymes Volume: verhindert Konflikte mit Host + restart: unless-stopped + + # ======== POSTGRES (geteilt) ======== postgres: container_name: mail-s3-admin-db - image: postgres:latest - restart: always + image: postgres:16-alpine environment: POSTGRES_USER: postgres - POSTGRES_PASSWORD: ${DATABASE_PASSWORD} + POSTGRES_PASSWORD: fiesta POSTGRES_DB: mydb ports: - - "5434:5432" + - "5434:5432" # optional, nur nötig wenn du lokal via Host-Port zugreifen willst volumes: - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres -d mydb || exit 1"] + interval: 5s + timeout: 3s + retries: 10 + restart: unless-stopped volumes: - postgres-data: \ No newline at end of file + postgres-data: