Первичная настройка, повторная проверка: копии без ключевых носителей СКЗИ (--one-file-system, без keymedia), без отпечатка железа и списка компонентов; восстановление на новый сервер — пароль базы bj из копии, база и пользователь ИШ; ключ для контура без канала запоминается и подключается при настройке канала; первый настроенный канал становится рабочим контуром; справочник сертификатов перечитывается после ключа и смены контура; шлюз НРД — шаг 7, ключ — шаг 8 (ключ ставится в профиль ИШ); подсказка контура ключа по сертификату; ИШ: параметры работающего шлюза не перезаписываются; без чужого кода отправителя и получателя по умолчанию; прокси для выхода в интернет; установка с образа без интернета; HTTPS — новый сертификат при смене адреса; bj-network — без cloud-init; проверка готовности: справочник участников, сетевые доступы, учётные записи, последний обмен с НРД
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package lkgateway
|
||||
|
||||
// Интеграционный шлюз НРД (ИШ, служба igate) на этом сервере: состояние для мастера (шаг 8).
|
||||
// Интеграционный шлюз НРД (ИШ, служба igate) на этом сервере: состояние для мастера (шаг 7).
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -112,7 +112,10 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
return
|
||||
}
|
||||
s := rc.Snapshot()
|
||||
res["active_contour"] = contourOf(s.NSD.Profile)
|
||||
res["active_contour"] = ""
|
||||
if s.NSD.Profile != "" {
|
||||
res["active_contour"] = contourOf(s.NSD.Profile)
|
||||
}
|
||||
res["active_profile"] = s.NSD.Profile
|
||||
res["deponent"] = pickStr(s.NSD.DeponentCode, orgCode(s))
|
||||
res["depo_db"] = s.Fancy.DepoDB()
|
||||
@@ -153,6 +156,9 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
jsonOut(w, map[string]any{"ok": false, "error": "загрузите архив ИШ или укажите версию вида 107.0.930"})
|
||||
return
|
||||
}
|
||||
if u := rc.Snapshot().Proxy.url(); u != nil {
|
||||
params["proxy"] = u.String() // скачивание с nsd.ru и пакеты — через прокси организации
|
||||
}
|
||||
extra, _ := json.Marshal(params)
|
||||
ctx, cancel := context.WithTimeout(r.Context(), time.Minute)
|
||||
defer cancel()
|
||||
@@ -190,7 +196,21 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
extra, _ := json.Marshal(map[string]string{"contour": contour, "crypto": crypto, "deponent": dep})
|
||||
ctx, cancel := context.WithTimeout(r.Context(), 3*time.Minute)
|
||||
defer cancel()
|
||||
jsonOut(w, opResult(runKeymediaOp(ctx, "igate-contour", map[string]string{"extra": string(extra)})))
|
||||
res, err := runKeymediaOp(ctx, "igate-contour", map[string]string{"extra": string(extra)})
|
||||
if err == nil && res["ok"] == true && rc.Snapshot().NSD.Profile == "" {
|
||||
// контур в bj ещё не выбран (новая установка) — первый настроенный канал и есть рабочий
|
||||
n := rc.Snapshot().NSD
|
||||
n.Profile, n.IGWBaseURL = contour+"-"+crypto, pickStr(n.IGWBaseURL, igateDefaultURL)
|
||||
if rc.UpdateNSD(n) == nil {
|
||||
res["output"] = asString(res["output"]) + ". bj работает с этим контуром и перезапускается — обновите страницу через 15 секунд"
|
||||
go func() {
|
||||
time.Sleep(2 * time.Second)
|
||||
_, _ = restartUnit(context.Background(), "bj-server")
|
||||
}()
|
||||
}
|
||||
}
|
||||
refreshCertStore(rc)
|
||||
jsonOut(w, opResult(res, err))
|
||||
})
|
||||
// переключить bj на контур: профиль отправки, база DEPO контура; bj перезапускается
|
||||
mux.HandleFunc("/admin/setup/igate/switch", func(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -256,6 +276,9 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
n.Profile = contour + "-" + crypto
|
||||
n.IGWBaseURL = pickStr(n.IGWBaseURL, igateDefaultURL)
|
||||
n.SwitchedAt = time.Now()
|
||||
nc := s.NSDCerts
|
||||
nc.LastStore, nc.LastRows, nc.LastProfile = nil, nil, "" // справочник другого контура — перечитается после перезапуска
|
||||
_ = rc.UpdateNSDCerts(nc)
|
||||
if target != "" && target != f.DepoDB() {
|
||||
f.DepoDatabase = target
|
||||
f.DepoTablesCheck, f.DepoTablesCheckOK = "", false // таблицы и обработку в другой базе — проверить заново
|
||||
@@ -278,6 +301,23 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
}
|
||||
}()
|
||||
name := map[string]string{"prod": "боевой", "test3": "тестовый TEST3"}[contour]
|
||||
jsonOut(w, map[string]any{"ok": true, "output": "bj переключён на " + name + " контур (база DEPO " + rc.Snapshot().Fancy.DepoDB() + ") и перезапускается — обновите страницу через 15 секунд"})
|
||||
msg := "bj переключён на " + name + " контур (база DEPO " + rc.Snapshot().Fancy.DepoDB() + ") и перезапускается — обновите страницу через 15 секунд"
|
||||
if !rc.Snapshot().Fancy.DepoTablesCheckOK {
|
||||
msg += ". База DEPO сменилась — пройдите шаг 3 (таблицы обмена и обработка в этой базе)"
|
||||
}
|
||||
jsonOut(w, map[string]any{"ok": true, "output": msg})
|
||||
})
|
||||
}
|
||||
|
||||
// refreshCertStore — перечитать справочник сертификатов ИШ сейчас (после установки ключа, настройки канала,
|
||||
// смены контура), не дожидаясь плановой сверки раз в 6 часов: от него зависят шаг «Сертификаты» и сроки.
|
||||
func refreshCertStore(rc *RuntimeConfig) {
|
||||
go func() {
|
||||
time.Sleep(20 * time.Second) // ИШ перезапускается после изменений
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
|
||||
defer cancel()
|
||||
if _, err := nsdCertsCheck(ctx, rc); err != nil {
|
||||
log.Printf("nsdcerts: перечитать справочник: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user