48 lines
2.5 KiB
Docker
48 lines
2.5 KiB
Docker
FROM oven/bun:1.4.0 AS source
|
|
WORKDIR /app
|
|
COPY package.json bun.lock ./
|
|
COPY apps/web/package.json apps/web/package.json
|
|
COPY apps/worker/package.json apps/worker/package.json
|
|
COPY packages/contracts/package.json packages/contracts/package.json
|
|
COPY packages/database/package.json packages/database/package.json
|
|
COPY packages/email/package.json packages/email/package.json
|
|
COPY packages/storage/package.json packages/storage/package.json
|
|
# Keep native optional dependencies beside their packages for Next's external
|
|
# module loading and standalone tracing (including Sharp's Linux binaries).
|
|
RUN bun install --frozen-lockfile --linker hoisted --network-concurrency 8
|
|
COPY . .
|
|
|
|
FROM source AS builder
|
|
ARG NEXT_PUBLIC_APP_URL
|
|
ENV NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL NEXT_TELEMETRY_DISABLED=1
|
|
# Build-only resource controls for the shared Coolify VM; not runtime settings.
|
|
ENV NEXT_BUILD_CPUS=2 RAYON_NUM_THREADS=2 UV_THREADPOOL_SIZE=2 MALLOC_ARENA_MAX=2 NODE_OPTIONS=--max-old-space-size=1536
|
|
# Build-only placeholders; never copy production secrets into image layers.
|
|
RUN DATABASE_URL=postgres://build:build@127.0.0.1:5432/build BETTER_AUTH_SECRET=build-only-placeholder-secret-not-for-runtime BETTER_AUTH_URL=$NEXT_PUBLIC_APP_URL bun run --filter @album/web build
|
|
|
|
FROM oven/bun:1.4.0 AS web
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production HOSTNAME=0.0.0.0 PORT=3000 NEXT_TELEMETRY_DISABLED=1
|
|
COPY --from=builder --chown=bun:bun /app/apps/web/.next/standalone ./
|
|
# Next's standalone trace can omit libvips shared libraries loaded by Sharp.
|
|
COPY --from=builder --chown=bun:bun /app/node_modules/@img ./node_modules/@img
|
|
COPY --from=builder --chown=bun:bun /app/apps/web/.next/static ./apps/web/.next/static
|
|
COPY --from=builder --chown=bun:bun /app/apps/web/public ./apps/web/public
|
|
COPY --from=builder --chown=bun:bun /app/scripts/check-production-env.ts ./scripts/check-production-env.ts
|
|
USER bun
|
|
RUN cd /app/apps/web && bun -e 'import sharp from "sharp"; const image = await sharp({create:{width:8,height:8,channels:3,background:"white"}}).webp().toBuffer(); if (!image.length) throw new Error("Sharp runtime smoke test failed");'
|
|
EXPOSE 3000
|
|
CMD ["sh", "-c", "bun scripts/check-production-env.ts && exec bun apps/web/server.js"]
|
|
|
|
FROM source AS worker
|
|
ENV NODE_ENV=production
|
|
USER bun
|
|
CMD ["sh", "-c", "bun scripts/check-production-env.ts && exec bun apps/worker/src/index.ts"]
|
|
|
|
FROM worker AS migrate
|
|
WORKDIR /app/packages/database
|
|
CMD ["bun", "src/migrate.ts"]
|
|
|
|
FROM dxflrs/garage:v2.3.0 AS garage
|
|
COPY docker/garage.production.toml /etc/garage.toml
|