From bcd360dc3356559e8be605e7dcf455f64aa09335 Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 12:08:01 +0000 Subject: [PATCH] build: add production Dockerfile, docker-compose, .env.prod, and standalone next config --- .dockerignore | 11 ++++++++++ .env.prod | 3 +++ .gitignore | 1 + Dockerfile | 54 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 18 ++++++++++++++++ next.config.ts | 2 +- runner.sh | 3 +++ 7 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 .env.prod create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 runner.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f8b438e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +Dockerfile +docker-compose.yml +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git +.gitignore +.env*.local +.env.development diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..3c7c3ab --- /dev/null +++ b/.env.prod @@ -0,0 +1,3 @@ +PORT=3000 +NODE_ENV=production +NEXT_TELEMETRY_DISABLED=1 diff --git a/.gitignore b/.gitignore index dfb192b..67f3f55 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +!.env.prod # vercel .vercel diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..34ef2fa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +# syntax=docker/dockerfile:1.7 + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۱ — deps: آماده‌سازی وابستگی‌ها با کش npm +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN --mount=type=cache,target=/root/.npm npm ci --prefer-offline --no-audit --fund=false + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۲ — builder: ساخت خروجی بهینه‌شده standalone برای Next.js +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine AS builder +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED=1 +ENV NODE_ENV=production + +RUN npm run build + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۳ — runner: سرور مینیمال، سبک و امن standalone در محیط پروداکشن +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine 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 && \ + 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 + +# هلث‌چک کانتینر +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget -qO- http://127.0.0.1:3000/ || exit 1 + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..dce49fb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +services: + web: + build: + context: . + dockerfile: Dockerfile + image: teamby-landing:latest + container_name: teamby_landing + restart: unless-stopped + env_file: + - .env.prod + ports: + - "8065:3000" + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/ || exit 1"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 15s diff --git a/next.config.ts b/next.config.ts index e9ffa30..68a6c64 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + output: "standalone", }; export default nextConfig; diff --git a/runner.sh b/runner.sh new file mode 100755 index 0000000..04e450b --- /dev/null +++ b/runner.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -e +git pull origin master --rebase && docker compose up -d --build