Ten members and a handful of songs a week never needed a database server,
and the server was the last thing making this a two-container deployment.
modernc.org/sqlite is pure Go, so CGO_ENABLED=0 survives and the dependency
count is unchanged: pgx out, sqlite in.
The port stayed small because the driver matches $1-style placeholders
against argument ordinals exactly as pgx does, so no query needed rewriting
for parameters. What did change:
- timestamptz becomes timestamp holding UTC 'YYYY-MM-DD HH:MM:SS'. The
declared type is what makes the driver return time.Time, and the
fixed-width UTC string is what makes ordering and comparison against
datetime('now') mean what they say.
- interval has no equivalent: sessions.idle_ttl is seconds, and the review
edit window travels as a SQLite date modifier string.
- No stddev_pop, so the divisive and unified boards spell the population
formula out, guarded with max(0.0, ...) because cancellation returns a
tiny negative when every score is identical.
- foreign_keys is off by default, so the cascades only exist because the
pragma is set on every connection.
Drops the postgres service, its healthcheck, the depends_on gate, the
startup retry loop and POSTGRES_PASSWORD. ./storage is now the whole
backup. Tests get a fresh database file per test and run everywhere
instead of skipping without TEST_DATABASE_URL.
20 lines
871 B
Docker
20 lines
871 B
Docker
FROM golang:1.26-alpine AS build
|
|
# CalVer, injected at build so no file needs bumping by hand: docker build --build-arg VERSION=…
|
|
ARG VERSION=dev
|
|
WORKDIR /src
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
COPY . .
|
|
RUN CGO_ENABLED=0 go build -ldflags "-X main.version=${VERSION}" -o /levyraati .
|
|
|
|
FROM alpine:3.24
|
|
# yt-dlp rots against YouTube. Alpine's active branch tracks it closely (3.24 carries the current
|
|
# release), so a rebuild is the update — and this avoids python3 + pip in the image entirely.
|
|
# sqlite is the CLI only — the app links its own pure-Go copy. It is here so `.backup` and a shell
|
|
# are reachable with docker compose exec, which is the whole of database operations now.
|
|
RUN apk add --no-cache ffmpeg yt-dlp ca-certificates sqlite
|
|
COPY --from=build /levyraati /usr/local/bin/levyraati
|
|
ENV STORAGE_DIR=/storage
|
|
EXPOSE 8080
|
|
ENTRYPOINT ["levyraati"]
|