From 72a9fbdd74ae3ae915a09d85eba1439f6c8a84c9 Mon Sep 17 00:00:00 2001 From: Thibault Pouch Date: Tue, 3 Mar 2026 15:15:57 +0100 Subject: [PATCH] feat (docker): add Dockerfile and docker-compose for containerized setup --- .dockerignore | 15 +++++++++++++++ Dockerfile | 47 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 43 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b5cc2cd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +node_modules +.next +.git +.gitignore +.env* +!.env.example +npm-debug.log +yarn-debug.log +yarn-error.log +README.md +.DS_Store +*.md +coverage +.vscode +.idea diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9fd9e63 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,47 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +# Set build-time environment variable +ARG DATABASE_URL +ENV DATABASE_URL=$DATABASE_URL + +# Copy package files +COPY package*.json ./ +COPY prisma.config.ts ./ +COPY prisma ./prisma/ + +# Install dependencies +RUN npm ci + +# Copy application files +COPY . . + +# Generate Prisma Client +RUN npx prisma generate + +# Build the application +RUN npm run build + +# Production stage +FROM node:20-alpine AS runner + +WORKDIR /app + +# Set environment to production +ENV NODE_ENV=production + +# Copy necessary files from builder +COPY --from=builder /app/package*.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/prisma.config.ts ./ +COPY --from=builder /app/prisma ./prisma +COPY --from=builder /app/app/generated ./app/generated + +# Expose the port +EXPOSE 3001 + +# Start the application +CMD ["npm", "start"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3ae6987 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,43 @@ +version: '3.8' + +services: + postgres: + image: postgres:16-alpine + container_name: wyview-postgres + restart: unless-stopped + environment: + POSTGRES_USER: wyview + POSTGRES_PASSWORD: wyview_password + POSTGRES_DB: wyview + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U wyview"] + interval: 10s + timeout: 5s + retries: 5 + + app: + build: + context: . + dockerfile: Dockerfile + args: + DATABASE_URL: postgresql://wyview:wyview_password@postgres:5432/wyview + container_name: wyview-app + restart: unless-stopped + ports: + - "3001:3001" + environment: + - NODE_ENV=production + - DATABASE_URL=postgresql://wyview:wyview_password@postgres:5432/wyview + - NEXTAUTH_URL=http://localhost:3001 + - NEXTAUTH_SECRET=your-secret-key-change-this-in-production + depends_on: + postgres: + condition: service_healthy + command: sh -c "npx prisma migrate deploy && npm start" + +volumes: + postgres_data: