Мастер настройки — 4 главы (Сервер, Учёт и организация, НРД, Запуск) вместо 10 шагов: в пути только нужное этой установке — без лицензии учёта DEPO, QUIK и модулей их шагов нет, сделанное установщиком (база, Валидата) показано строкой; общая навигация «Назад/Далее»; раздел «Время и сеть» с часовым поясом; модули по лицензии (кабинет, ЕСИА Финанс, экспорт QUIK, НПР) с переходом в раздел и возвратом в мастер; «Проверить всю цепочку» (DEPO, QUIK, пробная блокировка по желанию, подпись, НРД); готовые письма в НРД, ARQA и администратору DEPO; ИШ с образа без интернета

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-05 18:04:29 +03:00
parent 7a5673e91f
commit f0dec0c238
22 changed files with 1020 additions and 129 deletions
+25 -3
View File
@@ -1,6 +1,6 @@
package lkgateway
// Интеграционный шлюз НРД (ИШ, служба igate) на этом сервере: состояние для мастера (шаг 7).
// Интеграционный шлюз НРД (ИШ, служба igate) на этом сервере: состояние для мастера (глава «НРД»).
import (
"context"
@@ -14,6 +14,8 @@ import (
"regexp"
"strings"
"time"
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/release"
)
const igateDefaultURL = "http://localhost:8090"
@@ -120,6 +122,7 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
res["deponent"] = pickStr(s.NSD.DeponentCode, orgCode(s))
res["depo_db"] = s.Fancy.DepoDB()
res["depo_db_test"], res["depo_db_prod"] = s.NSD.DepoDBTest, s.NSD.DepoDBProd
res["bundled"] = igateBundledVersion()
jsonOut(w, res)
})
// установка или обновление ИШ: загруженный архив НРД или версия для скачивания с nsd.ru
@@ -150,6 +153,12 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
return
}
params["file"] = dst
} else if r.FormValue("bundled") == "1" {
if igateBundledVersion() == "" {
jsonOut(w, map[string]any{"ok": false, "error": "в образе нет дистрибутива ИШ — скачайте с сайта НРД или загрузите файл"})
return
}
params["bundled"] = "1"
} else if v := strings.TrimSpace(r.FormValue("version")); igateVersionRe.MatchString(v) {
params["version"] = v
} else {
@@ -187,7 +196,7 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
}
dep := pickStr(s.NSD.DeponentCode, orgCode(s))
if dep == "" {
jsonOut(w, map[string]any{"ok": false, "error": "сначала укажите депозитарный код организации (шаг 4)"})
jsonOut(w, map[string]any{"ok": false, "error": "сначала укажите депозитарный код организации (мастер, раздел «Организация»)"})
return
}
extra, _ := json.Marshal(map[string]string{"contour": contour, "crypto": crypto, "deponent": dep})
@@ -300,7 +309,7 @@ func registerIgateAdmin(mux *http.ServeMux, rc *RuntimeConfig) {
name := map[string]string{"prod": "боевой", "test3": "тестовый TEST3"}[contour]
msg := "bj переключён на " + name + " контур (база DEPO " + rc.Snapshot().Fancy.DepoDB() + ") и перезапускается — обновите страницу через 15 секунд"
if !rc.Snapshot().Fancy.DepoTablesCheckOK {
msg += ". База DEPO сменилась — пройдите шаг 3 (таблицы обмена и обработка в этой базе)"
msg += ". База DEPO сменилась — пройдите в мастере раздел «Учёт DEPO» (таблицы обмена и обработка в этой базе)"
}
jsonOut(w, map[string]any{"ok": true, "output": msg})
})
@@ -318,3 +327,16 @@ func refreshCertStore(rc *RuntimeConfig) {
}
}()
}
// igateBundledVersion — версия ИШ, лежащего на сервере с образа (/var/lib/bj/igate-dist; "" — нет).
func igateBundledVersion() string {
m, _ := filepath.Glob("/var/lib/bj/igate-dist/igate-*-amd64.zip")
best := ""
for _, f := range m {
v := strings.ReplaceAll(strings.TrimSuffix(strings.TrimPrefix(filepath.Base(f), "igate-"), "-amd64.zip"), "-", ".")
if igateVersionRe.MatchString(v) && (best == "" || release.IsNewer(v, best)) {
best = v
}
}
return best
}