FROM node:22-bookworm-slim AS client WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run proto:generate && npm run typecheck && npm test && npm run build FROM rust:1-bookworm AS server WORKDIR /app COPY server server COPY proto proto RUN cargo build --release --locked --manifest-path server/Cargo.toml --bin citygen-server FROM node:22-bookworm-slim WORKDIR /app COPY --from=client /app/node_modules node_modules COPY --from=client /app/dist dist COPY --from=client /app/src src COPY --from=client /app/tools tools COPY --from=client /app/samples samples COPY --from=client /app/package.json package.json COPY --from=server /app/server/target/release/citygen-server /usr/local/bin/citygen-server RUN mkdir -p /app/public/cities /app/data && chown -R node:node /app ENV CITYGEN_BIND=0.0.0.0:3000 USER node HEALTHCHECK --interval=15s --timeout=3s --start-period=30s --retries=3 CMD node -e "fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" VOLUME ["/app/public/cities", "/app/data"] EXPOSE 3000 CMD ["citygen-server"]