services: nvr-backend: build: context: . dockerfile: backend/Dockerfile container_name: nvr-backend restart: unless-stopped # HTTPS обязателен: SharedArrayBuffer (для WASM-декодера H.265) работает # только в защищённом контексте (https/localhost). command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8090", "--ssl-keyfile", "/app/certs/key.pem", "--ssl-certfile", "/app/certs/cert.pem"] ports: - "443:8090" # десктоп-дашборд на https://<сервер> - "8443:8090" # мобильный dashboard https://<сервер>:8443 (тот же бэкенд, mobile.html по Host) volumes: - ./certs:/app/certs # self-signed TLS-сертификат (rw: entrypoint генерирует при отсутствии) - ./VERSION:/app/VERSION:ro # номер версии (показывается в UI) - ./cameras.yaml:/app/cameras.yaml # rw: редактирование камер из UI - ./go2rtc.yaml:/app/go2rtc.yaml # rw: бэкенд регенерирует live-потоки - ./.env.json:/app/.env.json # логин/пароль + ui-настройки (JSON; имя .env.json, чтобы не путать с .env docker compose) - ./backend/app:/app/app # код бэкенда (правка без пересборки образа) - ./frontend:/app/frontend # фронтенд (правка без пересборки) - ./data:/data # SQLite-индекс архива # Запись. ./records — дефолтное локальное хранилище (id=local). - ./records:/records # Общий корень доп. хранилищ (вкладка «Хранилища»): локальные подпапки # /storages/ и точки монтирования NAS. NAS монтируется на ХОСТЕ в # ./storages/; после `mount` на хосте выполните `docker compose up -d`, # чтобы том стал виден здесь (или добавьте :rshared для live-подхвата). - ./storages:/storages environment: TZ: Europe/Moscow NVR_CONFIG: /app/cameras.yaml NVR_SETTINGS: /app/.env.json GO2RTC_CONFIG: /app/go2rtc.yaml NVR_DB: /data/nvr.db go2rtc: image: alexxit/go2rtc:latest container_name: nvr-go2rtc restart: unless-stopped network_mode: host # WebRTC проще всего в host-сети (порт 8555 udp/tcp) volumes: - ./go2rtc.yaml:/config/go2rtc.yaml:ro environment: TZ: Asia/Tashkent