refactor: streamline Dockerfile and docker-compose.yml for improved build process

This commit is contained in:
2026-04-27 22:41:57 -04:00
parent fbeca7cfee
commit 4fd6772f2e
3 changed files with 18 additions and 67 deletions
+15 -50
View File
@@ -3,67 +3,32 @@ FROM oven/bun:1 AS base
WORKDIR /usr/src/app WORKDIR /usr/src/app
FROM base AS install FROM base AS install
RUN mkdir -p /temp/dev COPY package.json bun.lock ./
COPY package.json bun.lock /temp/dev/ RUN bun install --frozen-lockfile
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
FROM base AS build FROM base AS build
COPY --from=install /temp/dev/node_modules node_modules COPY --from=install /usr/src/app/node_modules node_modules
COPY . . COPY . .
ARG NEXT_PUBLIC_APP_URL=http://localhost:3000 ENV NODE_ENV=production \
ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID= SKIP_ENV_VALIDATION=1 \
ARG NEXT_PUBLIC_UMAMI_SCRIPT_URL=https://analytics.umami.is/script.js NODE_OPTIONS=--max-old-space-size=4096 \
ARG NEXT_PUBLIC_AUTHENTIK_ENABLED=false BETTER_AUTH_URL=http://localhost:3000 \
ARG NEXT_PUBLIC_BRAND_NAME=beenvoice AUTH_SECRET=docker-build-placeholder-secret-do-not-use \
ARG NEXT_PUBLIC_BRAND_TAGLINE="Simple and efficient invoicing for freelancers and small businesses" DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres
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
RUN bun run build RUN bun run build
FROM base AS release 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/standalone ./
COPY --from=build /usr/src/app/.next ./.next COPY --from=build /usr/src/app/.next/static ./.next/static
COPY --from=build /usr/src/app/public ./public 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/src/server/db/migrate.ts ./src/server/db/migrate.ts
COPY --from=build /usr/src/app/drizzle ./drizzle COPY --from=build /usr/src/app/drizzle ./drizzle
RUN chown -R bun:bun /usr/src/app
USER bun USER bun
EXPOSE 3000 EXPOSE 3000
CMD ["bun", "run", "start", "-p", "3000", "-H", "0.0.0.0"] CMD ["bun", "server.js"]
+1 -16
View File
@@ -2,21 +2,6 @@ services:
app: app:
build: build:
context: . 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 image: beenvoice:local
environment: environment:
NODE_ENV: production NODE_ENV: production
@@ -37,7 +22,7 @@ services:
command: command:
- sh - sh
- -c - -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: ports:
- "3000:3000" - "3000:3000"
depends_on: depends_on:
+2 -1
View File
@@ -6,7 +6,8 @@ import "./src/env.js";
/** @type {import("next").NextConfig} */ /** @type {import("next").NextConfig} */
const config = { const config = {
serverExternalPackages: ['pg'], output: "standalone",
serverExternalPackages: ["pg"],
}; };
export default config; export default config;