93 lines
3.3 KiB
YAML
93 lines
3.3 KiB
YAML
services:
|
|
|
|
# ── Presentation (Rust / Axum — HTTP API) ────────────────────────────────
|
|
presentation:
|
|
build:
|
|
context: ./k-tv-backend
|
|
target: presentation
|
|
image: registry.gabrielkaszewski.dev/k-tv-presentation:latest
|
|
ports:
|
|
- "${BACKEND_PORT:-3000}:3000"
|
|
environment:
|
|
- HOST=0.0.0.0
|
|
- PORT=3000
|
|
- DATABASE_URL=sqlite:///app/data/k-tv.db?mode=rwc
|
|
- CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS}
|
|
- JWT_SECRET=${JWT_SECRET}
|
|
- COOKIE_SECRET=${COOKIE_SECRET}
|
|
- JWT_EXPIRY_HOURS=${JWT_EXPIRY_HOURS:-24}
|
|
- SECURE_COOKIE=${SECURE_COOKIE:-false}
|
|
- PRODUCTION=${PRODUCTION:-false}
|
|
- ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-true}
|
|
- DB_MAX_CONNECTIONS=${DB_MAX_CONNECTIONS:-5}
|
|
- DB_MIN_CONNECTIONS=${DB_MIN_CONNECTIONS:-1}
|
|
- JELLYFIN_BASE_URL=${JELLYFIN_BASE_URL}
|
|
- JELLYFIN_API_KEY=${JELLYFIN_API_KEY}
|
|
- JELLYFIN_USER_ID=${JELLYFIN_USER_ID}
|
|
volumes:
|
|
- backend_data:/app/data
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/v1/config || exit 1"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
# ── Worker (background jobs) ─────────────────────────────────────────────
|
|
worker:
|
|
build:
|
|
context: ./k-tv-backend
|
|
target: worker
|
|
image: registry.gabrielkaszewski.dev/k-tv-worker:latest
|
|
environment:
|
|
- DATABASE_URL=sqlite:///app/data/k-tv.db?mode=rwc
|
|
- JELLYFIN_BASE_URL=${JELLYFIN_BASE_URL}
|
|
- JELLYFIN_API_KEY=${JELLYFIN_API_KEY}
|
|
- JELLYFIN_USER_ID=${JELLYFIN_USER_ID}
|
|
volumes:
|
|
- backend_data:/app/data
|
|
depends_on:
|
|
presentation:
|
|
condition: service_healthy
|
|
restart: unless-stopped
|
|
|
|
# ── Playout (HLS streaming) ──────────────────────────────────────────────
|
|
playout:
|
|
build:
|
|
context: ./k-tv-backend
|
|
target: playout
|
|
image: registry.gabrielkaszewski.dev/k-tv-playout:latest
|
|
ports:
|
|
- "${PLAYOUT_PORT:-9090}:9090"
|
|
environment:
|
|
- DATABASE_URL=sqlite:///app/data/k-tv.db?mode=rwc
|
|
- PLAYOUT_LISTEN_ADDR=0.0.0.0:9090
|
|
- PLAYOUT_STORAGE_PATH=/tmp/k-tv-playout
|
|
- PLAYOUT_SEGMENT_DURATION=${PLAYOUT_SEGMENT_DURATION:-6}
|
|
volumes:
|
|
- backend_data:/app/data
|
|
depends_on:
|
|
presentation:
|
|
condition: service_healthy
|
|
restart: unless-stopped
|
|
|
|
# ── Frontend (Next.js) ────────────────────────────────────────────────────
|
|
frontend:
|
|
build:
|
|
context: ./k-tv-frontend
|
|
args:
|
|
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:4000/api/v1}
|
|
NEXT_PUBLIC_PLAYOUT_URL: ${NEXT_PUBLIC_PLAYOUT_URL:-http://localhost:9090}
|
|
image: registry.gabrielkaszewski.dev/k-tv-frontend:latest
|
|
ports:
|
|
- "${FRONTEND_PORT:-3001}:3001"
|
|
environment:
|
|
API_URL: http://presentation:3000/api/v1
|
|
depends_on:
|
|
presentation:
|
|
condition: service_healthy
|
|
restart: unless-stopped
|
|
|
|
volumes:
|
|
backend_data:
|