From 4fd6772f2ed4e65ef06da51517825a3e8ca42004 Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Mon, 27 Apr 2026 22:41:57 -0400 Subject: [PATCH] refactor: streamline Dockerfile and docker-compose.yml for improved build process --- Dockerfile | 65 +++++++++++----------------------------------- docker-compose.yml | 17 +----------- next.config.js | 3 ++- 3 files changed, 18 insertions(+), 67 deletions(-) diff --git a/Dockerfile b/Dockerfile index 736f716..20445dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,67 +3,32 @@ FROM oven/bun:1 AS base WORKDIR /usr/src/app FROM base AS install -RUN mkdir -p /temp/dev -COPY package.json bun.lock /temp/dev/ -RUN cd /temp/dev && bun install --frozen-lockfile - -RUN mkdir -p /temp/prod -COPY package.json bun.lock /temp/prod/ -RUN cd /temp/prod && bun install --frozen-lockfile --production +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile FROM base AS build -COPY --from=install /temp/dev/node_modules node_modules +COPY --from=install /usr/src/app/node_modules node_modules COPY . . -ARG NEXT_PUBLIC_APP_URL=http://localhost:3000 -ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID= -ARG NEXT_PUBLIC_UMAMI_SCRIPT_URL=https://analytics.umami.is/script.js -ARG NEXT_PUBLIC_AUTHENTIK_ENABLED=false -ARG NEXT_PUBLIC_BRAND_NAME=beenvoice -ARG NEXT_PUBLIC_BRAND_TAGLINE="Simple and efficient invoicing for freelancers and small businesses" -ARG NEXT_PUBLIC_BRAND_LOGO_TEXT=beenvoice -ARG NEXT_PUBLIC_BRAND_ICON=$ -ARG NEXT_PUBLIC_DEFAULT_INTERFACE_THEME=beenvoice -ARG NEXT_PUBLIC_DEFAULT_FONT=brand -ARG NEXT_PUBLIC_DEFAULT_BODY_FONT=brand -ARG NEXT_PUBLIC_DEFAULT_HEADING_FONT=brand -ARG NEXT_PUBLIC_DEFAULT_RADIUS=xl -ARG NEXT_PUBLIC_DEFAULT_SIDEBAR_STYLE=floating - -ENV NODE_ENV=production -ENV SKIP_ENV_VALIDATION=1 -ENV NODE_OPTIONS=--max-old-space-size=4096 -ENV BETTER_AUTH_URL=http://localhost:3000 -ENV AUTH_SECRET=docker-build-placeholder-secret-do-not-use -ENV DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres -ENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL -ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID -ENV NEXT_PUBLIC_UMAMI_SCRIPT_URL=$NEXT_PUBLIC_UMAMI_SCRIPT_URL -ENV NEXT_PUBLIC_AUTHENTIK_ENABLED=$NEXT_PUBLIC_AUTHENTIK_ENABLED -ENV NEXT_PUBLIC_BRAND_NAME=$NEXT_PUBLIC_BRAND_NAME -ENV NEXT_PUBLIC_BRAND_TAGLINE=$NEXT_PUBLIC_BRAND_TAGLINE -ENV NEXT_PUBLIC_BRAND_LOGO_TEXT=$NEXT_PUBLIC_BRAND_LOGO_TEXT -ENV NEXT_PUBLIC_BRAND_ICON=$NEXT_PUBLIC_BRAND_ICON -ENV NEXT_PUBLIC_DEFAULT_INTERFACE_THEME=$NEXT_PUBLIC_DEFAULT_INTERFACE_THEME -ENV NEXT_PUBLIC_DEFAULT_FONT=$NEXT_PUBLIC_DEFAULT_FONT -ENV NEXT_PUBLIC_DEFAULT_BODY_FONT=$NEXT_PUBLIC_DEFAULT_BODY_FONT -ENV NEXT_PUBLIC_DEFAULT_HEADING_FONT=$NEXT_PUBLIC_DEFAULT_HEADING_FONT -ENV NEXT_PUBLIC_DEFAULT_RADIUS=$NEXT_PUBLIC_DEFAULT_RADIUS -ENV NEXT_PUBLIC_DEFAULT_SIDEBAR_STYLE=$NEXT_PUBLIC_DEFAULT_SIDEBAR_STYLE +ENV NODE_ENV=production \ + SKIP_ENV_VALIDATION=1 \ + NODE_OPTIONS=--max-old-space-size=4096 \ + BETTER_AUTH_URL=http://localhost:3000 \ + AUTH_SECRET=docker-build-placeholder-secret-do-not-use \ + DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres RUN bun run build FROM base AS release -ENV NODE_ENV=production +ENV NODE_ENV=production \ + PORT=3000 \ + HOSTNAME=0.0.0.0 -COPY --from=install /temp/prod/node_modules node_modules -COPY --from=build /usr/src/app/.next ./.next +COPY --from=build /usr/src/app/.next/standalone ./ +COPY --from=build /usr/src/app/.next/static ./.next/static COPY --from=build /usr/src/app/public ./public -COPY --from=build /usr/src/app/package.json ./package.json COPY --from=build /usr/src/app/src/server/db/migrate.ts ./src/server/db/migrate.ts COPY --from=build /usr/src/app/drizzle ./drizzle -RUN chown -R bun:bun /usr/src/app - USER bun EXPOSE 3000 -CMD ["bun", "run", "start", "-p", "3000", "-H", "0.0.0.0"] +CMD ["bun", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index 9ebd7e2..af1d5bd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,21 +2,6 @@ services: app: build: context: . - args: - NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000} - NEXT_PUBLIC_UMAMI_WEBSITE_ID: ${NEXT_PUBLIC_UMAMI_WEBSITE_ID:-} - NEXT_PUBLIC_UMAMI_SCRIPT_URL: ${NEXT_PUBLIC_UMAMI_SCRIPT_URL:-https://analytics.umami.is/script.js} - NEXT_PUBLIC_AUTHENTIK_ENABLED: ${NEXT_PUBLIC_AUTHENTIK_ENABLED:-false} - NEXT_PUBLIC_BRAND_NAME: ${NEXT_PUBLIC_BRAND_NAME:-beenvoice} - NEXT_PUBLIC_BRAND_TAGLINE: ${NEXT_PUBLIC_BRAND_TAGLINE:-Simple and efficient invoicing for freelancers and small businesses} - NEXT_PUBLIC_BRAND_LOGO_TEXT: ${NEXT_PUBLIC_BRAND_LOGO_TEXT:-beenvoice} - NEXT_PUBLIC_BRAND_ICON: ${NEXT_PUBLIC_BRAND_ICON:-$$} - NEXT_PUBLIC_DEFAULT_INTERFACE_THEME: ${NEXT_PUBLIC_DEFAULT_INTERFACE_THEME:-beenvoice} - NEXT_PUBLIC_DEFAULT_FONT: ${NEXT_PUBLIC_DEFAULT_FONT:-brand} - NEXT_PUBLIC_DEFAULT_BODY_FONT: ${NEXT_PUBLIC_DEFAULT_BODY_FONT:-brand} - NEXT_PUBLIC_DEFAULT_HEADING_FONT: ${NEXT_PUBLIC_DEFAULT_HEADING_FONT:-brand} - NEXT_PUBLIC_DEFAULT_RADIUS: ${NEXT_PUBLIC_DEFAULT_RADIUS:-xl} - NEXT_PUBLIC_DEFAULT_SIDEBAR_STYLE: ${NEXT_PUBLIC_DEFAULT_SIDEBAR_STYLE:-floating} image: beenvoice:local environment: NODE_ENV: production @@ -37,7 +22,7 @@ services: command: - sh - -c - - bun src/server/db/migrate.ts && bun run start -p 3000 -H 0.0.0.0 + - bun src/server/db/migrate.ts && bun server.js ports: - "3000:3000" depends_on: diff --git a/next.config.js b/next.config.js index b04cc87..cc7861b 100644 --- a/next.config.js +++ b/next.config.js @@ -6,7 +6,8 @@ import "./src/env.js"; /** @type {import("next").NextConfig} */ const config = { - serverExternalPackages: ['pg'], + output: "standalone", + serverExternalPackages: ["pg"], }; export default config;