kaneo (minimalist kanban) fork to experiment adding a tangled integration github.com/usekaneo/kaneo
at main 77 lines 2.6 kB view raw
1# Build stage 2FROM --platform=$BUILDPLATFORM node:20-alpine AS builder 3 4# Install build dependencies in a single layer 5RUN apk add --no-cache python3 make g++ && \ 6 corepack enable && \ 7 corepack prepare pnpm@10.7.0 --activate 8 9WORKDIR /app 10 11# Copy only package files first for better caching 12COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ 13COPY packages/typescript-config/package.json ./packages/typescript-config/ 14COPY packages/email/package.json ./packages/email/ 15COPY packages/libs/package.json ./packages/libs/ 16COPY apps/api/package.json ./apps/api/ 17 18# Install dependencies 19RUN pnpm install --frozen-lockfile 20 21# Copy source files 22COPY packages/typescript-config ./packages/typescript-config 23COPY packages/email ./packages/email 24COPY packages/libs ./packages/libs 25COPY apps/api ./apps/api 26 27# Build email package first 28WORKDIR /app/packages/email 29RUN pnpm run build 30 31# Fix TypeScript config and build API 32WORKDIR /app/apps/api 33RUN sed -i 's/"extends": "@kaneo\/typescript-config\/base.json"/"extends": "..\/..\/packages\/typescript-config\/base.json"/g' /app/apps/api/tsconfig.json && \ 34 pnpm run build 35 36# Production stage - use specific version tag without SHA256 37FROM node:20.12-alpine AS runtime 38 39# Set up user in a single layer 40RUN addgroup -g 1001 appuser && \ 41 adduser -u 1001 -G appuser -D appuser && \ 42 mkdir -p /app/apps/api/data && \ 43 chown -R appuser:appuser /app 44 45WORKDIR /app 46 47# Copy package files for production install 48COPY --from=builder /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./ 49COPY --from=builder /app/apps/api/package.json ./apps/api/ 50COPY --from=builder /app/packages/typescript-config/package.json ./packages/typescript-config/ 51COPY --from=builder /app/packages/libs/package.json ./packages/libs/ 52COPY --from=builder /app/packages/email/package.json ./packages/email/ 53 54# Install production dependencies only 55RUN sed -i 's/"prepare": "husky"/"prepare": ""/g' package.json && \ 56 corepack enable && \ 57 corepack prepare pnpm@10.7.0 --activate && \ 58 HUSKY=0 NODE_ENV=production pnpm install --prod --frozen-lockfile --no-optional 59 60# Copy built files 61COPY --from=builder /app/apps/api/dist ./apps/api/dist 62COPY --from=builder /app/apps/api/drizzle ./apps/api/drizzle 63COPY --from=builder /app/packages/email ./packages/email 64 65# Set environment variables 66ENV NODE_ENV=production 67 68# Switch to non-root user 69USER appuser 70WORKDIR /app/apps/api 71EXPOSE 1337 72 73# Add health check 74HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ 75 CMD wget --no-verbose --tries=1 --spider http://localhost:1337/api/health || exit 1 76 77CMD ["node", "--enable-source-maps", "dist/index.js"]