# Подготовка и выпуск моста камер

Первый выпуск: **1.1.0**, API **control-dev**. Комплект для Linux Debian 12+/Ubuntu 22.04+ с systemd,
64-разрядные amd64 (мини-ПК) и arm64 (например, Raspberry Pi с 64-разрядной ОС).
Это установка ПО на готовый мини-компьютер, не прошивка SD-карты и не приложение для Windows/Android.

Пользователю камеры выдаётся уже подготовленный мост. Команды ниже выполняет тот, кто готовит устройство.

## Установка

1. Подключите мост Ethernet-кабелем к роутеру объекта. Должны работать интернет и DNS. Камеры — в той же сети.
2. На мосту скачайте установщик с сайта Контроля и изучите его:

   ```sh
   curl --proto '=https' --tlsv1.2 --fail --output install-control-bridge.sh https://control-dev.doctorstroy.ru/releases/bridge/install.sh
   less install-control-bridge.sh
   sudo bash install-control-bridge.sh
   ```

3. Дождитесь «Готово». Установщик проверяет SHA-256 supervisor, подпись и содержимое комплекта, ставит ffmpeg,
   сертификаты ОС и службы. Закрытого ключа выпуска на мосту нет. Порты роутера не открываются.
4. В приложении или на сайте откройте объект → «Камеры» → «Камера с мостом», выберите объект и получите код.
5. В той же локальной сети откройте в браузере `http://IP-моста` (IP показан установщиком) и введите код.
   Страница работает только до привязки; после привязки закрывается. Готовое имя `ds-most.local` не гарантируется:
   используйте показанный IP либо настоящее имя устройства. Никому не передавайте код и фотографии наклеек камер.
6. Вернитесь в Контроль, дождитесь «В сети», выполните поиск или ручной ввод по инструкции вашей модели камеры.
   Логин/пароль камеры — отдельными полями, не внутри RTSP-ссылки. Проверьте эфир и свежий снимок.

Эфир и снимки требуют совместимого H.264-потока. Архив 7/14/30 дней и события движения проверяются отдельно
по характеристикам конкретной камеры. Сим-карта находится в роутере, если выбран обычный ONVIF/RTSP-комплект.
EZVIZ в этот выпуск не активируется.

## Проверка и обновление

```sh
/opt/ds-bridge/current/bridge-agent --version
systemctl status ds-bridge-agent ds-go2rtc ds-bridge-update.timer
curl --fail http://127.0.0.1:1985/healthz
sudo systemctl start ds-bridge-update.service
```

Локальная проба привязанного моста подтверждает также связь с сервером; видео на физической камере проверяйте
через объект. При разрыве управляющего канала или отсутствии трёх подтверждений пульса исходящий эфир останавливается; локальные источники и архив не удаляются. Не публикуйте `cameras.json`, `bridge.key`, логи с персональными данными или содержимое состояния.

Проверка подписанного latest-манифеста — раз в час со случайной задержкой, архив повторно не скачивается,
если версия уже установлена. Раскатка задаётся подписанным процентом, последовательно 5 → 25 → 100.
При неудачном запуске новая версия возвращается на предыдущую; привязка и данные камер сохраняются.
После первого сбоя установки, когда предыдущей версии ещё нет, проверьте службы/сеть прежде чем продолжать.
Это обновление комплекта приложения, не обновление всей Linux-системы: обновления ОС остаются отдельными.

## Сборка владельцем выпуска

Ключ Ed25519 создаётся один раз на Mac выпуска, вне репозитория. Тестовые ключи в настоящем агенте запрещены.
Открытый ключ команд должен соответствовать именно серверу целевого окружения.

```sh
python3 apps/bridge-agent/packaging/build.py --version 1.1.0 \
  --origin https://control-dev.doctorstroy.ru \
  --server-public-key '<открытый ключ команд>' --release-public-key '<открытый ключ выпуска>' \
  --key '/защищённый/путь/ключ-выпуска.pem' --out .cache/releases/bridge --rollout-pct 5
```

Для самого первого выпуска, когда прежних установок нет, `--rollout-pct 100` задаётся явно. Закрытый ключ,
Mac-инструмент подписи и файлы окружения не публикуются. Публикуются только каталог версии, `install.sh`,
`latest-linux-amd64.json`, `latest-linux-arm64.json`, сведения о выпуске и этот текст. Сначала доставляются
неизменяемые файлы версии, потом атомарно заменяются latest/установщик. Подпись проверяется заново после скачивания.
Не переписывайте байты уже опубликованной версии: исправление — новым номером.
