From c4a7083f79c2f55ba5d472ac6f96ce3f143c5887 Mon Sep 17 00:00:00 2001 From: kayjaydee Date: Wed, 8 Apr 2026 18:40:23 +0200 Subject: [PATCH] feat(03-04): Dockerfile SSR multi-stage + docker-compose Traefik port 3000 - Rewrite Dockerfile: node:22-alpine build + runtime, copy .output/, node server - Add .dockerignore excluding node_modules, .nuxt, .output, src, .git, .planning - Update docker-compose loadbalancer port from 80 to 3000 - Add SMTP and GA4 environment variables to docker-compose --- .dockerignore | 8 ++++++++ Dockerfile | 39 ++++++++++++--------------------------- docker-compose.yml | 7 ++++++- 3 files changed, 26 insertions(+), 28 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..eccdb0f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.nuxt +.output +dist +src +.git +*.md +.planning diff --git a/Dockerfile b/Dockerfile index 347383f..725215d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,32 +1,17 @@ -# Stage 1: Build the Vue.js application -FROM node:22-alpine AS build-stage - +# Stage 1: Build +FROM node:22-alpine AS builder WORKDIR /app - -# Copy package.json and package-lock.json (or yarn.lock) COPY package*.json ./ - -# Install dependencies -RUN npm install - -# Copy the rest of your application's source code +RUN npm ci COPY . . - -# Build the application -# The command is taken from your "scripts" in package.json RUN npm run build -# Stage 2: Serve the application with a lightweight web server -FROM nginx:stable-alpine AS production-stage - -# Copy the built files from the build stage -COPY --from=build-stage /app/dist /usr/share/nginx/html - -# Copy the nginx configuration file -COPY nginx.conf /etc/nginx/conf.d/default.conf - -# Expose port 80 to the outside world -EXPOSE 80 - -# Command to run nginx in the foreground -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +# Stage 2: Runtime +FROM node:22-alpine AS runner +ENV NODE_ENV=production +ENV HOST=0.0.0.0 +ENV PORT=3000 +WORKDIR /app +COPY --from=builder /app/.output /app/.output +EXPOSE 3000 +CMD ["node", "/app/.output/server/index.mjs"] diff --git a/docker-compose.yml b/docker-compose.yml index a51e508..60eaf84 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,12 +5,17 @@ services: restart: unless-stopped environment: - TZ=Europe/Paris + - NUXT_SMTP_HOST=${NUXT_SMTP_HOST} + - NUXT_SMTP_USER=${NUXT_SMTP_USER} + - NUXT_SMTP_PASS=${NUXT_SMTP_PASS} + - NUXT_SMTP_TO=${NUXT_SMTP_TO} + - NUXT_PUBLIC_GTAG_ID=${NUXT_PUBLIC_GTAG_ID} networks: - public labels: - 'traefik.enable=true' - 'com.centurylinklabs.watchtower.enable=false' - - 'traefik.http.services.portfolio.loadbalancer.server.port=80' + - 'traefik.http.services.portfolio.loadbalancer.server.port=3000' # Main router (non-www) - 'traefik.http.routers.portfolio.rule=Host(`${PORTFOLIO_URL}`)' - 'traefik.http.routers.portfolio.entrypoints=websecure'