Первичная настройка, часть 4: HTTPS веб-интерфейса (:8443, самоподписанный сертификат на имя и адреса сервера, свой сертификат, перенаправление браузера с HTTP); сервер времени из настроек (ntpd/chrony/timesyncd — bj-system-admin); постоянный адрес — bj-network (netplan try с откатом), вопрос при первой загрузке с образа; раздел «Сервер: HTTPS, время, сеть»; HTTPS в итоговой проверке; адреса https:// на экране установщика и консоли
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
+36
-12
@@ -61,18 +61,42 @@ var templateFuncs = template.FuncMap{
|
||||
"depoAccPrefix": depoAccPrefix,
|
||||
"certDaysLeft": certDaysLeft,
|
||||
"currentContour": func() string { return contourOf(currentNSDProfile()) },
|
||||
"intList": func(v ...int) []int { return v },
|
||||
"nsdSegTip": nsdSegTip,
|
||||
"devOn": authTemplateFuncs["devOn"],
|
||||
"devLicensed": authTemplateFuncs["devLicensed"],
|
||||
"mod": func(f string) bool { return globalRC == nil || moduleAllowed(globalRC, f) }, // модуль в лицензии
|
||||
"isIIS": incomingIsIIS, // входящий перевод на ИИС
|
||||
"depoSubs": func() any { return depoWizardSubs }, // экраны шага 3 мастера
|
||||
"authOpen": authOpen,
|
||||
"internalDocs": func() bool { return internalDocsBuilt },
|
||||
"roleTitle": roleTitle,
|
||||
"stageCls": func(r depoQueueRow) string { c, _ := r.StageRu(); return c },
|
||||
"stageText": func(r depoQueueRow) string { _, t := r.StageRu(); return t },
|
||||
"httpsCert": func() map[string]any {
|
||||
cn, until, err := tlsCertInfo()
|
||||
return map[string]any{"CN": cn, "Until": until, "Err": err, "Days": certDaysLeft(until)}
|
||||
},
|
||||
"serverAddrs": func() string {
|
||||
host, ips := localAddrs()
|
||||
var a []string
|
||||
for _, ip := range ips {
|
||||
if ip.To4() != nil && !ip.IsLoopback() {
|
||||
a = append(a, ip.String())
|
||||
}
|
||||
}
|
||||
return host + " · " + strings.Join(a, ", ")
|
||||
},
|
||||
"serverIP": func() string {
|
||||
_, ips := localAddrs()
|
||||
for _, ip := range ips {
|
||||
if ip.To4() != nil && !ip.IsLoopback() {
|
||||
return ip.String()
|
||||
}
|
||||
}
|
||||
return "IP-сервера"
|
||||
},
|
||||
"timeSynced": func() bool { ok, _ := timeStatus(context.Background()); return ok },
|
||||
"intList": func(v ...int) []int { return v },
|
||||
"nsdSegTip": nsdSegTip,
|
||||
"devOn": authTemplateFuncs["devOn"],
|
||||
"devLicensed": authTemplateFuncs["devLicensed"],
|
||||
"mod": func(f string) bool { return globalRC == nil || moduleAllowed(globalRC, f) }, // модуль в лицензии
|
||||
"isIIS": incomingIsIIS, // входящий перевод на ИИС
|
||||
"depoSubs": func() any { return depoWizardSubs }, // экраны шага 3 мастера
|
||||
"authOpen": authOpen,
|
||||
"internalDocs": func() bool { return internalDocsBuilt },
|
||||
"roleTitle": roleTitle,
|
||||
"stageCls": func(r depoQueueRow) string { c, _ := r.StageRu(); return c },
|
||||
"stageText": func(r depoQueueRow) string { _, t := r.StageRu(); return t },
|
||||
"deref": func(v *float64) float64 {
|
||||
if v == nil {
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user