# GuruRMM Server Dockerfile
# Multi-stage build for minimal image size

# ============================================
# Build Stage
# ============================================
FROM rust:1.85-alpine AS builder

# Install build dependencies
RUN apk add --no-cache musl-dev openssl-dev openssl-libs-static pkgconfig

# Create app directory
WORKDIR /app

# Copy manifests first for better caching
COPY Cargo.toml Cargo.lock* ./

# Create dummy src to build dependencies
RUN mkdir src && echo "fn main() {}" > src/main.rs

# Pin home crate to version compatible with Rust 1.85 (0.5.12 requires Rust 1.88)
RUN cargo update home --precise 0.5.9

# Build dependencies only (this layer will be cached)
RUN cargo build --release && rm -rf src target/release/deps/gururmm*

# Copy actual source code
COPY src ./src
COPY migrations ./migrations

# Build the actual application
RUN cargo build --release

# ============================================
# Runtime Stage
# ============================================
FROM alpine:3.19

# Install runtime dependencies
RUN apk add --no-cache ca-certificates libgcc

# Create non-root user
RUN addgroup -g 1000 gururmm && \
    adduser -u 1000 -G gururmm -s /bin/sh -D gururmm

# Create app directory
WORKDIR /app

# Copy binary from builder
COPY --from=builder /app/target/release/gururmm-server /app/gururmm-server

# Copy migrations (for runtime migrations)
COPY --from=builder /app/migrations /app/migrations

# Set ownership
RUN chown -R gururmm:gururmm /app

# Switch to non-root user
USER gururmm

# Expose port
EXPOSE 3001

# Health check (use 127.0.0.1 instead of localhost to avoid IPv6 issues)
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:3001/health || exit 1

# Run the server
CMD ["/app/gururmm-server"]
