feat(update): независимые обновления компонентов bj

- internal/release/components.go: список компонентов (ядро bj-server, криптосервис, bj-lk,
  bj-npr, bj-quikexport) с путём и службой, установленные версии в components.json,
  расчёт обновлений по версии каждого файла и sha256 (без отката, модули — только если
  уже установлены на сервере)
- cmd/bj-component-install: root-установщик — сам перепроверяет подпись манифеста ключом
  /etc/bj/update.pub и sha256, копия прежнего файла, перезапуск только затронутых служб
- updater: bj-server (без прав root) скачивает в update-staging и передаёт установку
  root-воркеру (действие component-install); установка в фоне
- настройки: таблица компонентов с версиями, «Обновить» и «Обновить всё»
- bj-release: версия файла из <файл>.version; bj-keymedia-worker: component-install

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-15 20:16:36 +03:00
parent 5115ed7223
commit 2908697363
11 changed files with 720 additions and 114 deletions
+4 -4
View File
@@ -41,10 +41,10 @@ type Artifact struct {
// Manifest — описание релиза. Подписывается целиком (каноничный JSON).
type Manifest struct {
Schema int `json:"schema"`
Version string `json:"version"` // версия релиза, напр. "1.2.0"
Channel string `json:"channel"` // "stable" | "beta"
ReleasedAt time.Time `json:"released_at"` // время сборки релиза
Notes string `json:"notes,omitempty"` // что нового (для UI)
Version string `json:"version"` // версия релиза, напр. "1.2.0"
Channel string `json:"channel"` // "stable" | "beta"
ReleasedAt time.Time `json:"released_at"` // время сборки релиза
Notes string `json:"notes,omitempty"` // что нового (для UI)
MinVersion string `json:"min_version,omitempty"` // мин. версия для прямого апгрейда
Artifacts []Artifact `json:"artifacts"`
}