# ============================== # Stage 1: Builder (Bun) # ============================== FROM oven/bun:1.3.6-debian AS builder WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ libc6 \ git \ openssl \ ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY package.json bun.lockb* ./ COPY prisma ./prisma ENV ONNXRUNTIME_NODE_INSTALL_CUDA=0 ENV SHARP_IGNORE_GLOBAL_LIBVIPS=1 ENV NEXT_TELEMETRY_DISABLED=1 RUN bun install COPY . . # Gunakan .env jika ada, fallback ke .env.example. # Untuk build dengan .env custom, hapus .env dari .dockerignore # atau berikan via: docker build --secret id=env,src=.env (BuildKit) RUN if [ -f .env ]; then \ echo "INFO: Menggunakan .env"; \ elif [ -f .env.example ]; then \ cp .env.example .env; \ echo "WARNING: .env tidak ditemukan, menggunakan .env.example (isi dengan nilai yang benar)"; \ else \ echo "WARNING: Tidak ada .env atau .env.example"; \ fi # Generate prisma client RUN ./node_modules/.bin/prisma generate # Build Next.js RUN bun run build # ============================== # Stage 2: Runner (Bun) # ============================== FROM oven/bun:1.3.6-debian AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 RUN apt-get update && apt-get install -y --no-install-recommends \ openssl \ ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN groupadd --system --gid 1001 nodejs \ && useradd --system --uid 1001 --gid nodejs nextjs COPY --from=builder /app/public ./public COPY --from=builder /app/.next ./.next COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json COPY --from=builder /app/tsconfig.json ./tsconfig.json COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/src ./src # Env vars runtime dikelola oleh Portainer (stack env / container env). # Tidak perlu copy .env ke runner — image tetap bersih tanpa secrets. RUN chown -R nextjs:nodejs /app USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" CMD ["bun", "run", "start"]