HTTPS: http:// перебрасывается на https://; имя сервера — с проверкой DNS; скрипты DEPO при обновлении

Порт HTTPS принимает и http://: 308 на https:// того же имени и порта
(было «Client sent an HTTP request to an HTTPS server»).

Доменное имя сервера сохраняется, только если оно есть в DNS и указывает
на этот сервер; иначе — что добавить/исправить (запись A → IP сервера).
Сообщение об успехе — с адресом https://имя:порт/ и честно про
самоподписанный сертификат.

Обновление bj с новыми процедурами DEPO: отпечаток установленного набора
(depo_procs_applied) не совпадает со встроенным — на главной и в
настройках плашка «требуются повышенные права на базу данных» с вводом
логина/пароля администратора SQL (не сохраняются) и «Применить скрипты».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 13:22:34 +03:00
parent b652baba63
commit 1952f020a1
10 changed files with 222 additions and 18 deletions
+29 -2
View File
@@ -398,6 +398,32 @@ func registerHostname(mux *http.ServeMux, rc *RuntimeConfig) {
names = append(names, f)
}
names = uniqStrings(names)
// имя должно быть в DNS и указывать на этот сервер — иначе браузер всё равно не откроет bj по нему
mine := map[string]bool{}
for _, ip := range serverIPs() {
mine[ip] = true
}
var resolved []string
for _, n := range names {
ctx, cancel := context.WithTimeout(r.Context(), 4*time.Second)
addrs, err := net.DefaultResolver.LookupHost(ctx, n)
cancel()
if err != nil || len(addrs) == 0 {
setupFlash(w, r, "Имя «"+n+"» не найдено в DNS. Попросите администратора сети добавить на DNS-сервере (контроллере домена) запись A: "+
n+" → "+strings.Join(serverIPs(), " или ")+" — и нажмите «Сохранить» ещё раз.")
return
}
ok := false
for _, a := range addrs {
ok = ok || mine[a]
}
if !ok && len(mine) > 0 {
setupFlash(w, r, "Имя «"+n+"» в DNS указывает на "+strings.Join(addrs, ", ")+", а у сервера bj адрес "+strings.Join(serverIPs(), ", ")+
". Исправьте запись A на DNS-сервере и нажмите «Сохранить» ещё раз.")
return
}
resolved = append(resolved, n+" → "+strings.Join(addrs, ", "))
}
h := rc.Snapshot().HTTPS
h.Hostnames = names
if err := rc.UpdateHTTPS(h); err != nil {
@@ -416,7 +442,8 @@ func registerHostname(mux *http.ServeMux, rc *RuntimeConfig) {
setupFlash(w, r, "Доменные имена убраны. Сертификат перевыпущен на имя хоста и IP.")
return
}
setupFlash(w, r, "Готово: "+strings.Join(names, ", ")+" вписаны в сертификат. Теперь на вашем DNS "+
"(контроллере домена) направьте эти имена на сервер bj — и интерфейс откроется по ним без предупреждения браузера.")
setupFlash(w, r, "Готово: "+strings.Join(resolved, "; ")+" — имя есть в DNS и вписано в сертификат. Адрес bj: https://"+names[0]+":"+
strconv.Itoa(h.port())+"/ (http:// перебросит на https:// сам). Сертификат самоподписанный — браузер один раз попросит подтвердить исключение; "+
"без предупреждения — после загрузки сертификата организации («Сертификат организации» ниже).")
})
}