# Multi-stage build for minimal image size
FROM golang:1.24-alpine AS builder

WORKDIR /app

# Install build dependencies
RUN apk add --no-cache git ca-certificates tzdata

# Copy go mod files
COPY go.mod go.sum ./

# Download dependencies
RUN go mod download

# Copy source code
COPY . .

# Build binary
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o kvstore ./cmd/kvstore

# Create non-root user
RUN addgroup -g 1000 appuser && \
    adduser -u 1000 -G appuser -s /sbin/nologin -D appuser

# Final image - minimal
FROM alpine:latest

RUN apk --no-cache add ca-certificates tzdata

# Create non-root user
RUN addgroup -g 1000 appuser && \
    adduser -u 1000 -G appuser -s /sbin/nologin -D appuser

WORKDIR /home/appuser

# Copy binary from builder
COPY --from=builder /app/kvstore .
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group

# Create data directory
RUN mkdir -p /home/appuser/data && \
    chown -R appuser:appuser /home/appuser

USER appuser

# Expose ports
# 8080 - HTTP API
# 7000 - Raft consensus protocol
EXPOSE 8080 7000

# Health check
HEALTHCHECK --interval=10s --timeout=5s --retries=3 \
    CMD wget --quiet --tries=1 --spider http://localhost:8080/health || exit 1

# Default command - bootstrap mode for single node
ENTRYPOINT ["./kvstore"]
CMD ["--bootstrap", "--http-addr=:8080", "--raft-addr=:7000"]
