`main.go` only ever loaded `.env`; the `APP_ENV` switch described in `.env.local` / `.env.production` did not exist, and a missing variable surfaced one restart at a time as a log.Fatalf inside db.Connect. config.Load now picks `.env.<APP_ENV>` (default local) then `.env`, with real environment winning, reads every setting into one typed Config and reports everything missing in one message. Production insists on a POS signing secret; local warns when DB_HOST is not a local address. db, redis and the image store take the Config instead of reading env themselves. Also: - livehub read MQTT_USERNAME while everything else uses MQTT_USER, so the console stream connected to the broker unauthenticated. Both accepted. - .dockerignore: `COPY . .` was baking .env.production into the image. Dockerfile sets APP_ENV=production. - Drop utils/config.go (dead viper loader) and create_table.go (unused, hardcoded production DSN); go mod tidy removes viper. - .env.example lists every variable the code reads; docs/ENVIRONMENT.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
27 lines
720 B
Docker
27 lines
720 B
Docker
# ---------- Build Stage ----------
|
|
FROM golang:1.24 AS builder
|
|
|
|
WORKDIR /app
|
|
COPY . .
|
|
|
|
RUN CGO_ENABLED=0 GOOS=linux go build -o server
|
|
|
|
# ---------- Runtime Stage ----------
|
|
FROM alpine:latest
|
|
RUN apk add --no-cache tzdata
|
|
WORKDIR /app
|
|
|
|
COPY --from=builder /app/server /app
|
|
COPY nearle-gear-firebase-adminsdk-l9oha-23ca3b3609.json .
|
|
|
|
# No `.env.*` is copied in (see .dockerignore), so this only decides which
|
|
# rules config.Load applies: production insists on a signing secret and never
|
|
# falls back to localhost values. Every real value comes from the platform's
|
|
# environment settings.
|
|
ENV APP_ENV=production
|
|
|
|
# Must match APP_PORT in the platform's environment (1009 in production).
|
|
EXPOSE 1009
|
|
|
|
CMD ["/app/server"]
|