Skip to content

Latest commit

 

History

History
137 lines (108 loc) · 10.5 KB

updates.md

File metadata and controls

137 lines (108 loc) · 10.5 KB

Обновление сервера из интерфейса

Страница «Сервер» → вкладка «Обновления». Позволяет узнать, какая версия установлена, проверить репозиторий на новую и поставить её одной кнопкой — без похода по SSH и без ручной сборки.

Что показывает вкладка

  • Источник обновлений — адрес репозитория, ветка и токен доступа. Меняется прямо здесь, без правки .env и пересоздания контейнеров.
  • Версия сервера — коммит, с которого собраны работающие контейнеры, его дата и заголовок, репозиторий и ветка, каталог установки.
  • Проверка обновлений — сравнение установленного коммита с веткой репозитория. Если версия новее, показывается список изменений и статистика по файлам.
  • Журнал установки — ход работ и результат. Журнал хранится на сервере, поэтому его можно дочитать после перезагрузки страницы.

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

Смена репозитория

Проект публикуется на двух площадках (GitHub и GitVerse), и установка может переехать на любую из них или на свой Git-сервер. В карточке «Источник обновлений» есть кнопки-подсказки с адресами этих двух площадок и поле для любого другого адреса. После сохранения проверка обновлений сразу идёт по новому адресу.

Адрес сохраняется в базе сервера и имеет приоритет над значением UPDATE_REPO_URL из .env (то, в свою очередь, — над адресом origin в каталоге установки). Пустое поле означает «оставить адрес, записанный при установке».

Приватный репозиторий (токен)

Если репозиторий закрытый, в поле «Токен доступа» вводится токен. Он нужен только для чтения: достаточно токена с правом на чтение содержимого репозитория.

Как это устроено:

  • токен хранится в базе сервера рядом с прочими секретами (токены Telegram и MAX лежат там же);
  • обратно в браузер он не отдаётся никогда — в ответах вместо него признак «задан». Поэтому пустое поле означает «не менять токен», а чтобы убрать его, есть отдельная кнопка «Убрать токен»;
  • токен передаётся git через переменные окружения, а не аргументы командной строки (аргументы видны в списке процессов), и не попадает в .git/config — адрес репозитория в каталоге установки остаётся чистым;
  • поле принимает и просто токен, и пару логин:токен — площадки отличаются форматом авторизации.

Если проверка не проходит, в ошибке прямо сказано, чего не хватает: без токена — «возможно, репозиторий приватный: укажите токен доступа», с токеном — «проверьте токен доступа и его права на этот репозиторий».

Как установка устроена

Обновление выполняет служба на хосте nvr-agent — у неё есть права root, доступ к docker и к каталогу установки. Сам видеосервер работает в контейнере без привилегий и пересобрать себя не может.

Порядок при нажатии «Установить обновление»:

  1. агент забирает изменения из репозитория (git fetch);
  2. сохраняет прежний коммит для отката и переключается на ветку (git reset --hard origin/main);
  3. собирает образы (docker compose build);
  4. перезапускает контейнеры (docker compose up -d);
  5. обновляет саму службу агента — в новых версиях у неё появляются новые команды;
  6. пишет ход и результат в /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