FROM alpine:3.22 AS source RUN apk add --no-cache unzip WORKDIR /src COPY annonet-arrowstack-ready.zip /tmp/annonet.zip RUN unzip -q /tmp/annonet.zip -d /src COPY mcpAuthMiddleware.js /src/src/auth/mcpAuthMiddleware.js FROM node:22-alpine AS frontend-build WORKDIR /build/frontend-astro COPY --from=source /src/frontend-astro/package*.json ./ RUN npm ci COPY --from=source /src/frontend-astro/ ./ RUN npm run build FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=8787 COPY --from=source /src/package*.json ./ RUN npm ci --omit=dev && npm cache clean --force COPY --from=source /src/src ./src COPY --from=source /src/sql ./sql COPY --from=source /src/scripts ./scripts COPY --from=source /src/frontend ./frontend COPY --from=frontend-build /build/frontend-astro/dist ./public RUN npm run check \ && mkdir -p /app/uploads/images \ && cp /app/frontend/annotation-overlay.js /app/public/annotation-overlay.js \ && cp /app/frontend/*.html /app/public/ EXPOSE 8787 HEALTHCHECK --interval=10s --timeout=5s --start-period=20s --retries=6 \ CMD node -e "fetch('http://127.0.0.1:8787/api/health/ready').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" CMD ["npm", "start"]