From 8e05f658339644eb23ee940f4c102f75a034bdfb Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Wed, 26 Nov 2025 19:14:28 -0800 Subject: [PATCH] Add Docker deployment configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Dockerfile with multi-stage build for Next.js standalone - Add docker-compose.yml with Traefik labels for decolonizeti.me - Add .dockerignore for optimized builds - Enable standalone output in next.config.mjs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .dockerignore | 9 +++++++++ Dockerfile | 43 +++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 15 +++++++++++++++ next.config.mjs | 4 ++-- 4 files changed, 69 insertions(+), 2 deletions(-) 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..454849a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +.git +.gitignore +.next +*.md +.env* +Dockerfile +docker-compose*.yml +.dockerignore diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d22bf54 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +FROM node:20-alpine AS base + +# Install pnpm +RUN corepack enable && corepack prepare pnpm@latest --activate + +# Dependencies stage +FROM base AS deps +WORKDIR /app + +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# Build stage +FROM base AS builder +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED=1 +RUN pnpm build + +# Production stage +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c4d7581 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + decolonize-time: + build: . + container_name: decolonize-time + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.decolonize-time.rule=Host(`decolonizeti.me`) || Host(`www.decolonizeti.me`)" + - "traefik.http.services.decolonize-time.loadbalancer.server.port=3000" + networks: + - traefik-public + +networks: + traefik-public: + external: true diff --git a/next.config.mjs b/next.config.mjs index 5501ef9..ddf3dd3 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -6,7 +6,7 @@ const nextConfig = { images: { unoptimized: true, }, - + output: 'standalone', } -export default nextConfig \ No newline at end of file +export default nextConfig