diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a6ef6da --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# --- STAGE 1: Base build environment --- +FROM node:lts-alpine3.23 AS base +WORKDIR /app +COPY package.json package-lock.json ./ + +# Install necessary dependencies for sharp used by next/image (for image optimization) +RUN apk add --no-cache libc6-compat + +# Install dependencies +RUN npm ci --legacy-peer-deps +COPY . . +# --- STAGE 2: Environments +# Development +FROM base AS development +ARG ENVIRONMENT=development +ENV NODE_ENV=$ENVIRONMENT +RUN addgroup -S appuser && adduser -S appuser -G appuser +RUN chown -R appuser:appuser /app +USER appuser +EXPOSE 3000 +CMD ["npm", "run", "dev"] + +# Production +FROM base AS build +ARG ENVIRONMENT=production +ENV NODE_ENV=$ENVIRONMENT +RUN npm run build + +#--- STAGE 3: Production runtime environment +FROM node:lts-alpine3.23 AS production +WORKDIR /app +RUN addgroup -S appuser && adduser -S appuser -G appuser +COPY --from=build /app/.next ./.next +COPY --from=build /app/package.json ./package.json +COPY --from=build /app/package-lock.json ./package-lock.json +COPY --from=build /app/next.config.ts ./next.config.ts +COPY --from=build /app/public ./public +COPY --from=build /app/node_modules ./node_modules +RUN chown -R appuser:appuser /app +USER appuser +EXPOSE 3000 +CMD ["npm", "run", "start"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b32e04a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +services: + gsh-website: + image: gsh-website:prod + container_name: gsh-website + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + ports: + - "4000:3000" + volumes: + - ./public/uploads:/app/public/uploads + environment: + - NODE_ENV=production + # Add additional Next.js runtime configuration below as needed, for example: + # - NEXT_PUBLIC_API_URL=https://api.example.com