Add Docker deployment with Caddy HTTPS reverse proxy
CPU-only torch image (~180MB vs 873MB CUDA), PipeWire socket passthrough for audio playback, SNAC HuggingFace cache volume. Served at voice.l.supported.systems via caddy-docker-proxy.
This commit is contained in:
parent
2fd84f0df7
commit
c53db4b251
41
Dockerfile
Normal file
41
Dockerfile
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim
|
||||||
|
|
||||||
|
# PipeWire client tools — pw-play connects to the host's PipeWire socket
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
pipewire-bin \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV UV_COMPILE_BYTECODE=1
|
||||||
|
|
||||||
|
# Create venv
|
||||||
|
RUN uv venv
|
||||||
|
|
||||||
|
# Install CPU-only torch first (saves ~3GB vs CUDA — SNAC runs on CPU anyway)
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||||
|
uv pip install torch --index-url https://download.pytorch.org/whl/cpu
|
||||||
|
|
||||||
|
# Install project dependencies (torch already satisfied, won't redownload)
|
||||||
|
COPY pyproject.toml ./
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||||
|
uv pip install --no-deps -r pyproject.toml 2>/dev/null || true
|
||||||
|
|
||||||
|
# Copy source and install project
|
||||||
|
COPY src/ src/
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||||
|
uv pip install .
|
||||||
|
|
||||||
|
# Non-root user matching host uid for PipeWire socket access
|
||||||
|
RUN useradd -u 1000 -m tts \
|
||||||
|
&& mkdir -p /home/tts/.cache/huggingface \
|
||||||
|
&& chown -R tts:tts /home/tts/.cache
|
||||||
|
USER tts
|
||||||
|
|
||||||
|
ENV PATH="/app/.venv/bin:$PATH"
|
||||||
|
EXPOSE 8371
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s \
|
||||||
|
CMD python -c "import socket; s=socket.create_connection(('127.0.0.1',8371),2); s.close()" || exit 1
|
||||||
|
|
||||||
|
CMD ["tts-mcp"]
|
||||||
28
Makefile
Normal file
28
Makefile
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
include .env
|
||||||
|
export
|
||||||
|
|
||||||
|
.PHONY: build up down logs restart status
|
||||||
|
|
||||||
|
build:
|
||||||
|
docker compose build
|
||||||
|
|
||||||
|
up: build
|
||||||
|
docker compose up -d
|
||||||
|
@sleep 2
|
||||||
|
docker compose logs --tail 20
|
||||||
|
|
||||||
|
down:
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
logs:
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
restart:
|
||||||
|
docker compose restart
|
||||||
|
@sleep 2
|
||||||
|
docker compose logs --tail 20
|
||||||
|
|
||||||
|
status:
|
||||||
|
@docker compose ps
|
||||||
|
@echo "---"
|
||||||
|
@curl -s http://localhost:8371/mcp 2>/dev/null | head -5 || echo "Server not responding"
|
||||||
36
docker-compose.yml
Normal file
36
docker-compose.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
services:
|
||||||
|
tts-mcp:
|
||||||
|
build: .
|
||||||
|
container_name: tts-mcp
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: .env
|
||||||
|
environment:
|
||||||
|
# Override for Docker networking (container DNS instead of IPs)
|
||||||
|
TTS_PIPER_HOST: piper-tts
|
||||||
|
TTS_OLLAMA_URL: http://host.docker.internal:11434
|
||||||
|
# PipeWire client config
|
||||||
|
XDG_RUNTIME_DIR: /run/user/1000
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
volumes:
|
||||||
|
# Kokoro ONNX models (read-only)
|
||||||
|
- ./models:/app/models:ro
|
||||||
|
# HuggingFace cache for SNAC model download
|
||||||
|
- hf-cache:/home/tts/.cache/huggingface
|
||||||
|
# PipeWire socket for audio playback through host speakers
|
||||||
|
- /run/user/1000/pipewire-0:/run/user/1000/pipewire-0
|
||||||
|
networks:
|
||||||
|
- caddy
|
||||||
|
- dootie-internal
|
||||||
|
labels:
|
||||||
|
caddy: voice.l.supported.systems
|
||||||
|
caddy.reverse_proxy: "{{upstreams 8371}}"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
hf-cache:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy:
|
||||||
|
external: true
|
||||||
|
dootie-internal:
|
||||||
|
external: true
|
||||||
Loading…
x
Reference in New Issue
Block a user