# ═══════════════════════════════════════════════════════════ # Kentro – Nigerian Draughts | Multi-stage Docker build # Stage 1: unzip source # Stage 2: build React frontend # Stage 3: compile Go backend # Stage 4: Python runtime (SCAN engine bridge) # ═══════════════════════════════════════════════════════════ # ── 1. Unpack ───────────────────────────────────────────── FROM alpine:3.19 AS unpacker WORKDIR /src RUN apk add --no-cache unzip COPY kentro_src.zip . RUN unzip -q kentro_src.zip && rm kentro_src.zip # ── 2. Frontend (React + Vite + Tailwind) ───────────────── FROM node:20-alpine AS frontend WORKDIR /app COPY --from=unpacker /src/frontend/package*.json ./ RUN npm install --silent COPY --from=unpacker /src/frontend/ . RUN npm run build # ── 3. Backend (Go) ─────────────────────────────────────── FROM golang:1.22-alpine AS backend WORKDIR /app RUN apk add --no-cache gcc musl-dev COPY --from=unpacker /src/backend/ . RUN go mod tidy && go mod download RUN CGO_ENABLED=1 GOOS=linux \ go build -ldflags="-s -w" -o server ./cmd/server # ── 4. Runtime ──────────────────────────────────────────── FROM python:3.11-slim WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates libgcc-s1 && \ rm -rf /var/lib/apt/lists/* # Go binary + frontend assets COPY --from=backend /app/server ./server COPY --from=frontend /app/dist/ ./frontend/dist/ # Python engine bridge + board logic COPY --from=unpacker /src/engine_bridge.py . COPY --from=unpacker /src/nigerian_draughts.py . COPY --from=unpacker /src/kivy_stub.py . # SCAN engine binary + config + eval weights COPY --from=unpacker /src/scan_nigerian ./scan_nigerian COPY --from=unpacker /src/scan.ini . COPY --from=unpacker /src/data/ ./data/ # Permissions + non-root user RUN chmod +x ./scan_nigerian && \ useradd -r -u 1001 -s /bin/false appuser && \ chown -R appuser:appuser /app && \ mkdir -p /data && chown appuser:appuser /data USER appuser EXPOSE 7860 ENV PORT=7860 \ STATIC_DIR=/app/frontend/dist CMD ["./server"]