services: podx-web: build: ./app container_name: podx-web env_file: [.env] environment: MEILI_URL: http://meili:7700 REDIS_URL: redis://redis:6379/0 LIBRARY_ROOT: /library TRANSCRIPT_ROOT: /transcripts TMP_ROOT: /tmpdl WHISPER_MODEL: large-v3 WHISPER_PRECISION: int8 volumes: - ${LIBRARY_HOST_DIR:-./library}:/library - ${TRANSCRIPTS_HOST_DIR:-./transcripts}:/transcripts - ${TMP_HOST_DIR:-./tmp}:/tmpdl - ${MODELS_HOST_DIR:-./models}:/root/.cache/huggingface ports: ["8088:8080"] depends_on: [podx-worker, meili, redis] restart: unless-stopped extra_hosts: - host.docker.internal:host-gateway healthcheck: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:8080/health || exit 1"] interval: 30s timeout: 5s retries: 3 podx-worker: build: ./app container_name: podx-worker command: ["rq", "worker", "-u", "redis://redis:6379/0", "default"] env_file: [.env] environment: MEILI_URL: http://meili:7700 REDIS_URL: redis://redis:6379/0 LIBRARY_ROOT: /library TRANSCRIPT_ROOT: /transcripts TMP_ROOT: /tmpdl WHISPER_MODEL: large-v3 WHISPER_PRECISION: int8 PYTHONPATH: /app volumes: - ${LIBRARY_HOST_DIR:-./library}:/library - ${TRANSCRIPTS_HOST_DIR:-./transcripts}:/transcripts - ${TMP_HOST_DIR:-./tmp}:/tmpdl - ${MODELS_HOST_DIR:-./models}:/root/.cache/huggingface depends_on: [meili, redis] restart: unless-stopped healthcheck: test: ["CMD-SHELL", "exit 0"] extra_hosts: - host.docker.internal:host-gateway meili: image: getmeili/meilisearch:v1.8 container_name: meili env_file: [.env] environment: MEILI_NO_ANALYTICS: "true" ports: ["7700:7700"] volumes: - ${MEILI_DATA_HOST_DIR:-./data/meili}:/meili_data restart: unless-stopped redis: image: redis:7-alpine container_name: redis volumes: - ${REDIS_DATA_HOST_DIR:-./data/redis}:/data restart: unless-stopped metube: image: alexta69/metube:latest container_name: metube ports: - "8081:8081" environment: - PUID=1000 - PGID=1000 - TZ=Europe/Prague - DOWNLOAD_DIR=/downloads - OUTPUT_TEMPLATE=%(uploader)s/%(upload_date)s - %(title)s.%(ext)s # Optional: pass a cookies file to bypass consent/age walls # - COOKIE_FILE=/config/cookies.txt # Optional: yt-dlp options (JSON). Example enables Android client fallback # - YTDL_OPTIONS={"extractor_args":{"youtube":{"player_client":"android"}}} volumes: - ${LIBRARY_HOST_DIR:-./library}:/downloads # Optional cookies file on host → /config/cookies.txt inside container # - /mnt/secure/cookies.txt:/config/cookies.txt:ro restart: unless-stopped podx-scanner: build: ./app container_name: podx-scanner command: ["python", "scanner.py"] env_file: [.env] environment: MEILI_URL: http://meili:7700 REDIS_URL: redis://redis:6379/0 LIBRARY_ROOT: /library TRANSCRIPT_ROOT: /transcripts SCAN_INTERVAL: 30 volumes: - ${LIBRARY_HOST_DIR:-./library}:/library - ${TRANSCRIPTS_HOST_DIR:-./transcripts}:/transcripts depends_on: [redis] healthcheck: test: ["CMD-SHELL", "exit 0"] restart: unless-stopped