Мастер: авто-синхронизация времени (ВНИИФТРИ) и доменные имена сервера

Шаг «Время и сеть»:
- Кнопка «Синхронизировать»: bj сам пробует российские серверы точного
  времени ВНИИФТРИ (мини-SNTP зонд по UDP/123), и только если из сети они
  недоступны — просит указать свой сервер (контроллер домена/маршрутизатор).
  Статус времени берётся из timedatectl (timeSynced), а не из флага шага.
- Поле «Доменное имя сервера»: имена вписываются в самоподписанный сертификат
  (SAN), чтобы интерфейс открывался по имени без предупреждения браузера.
  Сертификат перевыпускается на лету; A-запись заводит админ сети на DNS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
This commit is contained in:
fontvielle
2026-10-16 15:15:09 +03:00
parent 33861d98d8
commit 2df7b0f54a
4 changed files with 202 additions and 3 deletions
@@ -560,9 +560,14 @@
<div class="wiz-row" style="margin-top:18px">
<span class="wiz-row-l">Точное время</span>
{{if .Done.Server}}<span style="color:var(--ok)">✓ синхронизируется</span>{{else}}<span style="color:var(--warn)">⚠ не синхронизируется</span>{{end}}
{{if timeSynced}}<span style="color:var(--ok)">✓ синхронизируется</span>{{else}}<span style="color:var(--warn)">⚠ не синхронизируется</span>
<form method="post" action="/admin/setup/time-auto" style="display:inline;margin-left:8px">
<input type="hidden" name="return_to" value="/admin/wizard?step=12">
<button type="submit" class="btn" style="padding:5px 12px;font-size:13px">Синхронизировать</button>
</form>{{end}}
</div>
<details style="margin-top:6px" {{if not .Done.Server}}open{{end}}><summary style="cursor:pointer;color:var(--accent);font-size:13px">{{if .Done.Server}}Свой сервер времени (обычно не нужно){{else}}Укажите сервер времени вашей сети — обычно контроллер домена или маршрутизатор{{end}}</summary>
<p class="muted" style="font-size:12.5px;margin:4px 0 0">bj сам подберёт сервер точного времени: сначала российские серверы ВНИИФТРИ, и только если из вашей сети они недоступны — попросит указать свой (контроллер домена или маршрутизатор сети).</p>
<details style="margin-top:6px" {{if not timeSynced}}open{{end}}><summary style="cursor:pointer;color:var(--accent);font-size:13px">Указать свой сервер времени вручную</summary>
<form method="post" action="/admin/setup/time" style="display:flex;gap:8px;flex-wrap:wrap;margin-top:8px">
<input type="hidden" name="return_to" value="/admin/wizard?step=12">
<input name="servers" value="{{.Settings.Time.Servers}}" placeholder="например, 10.0.0.1" aria-label="Сервер времени" style="min-width:260px">
@@ -580,6 +585,15 @@
<a href="https://{{serverIP}}:8443/admin/">https://{{serverIP}}:8443/</a>
</div>
<p class="muted" style="font-size:12.5px;margin:4px 0 0">Чтобы адрес не менялся, задайте постоянный: на консоли сервера — <code>sudo bj-network</code>.</p>
<form method="post" action="/admin/setup/hostname" style="margin-top:12px">
<input type="hidden" name="return_to" value="/admin/wizard?step=12">
<label for="wiz-hostnames" class="wiz-row-l" style="display:block;margin-bottom:4px">Доменное имя сервера</label>
<div style="display:flex;gap:8px;flex-wrap:wrap">
<input id="wiz-hostnames" name="hostnames" value="{{range $i, $h := .Settings.HTTPS.Hostnames}}{{if $i}} {{end}}{{$h}}{{end}}" placeholder="например, m2m.corp.example.ru" aria-label="Доменное имя сервера" style="min-width:300px">
<button type="submit" class="btn">Сохранить</button>
</div>
<p class="muted" style="font-size:12.5px;margin:4px 0 0">Если для сервера в вашей сети заведено доменное имя — впишите его, и bj вставит имя в сертификат: интерфейс будет открываться по нему без предупреждения браузера. Саму запись имени (A-запись → IP сервера) заводит администратор на вашем DNS / контроллере домена. Несколько имён — через пробел.</p>
</form>
{{if .AutoDone}}<p class="muted" style="font-size:12.5px;margin:16px 0 0;padding-top:12px;border-top:1px solid var(--border)">Уже сделано установщиком: {{range $i, $a := .AutoDone}}{{if $i}} · {{end}}✓ {{$a}}{{end}}{{if and .Done.Postgres (pgLocal .Settings.Postgres.DSN)}}. <a href="/admin/wizard?step=2">Базу bj можно держать и на своём сервере PostgreSQL →</a>{{end}}</p>{{end}}
<script>
(function(){ // пояс компьютера пользователя — предложить одной кнопкой (не менять молча: сервер может стоять в другом городе)