- Сверху: «Установлены последние версии» (когда проверено) или «Доступно обновление X — Установить обновление» (всё сразу), или «Проверить не удалось»; кнопка «Проверить сейчас».
- При открытии раздела bj проверяет обновления сам, если последней проверке больше 10 минут (и не чаще раза в 10 минут из браузера — без зацикливания, если источник не настроен); check отвечает JSON для экрана.
- «Компоненты и версии» (обновить один компонент) и «Расширенные настройки» (обновление из файла, источник и канал, ключ, автопроверка) — под раскрытием.
- «Службы» с перезапуском перенесены в «Диагностику»; подсказка в письме о службе — туда же.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
<pclass="muted">Ядро и модули работают отдельными службами: если служба модуля не запущена, его раздел в bj отвечает ошибкой связи. Здесь видно состояние и можно перезапустить службу, не заходя на сервер.</p>
<tdstyle="white-space:nowrap"><formmethod="post"action="/admin/setup/units/restart"style="margin:0"onsubmit="return confirm('{{if .Core}}Перезапустить ядро? Страница настроек на несколько секунд станет недоступна.{{else}}Перезапустить службу {{.Unit}}?{{end}}');">
<pclass="muted">Фоновые компоненты под самоконтролем: при сбое перезапускаются автоматически, при зависании — перезапуск всего сервиса и запись в «Новости». Ниже — живой статус.</p>
<pclass="muted">Фоновые компоненты под самоконтролем: при сбое перезапускаются автоматически, при зависании — перезапуск всего сервиса и запись в «Новости». Ниже — живой статус.</p>
<divclass="card"id="upd-status"data-last="{{if not .Settings.Update.LastCheck.IsZero}}{{.Settings.Update.LastCheck.Unix}}{{else}}0{{end}}"data-has="{{if .UpdatesAvailable}}1{{else}}0{{end}}">
<pclass="muted">Ядро и модули работают отдельными службами: если служба модуля не запущена, его раздел в bj отвечает ошибкой связи. Здесь видно состояние и можно перезапустить службу, не заходя на сервер.</p>
<divclass="stc stc-warn"><spanclass="stc-ic"></span><divclass="stc-b"><b>Доступно обновление{{with .Settings.Update.Available}} {{.}}{{end}}</b><small>{{if .Settings.Update.Notes}}{{.Settings.Update.Notes}}{{else}}новые версии компонентов — список ниже, в «Компоненты и версии»{{end}}</small></div>
<divclass="tw"style="margin-top:8px"><table>
<formmethod="post"action="/admin/setup/update/apply"style="margin:0"onsubmit="return confirm('Установить обновление? Службы, которые обновляются, перезапустятся на несколько секунд.');"><inputtype="hidden"name="section"value="sec-update"><buttontype="submit"class="btn">Установить обновление</button></form></div>
<divclass="stc stc-ok"><spanclass="stc-ic"></span><divclass="stc-b"><b>Установлены последние версии</b><smallid="upd-when">{{if .Settings.Update.LastCheck.IsZero}}ещё не проверялось{{else}}проверено {{msk .Settings.Update.LastCheck}}{{end}}{{if .Settings.Update.AutoCheck}} · bj проверяет сам каждые 6 часов{{end}}</small></div>
<tdstyle="white-space:nowrap"><formmethod="post"action="/admin/setup/units/restart"style="margin:0"onsubmit="return confirm('{{if .Core}}Перезапустить ядро? Страница настроек на несколько секунд станет недоступна.{{else}}Перезапустить службу {{.Unit}}?{{end}}');">
{{if and .License.Present (not .License.AllowsUpdates)}}<pclass="muted"style="margin-top:6px;font-size:12px;color:var(--warn)">В лицензии нет модуля «Обновления».</p>{{end}}
<pclass="muted">Каждый компонент обновляется отдельно: своя версия в релизе, перезапускается только его служба. Файлы ставит root-установщик после повторной проверки подписи и контрольных сумм. Модули, которых нет на этом сервере, обновлением не ставятся — кроме выделенных из ядра (НПР / УДС, экспорт QUIK): если модуль входит в лицензию, он ставится вместе с обновлением, иначе его раздел перестал бы работать.</p>
<summary><spanclass="sum-h">Компоненты и версии</span><spanclass="muted">что установлено на этом сервере и что есть в выпуске; можно обновить один компонент</span></summary>
{{if .UpdatesAvailable}}<formmethod="post"action="/admin/setup/update/apply"style="margin:0"onsubmit="return confirm('Обновить все компоненты, для которых есть новая версия?');"><inputtype="hidden"name="section"value="sec-update"><buttontype="submit"class="btn btn-ok">Обновить всё</button></form>{{end}}
<summary><spanclass="sum-h">Расширенные настройки</span><spanclass="muted">источник и канал обновлений, обновление из файла для сервера без выхода в интернет</span></summary>
<h3class="adv-h">Обновление из файла</h3>
<pclass="muted"style="margin:0 0 8px;font-size:12.5px"><b>Закрытый контур.</b> Если у сервера нет выхода к серверу обновлений, скачайте пакет обновления на портале клиента (lic.zetit.ru → Установка → «Пакет обновления») и загрузите его кнопкой «Обновить из файла». Система сама распознаёт, что внутри — ядро, модули или всё вместе — и ставит в правильном порядке. Модуль, которому нужно более новое ядро, чем установлено, будет пропущен с подсказкой обновить сначала ядро.</p>
<divstyle="display:flex;gap:10px;flex-wrap:wrap">
<formmethod="post"action="/admin/setup/update/upload"enctype="multipart/form-data"style="margin:0;display:flex;gap:8px;align-items:center;flex-wrap:wrap"onsubmit="return this.bundle.files.length>0 && confirm('Установить обновление из файла? Подпись пакета будет проверена; поставятся компоненты новее текущих — сначала ядро, затем модули. Службы перезапустятся.');">
<formmethod="post"action="/admin/setup/update/upload"enctype="multipart/form-data"style="margin:0;display:flex;gap:8px;align-items:center;flex-wrap:wrap"onsubmit="return this.bundle.files.length>0 && confirm('Установить обновление из файла? Подпись пакета будет проверена; поставятся компоненты новее текущих — сначала ядро, затем модули. Службы перезапустятся.');">
<buttontype="submit"class="btn btn-secondary"title="Пакет обновления с портала клиента — для сервера без выхода к серверу обновлений">Обновить из файла</button>
<buttontype="submit"class="btn btn-secondary"title="Пакет обновления с портала клиента — для сервера без выхода к серверу обновлений">Обновить из файла</button>
</form>
</form>
</div>
</div>
{{if .Settings.Update.Notes}}<pclass="muted"style="margin-top:10px">Что нового в релизе {{.Settings.Update.Available}}: {{.Settings.Update.Notes}}</p>{{end}}
<h3class="adv-h">Источник обновлений</h3>
<pclass="muted"style="margin-top:8px;font-size:12px"><b>Закрытый контур.</b> Если у сервера нет выхода к серверу обновлений, скачайте пакет обновления на портале клиента (lic.zetit.ru → Установка → «Пакет обновления») и загрузите его кнопкой «Обновить из файла». Система сама распознаёт, что внутри — ядро, модули или всё вместе — и ставит в правильном порядке. Модуль, которому нужно более новое ядро, чем установлено, будет пропущен с подсказкой обновить сначала ядро.</p>
{{if and .License.Present (not .License.AllowsUpdates)}}<pclass="muted"style="margin-top:6px;font-size:12px;color:var(--warn)">В лицензии нет модуля «Обновления».</p>{{end}}
<pclass="muted">Обновления раздаёт сервер лицензий по лицензии этой установки: модуль скачивается, только если он входит в лицензию. Каждый релиз проверяется по подписи Ed25519 и контрольным суммам, без действительной подписи установка не выполняется.</p>
<inputtype="text"name="base_url"value="{{.Settings.Update.BaseURL}}"placeholder="https://lic.zetit.ru/updates (по умолчанию)">
<inputtype="text"name="base_url"value="{{.Settings.Update.BaseURL}}"placeholder="https://lic.zetit.ru/updates (по умолчанию)">
@@ -965,6 +994,7 @@
<labelstyle="display:flex;align-items:center;gap:8px;cursor:pointer"><inputtype="checkbox"name="auto_check"{{if.Settings.Update.AutoCheck}}checked{{end}}style="width:auto"> Проверять автоматически (раз в 6 часов)</label>
<labelstyle="display:flex;align-items:center;gap:8px;cursor:pointer"><inputtype="checkbox"name="auto_check"{{if.Settings.Update.AutoCheck}}checked{{end}}style="width:auto"> Проверять автоматически (раз в 6 часов)</label>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.