services: app: build: context: . dockerfile: Dockerfile # Postgres — внешний (не в compose), см. ConnectionStrings__Default в .env. env_file: - .env environment: ASPNETCORE_ENVIRONMENT: Production ASPNETCORE_HTTP_PORTS: '8085' healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:8085/health'] interval: 15s timeout: 5s start_period: 20s retries: 5 ports: - '8085:8085' # Медиахранилище: диск sdb смонтирован на хосте в /srv/telewave/media (см. # docs/server-storage-setup.md), пробрасывается как /media внутрь контейнера. volumes: - /srv/telewave/media:/media # Явный лимит памяти: RAM в VM динамическая, а .NET настраивает GC по видимой при старте — # детерминированный cgroup-лимит + предсказуемый выбор OOM-killer при транскоде. mem_limit: 3g restart: unless-stopped logging: driver: json-file options: max-size: '10m' max-file: '3' # Торрент-клиент: качает в /downloads → это /srv/telewave/media/downloads на хосте, который app # видит как /media/downloads. TeleWave не общается с клиентом по API — вы добавляете торренты в его # WebUI, а готовые файлы импортируете в разделе «Загрузки» админки (копированием, сидирование живёт). # PUID/PGID=0 — файлы root-владельца, как и у app, чтобы импорт мог их прочитать. qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest # host-сеть: bridge Docker ломает DHT/UDP торрент-клиента (NAT исходящего UDP + DNAT входящего # на том же порту рвут обратные DHT-пакеты → «Узлы DHT: 0»). В host-режиме клиент слушает # порты 8090 (WebUI) и 6881 (torrent) прямо на хосте — порты не конфликтуют с app (8085). network_mode: host environment: PUID: '0' PGID: '0' TZ: Etc/UTC WEBUI_PORT: '8090' # WebUI (пароль первого входа — в логах: docker compose logs qbittorrent) volumes: - qbittorrent-config:/config - /srv/telewave/media/downloads:/downloads restart: unless-stopped logging: driver: json-file options: max-size: '10m' max-file: '3' volumes: qbittorrent-config: