diff --git a/homelab/runner/docker-compose.yml b/homelab/runner/docker-compose.yml index 2eb2991..b02c167 100644 --- a/homelab/runner/docker-compose.yml +++ b/homelab/runner/docker-compose.yml @@ -12,6 +12,7 @@ # - VALKEY_ADDR → unset (not exposed publicly) # - RUNNER_SKIP_INITIAL_CATALOGUE_REFRESH=true # - Redis service for Asynq task queue (local to homelab, exposed to prod via Caddy TCP proxy) +# - LibreTranslate service for machine translation (internal network only) services: redis: @@ -29,6 +30,26 @@ services: timeout: 5s retries: 5 + libretranslate: + image: libretranslate/libretranslate:latest + restart: unless-stopped + environment: + LT_API_KEYS: "true" + LT_API_KEYS_DB_PATH: "/app/db/api_keys.db" + # Limit to source→target pairs the runner actually uses + LT_LOAD_ONLY: "en,ru,id,pt,fr" + LT_DISABLE_WEB_UI: "true" + LT_UPDATE_MODELS: "false" + volumes: + - libretranslate_models:/home/libretranslate/.local/share/argos-translate + - libretranslate_db:/app/db + healthcheck: + test: ["CMD-SHELL", "curl -sf http://localhost:5000/languages || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 120s + runner: image: kalekber/libnovel-runner:latest restart: unless-stopped @@ -36,6 +57,8 @@ services: depends_on: redis: condition: service_healthy + libretranslate: + condition: service_healthy environment: # ── PocketBase ────────────────────────────────────────────────────────── POCKETBASE_URL: "https://pb.libnovel.cc" @@ -64,6 +87,10 @@ services: # ── Pocket TTS ────────────────────────────────────────────────────────── POCKET_TTS_URL: "${POCKET_TTS_URL}" + # ── LibreTranslate (internal Docker network) ──────────────────────────── + LIBRETRANSLATE_URL: "http://libretranslate:5000" + LIBRETRANSLATE_API_KEY: "${LIBRETRANSLATE_API_KEY}" + # ── Asynq / Redis (local service) ─────────────────────────────────────── # The runner connects to the local Redis sidecar. REDIS_ADDR: "redis:6379" @@ -74,6 +101,7 @@ services: RUNNER_POLL_INTERVAL: "${RUNNER_POLL_INTERVAL}" RUNNER_MAX_CONCURRENT_SCRAPE: "${RUNNER_MAX_CONCURRENT_SCRAPE}" RUNNER_MAX_CONCURRENT_AUDIO: "${RUNNER_MAX_CONCURRENT_AUDIO}" + RUNNER_MAX_CONCURRENT_TRANSLATION: "${RUNNER_MAX_CONCURRENT_TRANSLATION}" RUNNER_TIMEOUT: "${RUNNER_TIMEOUT}" RUNNER_METRICS_ADDR: "${RUNNER_METRICS_ADDR}" RUNNER_SKIP_INITIAL_CATALOGUE_REFRESH: "true" @@ -90,3 +118,5 @@ services: volumes: redis_data: + libretranslate_models: + libretranslate_db: