From f822d90dd3590de3fa7e1563e2c28724ee1e4f03 Mon Sep 17 00:00:00 2001 From: syntaxbullet Date: Fri, 13 Feb 2026 14:28:43 +0100 Subject: [PATCH] refactor: merge dockerfiles --- Dockerfile | 39 +++++++++++++++++++++++++++++++++ Dockerfile.prod | 48 ----------------------------------------- docker-compose.prod.yml | 2 +- 3 files changed, 40 insertions(+), 49 deletions(-) delete mode 100644 Dockerfile.prod diff --git a/Dockerfile b/Dockerfile index e84b810..c5cdff9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,3 +33,42 @@ EXPOSE 3000 # Default command CMD ["bun", "run", "dev"] + +# ============================================ +# Builder stage - copies source for production +# ============================================ +FROM base AS builder + +# Copy dependencies from deps stage +COPY --from=deps /app/node_modules ./node_modules + +# Copy source code +COPY . . + +# ============================================ +# Production stage - minimal runtime image +# ============================================ +FROM oven/bun:latest AS production +WORKDIR /app + +# Copy only what's needed for production +COPY --from=builder --chown=bun:bun /app/node_modules ./node_modules +COPY --from=builder --chown=bun:bun /app/web/src ./web/src +COPY --from=builder --chown=bun:bun /app/bot ./bot +COPY --from=builder --chown=bun:bun /app/shared ./shared +COPY --from=builder --chown=bun:bun /app/package.json . +COPY --from=builder --chown=bun:bun /app/drizzle.config.ts . +COPY --from=builder --chown=bun:bun /app/tsconfig.json . + +# Switch to non-root user +USER bun + +# Expose web dashboard port +EXPOSE 3000 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD bun -e "fetch('http://localhost:3000/api/health').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))" + +# Run in production mode +CMD ["bun", "run", "bot/index.ts"] diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index d2be5b1..0000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,48 +0,0 @@ -# ============================================================================= -# Stage 1: Dependencies & Build -# ============================================================================= -FROM oven/bun:latest AS builder -WORKDIR /app - -# Install system dependencies needed for build -RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* - -# Install root project dependencies -COPY package.json bun.lock ./ -RUN bun install --frozen-lockfile - -# Copy source code -COPY . . - -# ============================================================================= -# Stage 2: Production Runtime -# ============================================================================= -FROM oven/bun:latest AS production -WORKDIR /app - -# Create non-root user for security (bun user already exists with 1000:1000) -# No need to create user/group - - - -# Copy only what's needed for production -COPY --from=builder --chown=bun:bun /app/node_modules ./node_modules -COPY --from=builder --chown=bun:bun /app/web/src ./web/src -COPY --from=builder --chown=bun:bun /app/bot ./bot -COPY --from=builder --chown=bun:bun /app/shared ./shared -COPY --from=builder --chown=bun:bun /app/package.json . -COPY --from=builder --chown=bun:bun /app/drizzle.config.ts . -COPY --from=builder --chown=bun:bun /app/tsconfig.json . - -# Switch to non-root user -USER bun - -# Expose web dashboard port -EXPOSE 3000 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ - CMD bun -e "fetch('http://localhost:3000/api/health').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))" - -# Run in production mode -CMD ["bun", "run", "bot/index.ts"] diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 67ba9c2..a3ad19c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -34,7 +34,7 @@ services: restart: unless-stopped build: context: . - dockerfile: Dockerfile.prod + dockerfile: Dockerfile target: production image: aurora-app:latest ports: