schema_migrations records every applied step; the former migrate() is step 3, the baseline that builds the v0.4.1 schema and repairs older databases. Columns are only added when missing, so every other error now stops the start with a clear message instead of being swallowed, and the cleanup statements no longer run on each start. migrations/001_init.sql was never read and is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.4 KiB
Docker
64 lines
2.4 KiB
Docker
# ==============================================================================
|
|
# Stage 1: Frontend Check & Build (Cached npm dependencies layer)
|
|
# ==============================================================================
|
|
FROM node:22-alpine AS frontend-builder
|
|
WORKDIR /app/frontend
|
|
COPY frontend/package*.json ./
|
|
RUN npm install --no-audit --no-fund
|
|
COPY frontend/ ./
|
|
# Version shown in the header: the git tag for releases (set by CI), otherwise "<package version>-dev"
|
|
ARG APP_VERSION=""
|
|
RUN npx tsc --noEmit && npm run test:run && APP_VERSION="${APP_VERSION}" npm run build
|
|
|
|
# ==============================================================================
|
|
# Stage 2: Go Backend Lint, Unit Tests & Binary Build (Cached Go module & sqlite layer)
|
|
# ==============================================================================
|
|
FROM golang:1.23-alpine AS backend-builder
|
|
WORKDIR /app
|
|
RUN apk add --no-cache git ca-certificates
|
|
|
|
# Cache Go modules & pre-compile heavy dependencies (modernc.org/sqlite) in a dedicated layer
|
|
COPY go.mod ./
|
|
RUN go get github.com/go-chi/chi/v5@v5.2.0 \
|
|
github.com/go-chi/cors@v1.2.1 \
|
|
github.com/golang-jwt/jwt/v5@v5.2.1 \
|
|
github.com/gorilla/websocket@v1.5.3 \
|
|
golang.org/x/crypto/bcrypt@v0.31.0 \
|
|
modernc.org/sqlite@v1.34.4 && \
|
|
CGO_ENABLED=0 go build \
|
|
modernc.org/sqlite \
|
|
github.com/go-chi/chi/v5 \
|
|
github.com/go-chi/cors \
|
|
github.com/golang-jwt/jwt/v5 \
|
|
github.com/gorilla/websocket \
|
|
golang.org/x/crypto/bcrypt
|
|
|
|
# Copy application source & compiled frontend SPA assets for go:embed
|
|
COPY cmd/ ./cmd/
|
|
COPY internal/ ./internal/
|
|
COPY --from=frontend-builder /app/frontend/dist ./cmd/server/dist
|
|
|
|
# Run go mod tidy, static analysis (go vet), unit tests (go test), and compile final binary
|
|
RUN go mod tidy && \
|
|
CGO_ENABLED=0 go vet ./... && \
|
|
CGO_ENABLED=0 go test -v ./... && \
|
|
CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/mindsift ./cmd/server
|
|
|
|
# ==============================================================================
|
|
# Stage 3: Minimal Production Runtime (< 35 MB)
|
|
# ==============================================================================
|
|
FROM alpine:3.21
|
|
RUN apk add --no-cache ca-certificates tzdata && \
|
|
mkdir -p /data /tmp && \
|
|
chmod 1777 /tmp
|
|
|
|
WORKDIR /app
|
|
COPY --from=backend-builder /app/mindsift /app/mindsift
|
|
|
|
ENV PORT=8080
|
|
ENV DATA_DIR=/data
|
|
VOLUME ["/data"]
|
|
|
|
EXPOSE 8080
|
|
ENTRYPOINT ["/app/mindsift"]
|