diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..27f208d --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,45 @@ +# docker/Dockerfile + +# ============ Build stage ============ +FROM node:20-alpine AS builder + +WORKDIR /app + +# Install pnpm +RUN corepack enable && corepack prepare pnpm@latest --activate + +# Copy package files +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# Copy source and build +COPY . . +RUN pnpm prisma generate +RUN pnpm build + +# ============ Production stage ============ +FROM node:20-alpine AS runner + +WORKDIR /app + +# Install pnpm +RUN corepack enable && corepack prepare pnpm@latest --activate + +# Create non-root user +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 app + +# Copy built application +COPY --from=builder --chown=app:nodejs /app/.output ./.output +COPY --from=builder --chown=app:nodejs /app/node_modules ./node_modules +COPY --from=builder --chown=app:nodejs /app/package.json ./package.json +COPY --from=builder --chown=app:nodejs /app/prisma ./prisma + +USER app + +EXPOSE 3000 + +ENV NODE_ENV=production +ENV PORT=3000 + +CMD ["node", ".output/server/index.mjs"]