118 lines
3.6 KiB
YAML
118 lines
3.6 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
|
|
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={"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
|