Первичная настройка: ключ спрашивается один раз, затем обновления, модули и «Время и сеть»; DEPO одним шагом

- Первая страница — только администратор (и восстановление из копии); ключ продукта — после создания
  администратора, на шаге «Лицензия». Консоль первой загрузки ключ больше не спрашивает (для образа с
  комплектом bj).
- «Подготовка модулей» начинает с проверки обновлений: есть — ставит (bj перезапускается, страница ждёт и
  продолжает), нет — дальше; выпуск, который уже ставили, по кругу не ставится. Затем модули лицензии и
  переход на «Время и сеть» (шаг 12) — часовой пояс клиент выбирает сам, шаг больше не проскакивает.
- Учёт DEPO одним шагом: bj сам находит базу Fancy DEPO на сервере (по таблицам OD_FACES/OD_RESTS), имя
  базы не спрашивается. Один скрипт создаёт логин bj, таблицы обмена и права; по выбору — задание
  обработки в SQL Agent или обработка на сервере bj. Выполнить сразу (логин администратора СУБД не
  сохраняется), скачать скрипт для администратора или подключиться готовым логином.
- Восстановление из копии — только на первой странице, в мастере его больше нет.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 11:42:10 +03:00
parent 96976df549
commit 8905ebc6fb
12 changed files with 763 additions and 239 deletions
+7 -5
View File
@@ -161,7 +161,8 @@ func registerFirstRun(mux *http.ServeMux) {
s := globalSessions.New(u.Login, ip, r.UserAgent())
http.SetCookie(w, &http.Cookie{Name: sessionCookie, Value: s.Token, Path: "/", HttpOnly: true, SameSite: http.SameSiteLaxMode, Secure: r.TLS != nil, MaxAge: int(sessionMaxLife.Seconds())})
log.Printf("auth: первичная настройка: создан администратор %s с %s", u.Login, ip)
// ключ продукта, если его не вводили на сервере: активируем сразу, чтобы модули и обновления заработали
// ключ продукта — следующим экраном (06.10.2026: ключ спрашивается один раз, после администратора);
// поле сохранено для старых страниц, открытых до обновления
if d.NeedKey && d.ProductKey != "" && globalRC != nil {
actx, acancel := context.WithTimeout(r.Context(), 30*time.Second)
err := LicenseActivate(actx, globalRC, d.ProductKey)
@@ -171,14 +172,15 @@ func registerFirstRun(mux *http.ServeMux) {
http.Redirect(w, r, "/admin/wizard?step=1&flash="+url.QueryEscape("Администратор создан. Ключ продукта не принят: "+err.Error()+". Проверьте его и введите ещё раз."), http.StatusSeeOther)
return
}
http.Redirect(w, r, "/admin/setup/prepare?next=/admin/wizard&flash="+url.QueryEscape("Администратор создан, ключ продукта принят."), http.StatusSeeOther)
http.Redirect(w, r, "/admin/setup/prepare?next="+url.QueryEscape("/admin/wizard?step=12")+"&flash="+url.QueryEscape("Администратор создан, ключ продукта принят."), http.StatusSeeOther)
return
}
if d.NeedKey {
http.Redirect(w, r, "/admin/wizard?step=1&flash="+url.QueryEscape("Администратор создан. Начнём с лицензии: без ключа продукта модули и обновления недоступны (шаг можно пропустить)."), http.StatusSeeOther)
http.Redirect(w, r, "/admin/wizard?step=1&flash="+url.QueryEscape("Администратор создан. Теперь ключ продукта — он есть в портале клиента lic.zetit.ru/portal: после него bj проверит обновления и поставит модули вашей лицензии."), http.StatusSeeOther)
return
}
http.Redirect(w, r, "/admin/wizard", http.StatusSeeOther)
// ключ уже есть (введён при установке) — сразу обновления и модули, потом «Время и сеть»
http.Redirect(w, r, "/admin/setup/prepare?next="+url.QueryEscape("/admin/wizard?step=12")+"&flash="+url.QueryEscape("Администратор создан."), http.StatusSeeOther)
return
}
w.WriteHeader(http.StatusUnauthorized)
@@ -213,7 +215,7 @@ code{font-size:12px}
<label>Имя</label><input type="text" name="name" value="{{.Name}}" autocomplete="name">
<label>Пароль, не короче 10 символов</label><input type="password" name="password" minlength="10" autocomplete="new-password" required>
<label>Повтор пароля</label><input type="password" name="password2" minlength="10" autocomplete="new-password" required>
{{if .NeedKey}}<label>Ключ продукта (BJ-XXXX-XXXX-XXXX) — если не вводили на сервере; можно позже в «Настройка → Лицензия»</label><input type="text" name="product_key" value="{{.ProductKey}}" placeholder="BJ-XXXX-XXXX-XXXX" autocomplete="off" style="text-transform:uppercase">{{end}}
{{/* ключ продукта здесь не спрашивается: его спрашивает следующий экран — один раз, после создания администратора */}}
<button type="submit">Создать администратора</button>
{{if .Error}}<div class="err">{{.Error}}</div>{{end}}
<div class="hint">Код потерян или истёк: на сервере выполните <code>sudo bj-installer first-run-code</code>.</div>