Files
podx/docker-compose.yml

151 lines
4.8 KiB
YAML

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
JOB_TIMEOUT: ${JOB_TIMEOUT:-14400}
JOB_TTL: ${JOB_TTL:-86400}
RESULT_TTL: ${RESULT_TTL:-86400}
FAILURE_TTL: ${FAILURE_TTL:-86400}
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"}}}
- YTDL_OPTIONS={"extractor_args":{"youtube":{"player_client":"android"}},"extract_flat":"in_playlist","concurrent_fragment_downloads":1}
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
JOB_TIMEOUT: ${JOB_TIMEOUT:-14400}
JOB_TTL: ${JOB_TTL:-86400}
RESULT_TTL: ${RESULT_TTL:-86400}
FAILURE_TTL: ${FAILURE_TTL:-86400}
volumes:
- ${LIBRARY_HOST_DIR:-./library}:/library
- ${TRANSCRIPTS_HOST_DIR:-./transcripts}:/transcripts
depends_on: [redis]
healthcheck:
test: ["CMD-SHELL", "exit 0"]
restart: unless-stopped
podx-rss:
build: ./app
container_name: podx-rss
command: ["python", "rss_ingest.py"]
env_file: [.env]
environment:
MEILI_URL: http://meili:7700
REDIS_URL: redis://redis:6379/0
LIBRARY_ROOT: /library
TRANSCRIPT_ROOT: /transcripts
FEEDS_FILE: /library/feeds.txt
RSS_STATE_FILE: /library/.rss_state.json
RSS_SCAN_MINUTES: ${RSS_SCAN_MINUTES:-120}
RSS_CONNECT_TIMEOUT: ${RSS_CONNECT_TIMEOUT:-15}
RSS_READ_TIMEOUT: ${RSS_READ_TIMEOUT:-60}
AUDIO_MAX_MB: ${AUDIO_MAX_MB:-4096}
USER_AGENT: ${USER_AGENT:-podx-rss/1.0 (+local-archive)}
RSS_ONCE: ${RSS_ONCE:-0}
volumes:
- ${LIBRARY_HOST_DIR:-./library}:/library
- ${TRANSCRIPTS_HOST_DIR:-./transcripts}:/transcripts
depends_on: [redis]
healthcheck:
test: ["CMD-SHELL", "python - <<'PY'\nimport os,sys; p=os.getenv('FEEDS_FILE',''); sys.exit(0 if (p and os.path.exists(p)) else 1)\nPY"]
interval: 60s
timeout: 5s
retries: 3
restart: unless-stopped