From 27bf8f64147c7426e53684a433ed587933ad36cd Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 17:26:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80:=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=8F=D1=81=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=20?= =?UTF-8?q?=D1=83=D0=B6=D0=B5=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=BC=20=D1=88=D0=B0=D0=B3=D0=B0=D0=BC,=20?= =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=82=D0=B0=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B0=D0=BC=D0=B0=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=83?= =?UTF-8?q?=D1=82=D0=B8=20PKCS#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шаг «База bj» показывает, что базу создал установщик; шаг DEPO — почему пропущен. Поле libvdpkcs11.so убрано (в Валидате 6.0 такого модуля нет, работа через bj-crypto). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/setup.go | 72 +++++++++++++++++-- .../lkgateway/web/templates/admin_setup.html | 4 +- .../lkgateway/web/templates/admin_wizard.html | 51 +++++++------ 3 files changed, 91 insertions(+), 36 deletions(-) diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index 6f0d14c..6e94c0f 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -163,15 +163,19 @@ func (h *setupHandlers) renderNews(w http.ResponseWriter, r *http.Request) { // WizardData — данные для шаблона /admin/wizard. type WizardData struct { page - Step int - Settings Settings - Suggest *DepoRequisites // предложение реквизитов из DEPO (после «Определить из DEPO») + Step int + Settings Settings + Suggest *DepoRequisites // предложение реквизитов из DEPO (после «Определить из DEPO») Lic LicenseStatus DepoLicensed bool DepoDB string - Certs []cryptocli.Certificate - Flash string - Done struct { + ValidataVer string // версия установленной «Валидаты Клиент L» (пусто — не установлена) + CryptoSvc string // состояние службы bj-crypto (systemctl is-active) + PGSummary string // куда подключена база bj, без пароля + AutoDone []string // шаги до текущего, уже выполненные без участия пользователя, — с пояснением + Certs []cryptocli.Certificate + Flash string + Done struct { License bool Depo bool Postgres bool @@ -204,7 +208,17 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { d.DepoDB = s.Fancy.DepoDB() d.Done.Depo = strings.TrimSpace(s.Fancy.Server) != "" || !d.DepoLicensed d.Done.Postgres = s.Postgres.DSN != "" - d.Done.Crypto = s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != "" + { + ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second) + d.ValidataVer, _, _ = validataVersion(ctx) + out, _ := exec.CommandContext(ctx, "systemctl", "is-active", "bj-crypto.service").Output() + cancel() + d.CryptoSvc = strings.TrimSpace(string(out)) + } + d.PGSummary = dsnSummary(s.Postgres.DSN) + // Валидата ставится с образа/установщиком: если она на месте, шаг выполнен без ввода параметров + // (bj работает с ней через свой криптосервис, путь к модулю не нужен). + d.Done.Crypto = d.ValidataVer != "" || (s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != "") d.Done.Certs = len(d.Certs) > 0 d.Done.NSD = s.NSD.IGWBaseURL != "" && s.NSD.Profile != "" d.Done.TestRun = s.LastTest != nil || (!d.DevMode && d.Done.NSD) // вне режима разработки тестовой заявки нет @@ -235,9 +249,53 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { } } d.Step = step + d.AutoDone = wizardAutoDone(&d) render(w, h.tpl.a.wizard, d) } +// wizardAutoDone — пояснения к шагам до текущего, которые уже выполнены: мастер переходит к первому +// незавершённому шагу сам, и без пояснения непонятно, почему предыдущие отмечены галочкой. +func wizardAutoDone(d *WizardData) []string { + var out []string + if d.Step > 1 && d.Done.License { + out = append(out, "1. Лицензия — активирована: "+d.Lic.Tenant+".") + } + if d.Step > 2 && d.Done.Postgres { + t := "2. База bj — готова" + if d.PGSummary != "" { + t += " (" + d.PGSummary + ")" + } + out = append(out, t+": её создал установщик, настраивать ничего не нужно.") + } + if d.Step > 3 && d.Done.Depo { + if !d.DepoLicensed { + out = append(out, "3. Учёт DEPO — не нужен: модуль обмена с DEPO и QUIK не входит в лицензию. Когда модуль добавят, шаг станет доступен.") + } else { + out = append(out, "3. Учёт DEPO — подключение уже сохранено ("+d.Settings.Fancy.Server+").") + } + } + if d.Step > 4 && d.Done.Crypto && d.ValidataVer != "" { + out = append(out, "4. Валидата — установлена вместе с bj (версия "+d.ValidataVer+").") + } + return out +} + +// dsnSummary — «host:port, база name» из строки подключения PostgreSQL, без логина и пароля. +func dsnSummary(dsn string) string { + u, err := url.Parse(strings.TrimSpace(dsn)) + if err != nil || u.Host == "" { + return "" + } + host := u.Host + if h := u.Hostname(); h == "127.0.0.1" || h == "localhost" || h == "::1" { + host = "PostgreSQL на этом сервере" + } + if db := strings.TrimPrefix(u.Path, "/"); db != "" { + return host + ", база " + db + } + return host +} + // runCmd выполняет команду и возвращает stdout+stderr строкой. func runCmd(ctx context.Context, name string, args ...string) (string, error) { cmd := exec.CommandContext(ctx, name, args...) diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index a5a8d3e..fbbfeed 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -427,8 +427,8 @@ {{if devOn}} {{end}} - - + {{/* путь к PKCS#11 не используется: bj работает с Валидатой через bj-crypto; в Валидате 6.0 модуля libvdpkcs11.so нет */}} +
diff --git a/internal/lkgateway/web/templates/admin_wizard.html b/internal/lkgateway/web/templates/admin_wizard.html index 9908484..d59a130 100644 --- a/internal/lkgateway/web/templates/admin_wizard.html +++ b/internal/lkgateway/web/templates/admin_wizard.html @@ -41,6 +41,12 @@
+{{if .AutoDone}}
+

Уже готово — эти шаги пропущены, делать там ничего не нужно:

+ {{range .AutoDone}}

✓ {{.}}

{{end}} +

Открыть любой шаг можно кнопками «← К шагу» внизу.

+
{{end}} + {{/* ============= ШАГ 1: Лицензия ============= */}} {{if eq .Step 1}}
@@ -92,11 +98,12 @@ {{if eq .Step 2}}

Шаг 2. PostgreSQL

-

Сюда система пишет журнал сделок и принимает данные от команды Fansy.

+

База самого bj: журнал заявок и поручений, история обмена с НРД и DEPO, пользователи.

+ {{if .Done.Postgres}}

✓ База готова{{if .PGSummary}}: {{.PGSummary}}{{end}}. Её создал установщик — ничего делать не нужно, переходите к следующему шагу.

{{end}} -
+ {{if not .Done.Postgres}}
Что выбрать? Если у вас уже есть рабочий PostgreSQL — нажмите «У меня уже есть PostgreSQL» и введите DSN. Если впервые настраиваете — выберите «Поднять автоматически», система сама развернёт контейнер с PostgreSQL и накатит миграции. -
+
{{end}} {{if and devOn (not .Settings.Postgres.DSN)}}
@@ -109,8 +116,8 @@
{{end}} -
- Вариант Б — у меня уже есть PostgreSQL, введу DSN сам +
+ {{if .Settings.Postgres.DSN}}Подключить другую базу (обычно не нужно){{else}}Вариант Б — у меня уже есть PostgreSQL, введу DSN сам{{end}}
@@ -131,30 +138,20 @@ {{if eq .Step 4}}

Шаг 4. СКЗИ «Валидата Клиент L»

-

СКЗИ нужен для подписи XMLDSig и проверки квитанций НРД.

- +

СКЗИ «Валидата Клиент L» проверяет подписи НРД на квитанциях и сообщениях и нужно для работы с ключами и сертификатами (шаг 5).

+ {{if .ValidataVer}} +

✓ Валидата установлена вместе с bj: версия {{.ValidataVer}}, каталог /opt/Validata/VDCSP. Ничего настраивать на этом шаге не нужно.

+

bj работает с Валидатой через свою службу криптографии bj-crypto{{if eq .CryptoSvc "active"}} — она запущена{{else}} — она запустится, когда на шаге 5 будут загружены ключи и сертификаты{{end}}.

+ {{else}} +

Валидата на этом сервере не найдена.

- Что это? АПК «Валидата Клиент L» — российское СКЗИ с поддержкой ГОСТ Р 34.10-2012, поставляемое НРД для подключения к ЭДО. На Linux работает напрямую через PKCS#11 — отдельной лицензии и регистрационных данных не требует.
- Где взять? Дистрибутив для Astra Linux SE — fs.moex.com/cdp/po/ClientL_ALSE.zip. Установка — sudo dpkg -i zpki-*.deb zsdk-*.deb (см. /admin/help/crypto). + Как поставить. С образа Bridge&Join она ставится сама. Если bj ставили на готовую систему: пакеты zpki и zsdk из дистрибутива НРД (ClientL_Other.zip для Ubuntu 22.04, ClientL_ALSE.zip для Astra Linux) — sudo apt install ./zpki_*.deb ./zsdk_*.deb, подробнее — справка. После установки обновите эту страницу.
- -
- Параметры провайдера - -
- - -
-
- - -
- - -
+ {{if devOn}}
+ + +
{{end}} + {{end}}