You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.1 KiB
Docker

# ===================================================================
# Stage 1: Build the frontend
# ===================================================================
FROM node:22-alpine AS frontend-builder
WORKDIR /app
# Copy package files first for dependency caching
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
# Inject build-time env var after npm ci for better Docker layer caching
ARG VITE_TURNSTILE_SITE_KEY
ENV VITE_TURNSTILE_SITE_KEY=${VITE_TURNSTILE_SITE_KEY}
# Copy source and build
COPY frontend/ ./
RUN npm run build
# ===================================================================
# Stage 2: Build the Rust backend
# ===================================================================
FROM rust:1.88-bookworm AS builder
WORKDIR /app
# Copy manifests and source for building
COPY backend/Cargo.toml backend/Cargo.lock ./
COPY backend/src/ src/
COPY backend/migrations/ migrations/
# Set sqlx offline mode (no live DB needed during build)
ENV SQLX_OFFLINE=true
RUN cargo build --release
# ===================================================================
# Stage 3: Minimal runtime image
# ===================================================================
FROM debian:bookworm-slim AS runtime
# Install only what the binary needs at runtime
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
libssl3 \
curl \
&& rm -rf /var/lib/apt/lists/*
# Create non-root user
RUN groupadd --system appuser \
&& useradd --system --gid appuser --home-dir /app --no-create-home --shell /usr/sbin/nologin appuser
WORKDIR /app
# Copy backend binary
COPY --from=builder /app/target/release/ai-synth-backend ./ai-synth-backend
# Copy migrations (run at startup)
COPY --from=builder /app/migrations/ ./migrations/
# Copy built frontend
COPY --from=frontend-builder /app/dist/ ./static/
# Set ownership
RUN chown -R appuser:appuser /app
USER appuser
ENV PORT=8080
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD curl -f http://localhost:8080/api/v1/health || exit 1
ENTRYPOINT ["./ai-synth-backend"]
CMD ["serve"]