From 77cc5273acb0d9941317aee6dc046205d8735ece Mon Sep 17 00:00:00 2001 From: Liam Pietralla Date: Fri, 16 Jan 2026 15:52:34 +1100 Subject: [PATCH] docker file setup --- .env.development | 1 - .env.template | 3 +++ Dockerfile | 66 +++++++++++++++++++++++++++++++++++++----------- README.md | 4 ++- compose.yml | 13 ---------- package.json | 2 +- 6 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 .env.template diff --git a/.env.development b/.env.development index da6d0fa..5f20662 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,4 @@ # App Configuration -DATABASE_URL=postgres://portfolio:portfolio@127.0.0.1:5432/portfolio PAYLOAD_SECRET=123ABC # S3 Configuration diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..d97f7f8 --- /dev/null +++ b/.env.template @@ -0,0 +1,3 @@ +# App Configuration +DATABASE_URL=postgres://:@:5432/ +PAYLOAD_SECRET=123ABC diff --git a/Dockerfile b/Dockerfile index d89869b..4b7024e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,29 +1,65 @@ FROM node:24-alpine AS base -ENV NODE_ENV=production +# Install curl for health checks +RUN apk add --no-cache curl + +# Install dependencies only when needed FROM base AS deps RUN apk add --no-cache libc6-compat WORKDIR /app -COPY package.json pnpm-lock.yaml* .npmrc* ./ -RUN corepack enable pnpm && pnpm i --frozen-lockfile; +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Rebuild the source code only when needed FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . -RUN corepack enable pnpm && pnpm build +# Set build args and environment variables +ARG NODE_ENV=production +ENV NODE_ENV=$NODE_ENV +ARG DATABASE_URL +ENV DATABASE_URL=$DATABASE_URL + +ENV NEXT_TELEMETRY_DISABLED=1 +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Production image, copy all the files and run next FROM base AS runner WORKDIR /app -RUN corepack enable pnpm -RUN mkdir -p /app/portfolio-data && chown node:node /app/portfolio-data -COPY --chown=node --from=deps /app/node_modules ./node_modules -COPY --chown=node --from=builder /app/public ./public -COPY --chown=node --from=builder /app/next.config.ts ./next.config.ts -COPY --chown=node --from=builder /app/.next ./.next -COPY --chown=node --from=builder /app/package.json ./package.json -COPY --chown=node --from=builder /app/tsconfig.json ./tsconfig.json -COPY --chown=node --from=builder /app/src ./src -USER node + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +RUN mkdir .next +RUN chown nextjs:nodejs .next + +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 ["pnpm", "start"] \ No newline at end of file + +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/README.md b/README.md index 442cc93..ce021bb 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,11 @@ pnpm run payload:migrate:create Deploying the portfolio is done as a docker container. It can be built with the following command: ```bash -docker build -t liam-portfolio . +docker build --add-host=host.docker.internal:host-gateway --build-arg HOST_GATEWAY=host.docker.internal -t liam-portfolio . ``` +NOTE: Ensure a .env exists with the correct environment variables, including the DATABASE_URL and PAYLOAD_SECRET. + ### Running the Container Once the container is built, you can run it with the following command: diff --git a/compose.yml b/compose.yml index 44e624f..a268823 100644 --- a/compose.yml +++ b/compose.yml @@ -1,17 +1,5 @@ services: - db: - image: postgres:17 - restart: unless-stopped - ports: - - "5432:5432" - environment: - POSTGRES_USER: portfolio - POSTGRES_PASSWORD: portfolio - POSTGRES_DB: portfolio - volumes: - - portfolio_db_data:/var/lib/postgresql/data - s3: image: ghcr.io/achtungsoftware/alarik:latest restart: unless-stopped @@ -58,5 +46,4 @@ services: " volumes: - portfolio_db_data: portfolio_s3_data: \ No newline at end of file diff --git a/package.json b/package.json index a9c5c36..114b66e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "liam-portfolio", - "version": "1.0.2", + "version": "1.0.3", "private": true, "type": "module", "scripts": {