From 8099e50ab26a3632da8e6773c7420b9b35d69e0d Mon Sep 17 00:00:00 2001 From: zuevav Date: Tue, 15 Sep 2026 20:43:56 +0300 Subject: [PATCH] =?UTF-8?q?feat(update):=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B7=D0=B8=D0=B8=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - по умолчанию https://lic.zetit.ru/updates; клиент артефактории передаёт лицензионный токен установки (Authorization: Bearer), сервер отдаёт модули по признакам лицензии - компоненты получили признак лицензии (ядро и криптосервис — updates, ЛК — web-cabinet, НПР — npr, экспорт QUIK — quik-export) - в bj зашит открытый ключ подписи релизов (закрытый хранится вне сервера лицензий) - проверено сквозной установкой bj-lk 0.2.0 из канала beta Co-Authored-By: Claude Opus 5 (1M context) --- internal/lkgateway/updater.go | 22 ++++++++++++++----- .../lkgateway/web/templates/admin_setup.html | 4 ++-- internal/release/client.go | 17 ++++++++++++-- internal/release/components.go | 12 +++++----- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/internal/lkgateway/updater.go b/internal/lkgateway/updater.go index 7b2809b..5022094 100644 --- a/internal/lkgateway/updater.go +++ b/internal/lkgateway/updater.go @@ -27,13 +27,16 @@ import ( var BuildVersion = "0.1.0" // DefaultUpdatePublicKey — публичный ключ артефактории, зашитый в релиз. -// Пустой в исходниках; подставляется при официальной сборке. Если задан в +// Открытая часть ключа подписи релизов. Если задан в // настройках (UpdateSettings.PublicKey) — приоритет у настроек (для проверки // в bj; root-установщик верит только /etc/bj/update.pub). -var DefaultUpdatePublicKey = "" +var DefaultUpdatePublicKey = "GHC/gJdQOAEVuBmq8pRpfG+CoIwtcjpNlSf6bPFtr/Y=" // ~/keys/release-signing.pub (закрытый ключ хранится вне сервера лицензий) const updateStagingDir = "/var/lib/bj/update-staging" +// DefaultUpdateURL — сервер обновлений по умолчанию (встроен в сервер лицензий). +const DefaultUpdateURL = "https://lic.zetit.ru/updates" + type Updater struct{ rc *RuntimeConfig } func NewUpdater(rc *RuntimeConfig) *Updater { return &Updater{rc: rc} } @@ -55,14 +58,23 @@ func (u *Updater) updateClient() (*release.Client, error) { if pub == "" { pub = DefaultUpdatePublicKey } - if cfg.BaseURL == "" || pub == "" { - return nil, fmt.Errorf("обновления не настроены (нужны URL артефактории и публичный ключ)") + base := cfg.BaseURL + if base == "" { + base = DefaultUpdateURL + } + if pub == "" { + return nil, fmt.Errorf("обновления не настроены: в этой сборке нет открытого ключа подписи релизов") } channel := cfg.Channel if channel == "" { channel = "stable" } - return release.NewClient(cfg.BaseURL, channel, pub) + cl, err := release.NewClient(base, channel, pub) + if err != nil { + return nil, err + } + cl.Token = strings.TrimSpace(u.rc.Snapshot().License.Key) // лицензионный токен установки + return cl, nil } // CheckForUpdate — манифест и состояние каждого компонента. diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index 72d044a..6902a7a 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -947,10 +947,10 @@

Источник обновлений

-

Артефактория раздаёт подписанные релизы. Обновления проверяются по подписи Ed25519 и sha256 — без валидной подписи установка не выполняется.

+

Обновления раздаёт сервер лицензий по лицензии этой установки: модуль скачивается, только если он входит в лицензию. Каждый релиз проверяется по подписи Ed25519 и контрольным суммам, без действительной подписи установка не выполняется.

- +