# syntax=docker/dockerfile:1 FROM node:22-bookworm-slim AS frontend-build WORKDIR /app COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ ARG VITE_BASE_PATH=/curltastic/ RUN npm test -- --pool=forks --poolOptions.forks.singleFork \ && npm run build -- --base="${VITE_BASE_PATH}" FROM rust:1.96-bookworm AS backend-build WORKDIR /app COPY backend/Cargo.toml backend/Cargo.lock ./ COPY backend/src/ ./src/ RUN cargo build --locked --release FROM debian:bookworm-slim AS backend RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl \ && rm -rf /var/lib/apt/lists/* \ && groupadd --gid 10001 curltastic \ && useradd --uid 10001 --gid 10001 --no-create-home --shell /usr/sbin/nologin curltastic COPY --from=backend-build /app/target/release/curltastic-backend /usr/local/bin/curltastic-backend USER 10001:10001 EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl --fail --silent --show-error http://127.0.0.1:3000/ || exit 1 ENTRYPOINT ["/usr/local/bin/curltastic-backend"] FROM nginx:1.28-alpine AS frontend COPY docker/nginx.conf /etc/nginx/nginx.conf COPY --from=frontend-build /app/dist/ /usr/share/nginx/html/ USER 101:101 EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget -q -O /dev/null http://127.0.0.1:8080/healthz || exit 1 ENTRYPOINT ["nginx"] CMD ["-g", "daemon off;"]