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: