spaxel/Dockerfile
jedarden 6b87040721 feat(ci): build ESP32 firmware in Dockerfile and seed OTA on startup
Add espressif/idf:v5.2 as a multi-stage build step so the firmware
binary is baked into the image at /firmware/spaxel-firmware.bin.
On startup the mothership copies it into /data/firmware/ (PVC) if not
already present, making it immediately available for the onboarding
wizard without a manual upload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 14:58:14 -04:00

58 lines
1.7 KiB
Docker

# Spaxel Mothership Dockerfile
# Multi-stage build: ESP32 firmware → Go binary → minimal runtime image
# Stage 1: Build ESP32-S3 firmware
FROM espressif/idf:v5.2 AS firmware-builder
WORKDIR /project
COPY firmware/ ./
# idf.py build produces build/spaxel-firmware.bin
RUN idf.py build
# Stage 2: Build the Go binary
FROM golang:1.25-bookworm AS builder
WORKDIR /app
# Copy Go module files first for better caching
COPY mothership/go.mod mothership/go.sum ./
RUN go mod download
# Copy source code
COPY mothership/ ./
# Build the binary
# CGO_ENABLED=0 because we use pure-Go SQLite (modernc.org/sqlite)
ARG VERSION=dev
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-s -w -X main.version=${VERSION}" \
-o spaxel ./cmd/mothership
# Stage 2: Minimal runtime image
FROM debian:12-slim
# Install wget for health check
RUN apt-get update && apt-get install -y --no-install-recommends wget ca-certificates && rm -rf /var/lib/apt/lists/*
# Copy the binary
COPY --from=builder /app/spaxel /spaxel
# Copy dashboard static files (served from filesystem at runtime)
COPY dashboard/ /dashboard/
# Bake ESP32 firmware into the image so the mothership can seed it on first run.
# The mothership copies /firmware/*.bin → /data/firmware/ at startup if not present.
COPY --from=firmware-builder /project/build/spaxel-firmware.bin /firmware/spaxel-firmware.bin
VOLUME ["/data"]
# Expose HTTP/WebSocket port
EXPOSE 8080
# Health check — verifies service responds with status=ok
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
CMD wget -qO- http://localhost:8080/healthz | grep -q '"status":"ok"' || exit 1
# Run as non-root
ENTRYPOINT ["/spaxel"]