Some checks failed
Release / Test backend (push) Successful in 36s
Release / Check ui (push) Successful in 50s
Release / Docker / caddy (push) Failing after 45s
CI / Test backend (pull_request) Successful in 39s
CI / Check ui (pull_request) Failing after 11s
CI / Docker / ui (pull_request) Has been skipped
CI / Docker / caddy (pull_request) Failing after 11s
Release / Docker / backend (push) Failing after 48s
Release / Docker / runner (push) Failing after 58s
Release / Upload source maps (push) Failing after 39s
CI / Docker / backend (pull_request) Failing after 34s
CI / Docker / runner (pull_request) Failing after 30s
Release / Docker / ui (push) Successful in 2m42s
Release / Gitea Release (push) Has been skipped
- New backend/internal/pockettts package: POST /tts client for kyutai-labs/pocket-tts; streams WAV response and transcodes to MP3 via ffmpeg so the rest of the pipeline stays format-agnostic - config.PocketTTS struct + POCKET_TTS_URL env var - runner.Dependencies.PocketTTS field; runAudioTask routes by voice name: pockettts.IsPocketTTSVoice (alba, marius, javert, …) → pocket-tts, everything else → kokoro-fastapi - Dockerfile: runner stage switched from distroless/static to alpine:3.21 with ffmpeg + ca-certificates installed - homelab compose: runner gets POCKET_TTS_URL=http://pocket-tts:8000 - Doppler prd + prd_homelab: KOKORO_URL=https://tts.libnovel.cc, POCKET_TTS_URL=https://pocket-tts.libnovel.cc
48 lines
2.1 KiB
Docker
48 lines
2.1 KiB
Docker
# syntax=docker/dockerfile:1
|
|
FROM golang:1.26.1-alpine AS builder
|
|
WORKDIR /app
|
|
|
|
# Download modules into the BuildKit cache so they survive across builds.
|
|
# This layer is only invalidated when go.mod or go.sum changes.
|
|
COPY go.mod go.sum ./
|
|
RUN --mount=type=cache,target=/root/go/pkg/mod \
|
|
go mod download
|
|
|
|
COPY . .
|
|
|
|
ARG VERSION=dev
|
|
ARG COMMIT=unknown
|
|
|
|
# Build all three binaries in a single layer so the Go compiler can reuse
|
|
# intermediate object files. Both cache mounts are preserved between builds:
|
|
# /root/go/pkg/mod — downloaded module source
|
|
# /root/.cache/go-build — compiled package objects (incremental recompile)
|
|
RUN --mount=type=cache,target=/root/go/pkg/mod \
|
|
--mount=type=cache,target=/root/.cache/go-build \
|
|
CGO_ENABLED=0 GOOS=linux go build \
|
|
-ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT}" \
|
|
-o /out/backend ./cmd/backend && \
|
|
CGO_ENABLED=0 GOOS=linux go build \
|
|
-ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT}" \
|
|
-o /out/runner ./cmd/runner && \
|
|
CGO_ENABLED=0 GOOS=linux go build \
|
|
-ldflags="-s -w" \
|
|
-o /out/healthcheck ./cmd/healthcheck
|
|
|
|
# ── backend service ──────────────────────────────────────────────────────────
|
|
FROM gcr.io/distroless/static:nonroot AS backend
|
|
COPY --from=builder /out/healthcheck /healthcheck
|
|
COPY --from=builder /out/backend /backend
|
|
ENTRYPOINT ["/backend"]
|
|
|
|
# ── runner service ───────────────────────────────────────────────────────────
|
|
# Uses Alpine (not distroless) so ffmpeg is available for WAV→MP3 transcoding
|
|
# when pocket-tts voices are used.
|
|
FROM alpine:3.21 AS runner
|
|
RUN apk add --no-cache ffmpeg ca-certificates && \
|
|
addgroup -S appgroup && adduser -S appuser -G appgroup
|
|
COPY --from=builder /out/healthcheck /healthcheck
|
|
COPY --from=builder /out/runner /runner
|
|
USER appuser
|
|
ENTRYPOINT ["/runner"]
|