Страница «Сервер» → вкладка «Обновления». Позволяет узнать, какая версия установлена, проверить репозиторий на новую и поставить её одной кнопкой — без похода по SSH и без ручной сборки.
- Источник обновлений — адрес репозитория, ветка и токен доступа.
Меняется прямо здесь, без правки
.envи пересоздания контейнеров. - Версия сервера — коммит, с которого собраны работающие контейнеры, его дата и заголовок, репозиторий и ветка, каталог установки.
- Проверка обновлений — сравнение установленного коммита с веткой репозитория. Если версия новее, показывается список изменений и статистика по файлам.
- Журнал установки — ход работ и результат. Журнал хранится на сервере, поэтому его можно дочитать после перезагрузки страницы.
Проверка выполняется автоматически раз в сутки при открытии вкладки, так что о новой версии видно без отдельного нажатия.
Проект публикуется на двух площадках (GitHub и GitVerse), и установка может переехать на любую из них или на свой Git-сервер. В карточке «Источник обновлений» есть кнопки-подсказки с адресами этих двух площадок и поле для любого другого адреса. После сохранения проверка обновлений сразу идёт по новому адресу.
Адрес сохраняется в базе сервера и имеет приоритет над значением
UPDATE_REPO_URL из .env (то, в свою очередь, — над адресом origin
в каталоге установки). Пустое поле означает «оставить адрес, записанный
при установке».
Если репозиторий закрытый, в поле «Токен доступа» вводится токен. Он нужен только для чтения: достаточно токена с правом на чтение содержимого репозитория.
Как это устроено:
- токен хранится в базе сервера рядом с прочими секретами (токены Telegram и MAX лежат там же);
- обратно в браузер он не отдаётся никогда — в ответах вместо него признак «задан». Поэтому пустое поле означает «не менять токен», а чтобы убрать его, есть отдельная кнопка «Убрать токен»;
- токен передаётся git через переменные окружения, а не аргументы
командной строки (аргументы видны в списке процессов), и не попадает
в
.git/config— адрес репозитория в каталоге установки остаётся чистым; - поле принимает и просто токен, и пару
логин:токен— площадки отличаются форматом авторизации.
Если проверка не проходит, в ошибке прямо сказано, чего не хватает: без токена — «возможно, репозиторий приватный: укажите токен доступа», с токеном — «проверьте токен доступа и его права на этот репозиторий».
Обновление выполняет служба на хосте nvr-agent — у неё есть права root,
доступ к docker и к каталогу установки. Сам видеосервер работает в
контейнере без привилегий и пересобрать себя не может.
Порядок при нажатии «Установить обновление»:
- агент забирает изменения из репозитория (
git fetch); - сохраняет прежний коммит для отката и переключается на ветку
(
git reset --hard origin/main); - собирает образы (
docker compose build); - перезапускает контейнеры (
docker compose up -d); - обновляет саму службу агента — в новых версиях у неё появляются новые команды;
- пишет ход и результат в
/var/lib/nvr-agent/update.log.
Во время шагов 3–4 просмотр камер и запись прерываются: это нормально, но
оператор видит предупреждение перед подтверждением. .env, база данных и
записи не затрагиваются — они не в репозитории.
Если новая версия не поднялась, кнопка «Вернуть прежнюю версию» вернёт
коммит, с которого обновлялись (он сохранён в
/var/lib/nvr-agent/previous-sha), и заново соберёт образы. Данные и
настройки сохраняются.
Переменные в .env (их записывает install.sh, менять можно вручную):
| Переменная | Назначение |
|---|---|
NVR_INSTALL_DIR |
каталог установки на хосте (по умолчанию /opt/nvr) |
UPDATE_REPO_URL |
адрес репозитория обновлений (начальное значение) |
UPDATE_BRANCH |
ветка обновлений (обычно main) |
Адрес репозитория не вшит в код намеренно: одна и та же сборка ставится с
GitHub, с GitVerse и с локального зеркала, и переезд между площадками не
должен требовать правки кода. Адрес, ветка и токен из интерфейса
перекрывают значения из .env — они хранятся в настройках сервера.
- Установка должна быть сделана из репозитория (в каталоге есть
.git). Если сервер ставился распакованным архивом, вкладка скажет об этом прямо: такую установку нужно один раз перевести на репозиторий — склонировать код в каталог установки, перенести туда.env(он не в репозитории) и собрать образы. После этого обновления идут из интерфейса. - Каталог установки должен быть вне домашних каталогов: служба агента
работает с
ProtectHome=yesи домашние каталоги не видит. Штатный вариант —/opt/nvr. - Перед установкой проверяется место на диске (нужно не меньше 2 ГБ): образы собираются заново. Если места мало, кнопка установки блокируется.
- Незакоммиченные правки в каталоге установки будут перезаписаны обновлением — вкладка предупреждает об этом заранее.
- Агенту нужен доступ в интернет (или к зеркалу репозитория).
| Что видно | Причина и что делать |
|---|---|
| «агент управления хостом недоступен» | служба не установлена или остановлена: sudo bash host-agent/install.sh, затем systemctl status nvr-agent |
| «каталог установки не найден» | неверный NVR_INSTALL_DIR, либо каталог в /home и закрыт изоляцией службы |
| «не является git-репозиторием» | установка сделана из архива; перейдите на установку из репозитория |
| «неизвестная команда» | у службы агента старая версия: sudo bash host-agent/install.sh (он перезапускает службу) |
| «detected dubious ownership» | git под root не доверяет каталогу: sudo git config --global --add safe.directory <каталог> |
| «не удалось обратиться к репозиторию» | нет доступа в интернет или недоступно зеркало; проверьте адрес в источнике обновлений |
| «возможно, репозиторий приватный» | укажите токен доступа в источнике обновлений |
| «проверьте токен доступа и его права» | токен неверный или без права чтения репозитория |
| «docker compose не найден» | compose не установлен на хосте: apt-get install docker-compose-plugin |
Проверить состояние и журнал без интерфейса:
sudo systemctl status nvr-agent
sudo tail -n 50 /var/lib/nvr-agent/update.log