# Stage 1: Install dependencies FROM node:20-alpine AS base WORKDIR /app COPY package.json package-lock.json ./ COPY shared/package.json shared/ COPY client/package.json client/ COPY server/package.json server/ RUN npm ci # Stage 2: Build shared FROM base AS shared-build COPY shared/ shared/ RUN npm run build -w shared # Stage 3: Build client FROM shared-build AS client-build ARG VITE_AZURE_CLIENT_ID ARG VITE_AZURE_TENANT_ID COPY client/ client/ RUN npm run build -w client # Stage 4: Build server + generate migrations FROM shared-build AS server-build COPY server/ server/ RUN npm run build -w server # Stage 5: Production runtime FROM node:20-alpine AS runtime WORKDIR /app COPY package.json package-lock.json ./ COPY shared/package.json shared/ COPY server/package.json server/ RUN npm ci --omit=dev # Copy built artifacts COPY --from=shared-build /app/shared/dist/ shared/dist/ COPY --from=shared-build /app/shared/src/ shared/src/ COPY --from=shared-build /app/shared/package.json shared/ COPY --from=server-build /app/server/dist/ server/dist/ COPY --from=server-build /app/server/drizzle/ server/drizzle/ COPY --from=client-build /app/client/build/ public/ ARG APP_VERSION=dev RUN echo "{\"version\":\"$APP_VERSION\"}" > public/version.json ENV NODE_ENV=production ENV PORT=3001 ENV DATABASE_PATH=/home/data/ka-note.db EXPOSE 3001 CMD ["node", "--max-http-header-size=65536", "server/dist/index.js"]