Files
Bridge-and-Join-s/cmd/bj-component-install/main.go
T
zuevav 4135435b51 feat(install): консольный установщик bj и первичная настройка по одноразовому коду
- cmd/bj-installer (вместо веб-мастера): проверка Debian 13 / Astra, пакеты, пользователь и
  каталоги, активация лицензии ключом продукта, PostgreSQL и миграции m2m_core, компоненты
  по лицензии с проверкой подписи, root-скрипты и службы, одноразовый код и итоговый экран
  с адресом http://<сервер>:8080/first-run; проверка в песочнице (--steps, --root)
- bj: /first-run — пока нет пользователей и установщик оставил код, по коду создаётся
  первый администратор (прежние установки без файла работают как раньше)
- internal/release/install.go — общая установка компонентов (bj-component-install и
  установщик); bj-component-install стал компонентом ядра
- открытые ключи вынесены в internal/license и internal/release; миграции и файлы
  развёртывания встроены (migrations/embed.go, deploy/embed.go); unit bj-server исправлен
- scripts/build-release.sh: сборка с версиями, подпись, публикация на сервер обновлений

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 23:56:44 +03:00

41 lines
2.1 KiB
Go

// Command bj-component-install — root-установщик компонентов bj (независимые обновления).
//
// bj-server работает без прав root: он скачивает подписанный манифест релиза и выбранные файлы в
// каталог подготовки и просит root-воркер (bj-keymedia-worker, действие component-install) вызвать
// этот инструмент. Проверка и установка — release.InstallStaged: подпись манифеста ключом из
// /etc/bj/update.pub (принадлежит root), sha256 файлов, только известные компоненты, без отката,
// копия прежнего файла, перезапуск служб (ядро последним), записи в /var/lib/bj/.bj/components.json.
// Вывод — JSON для bj-server.
//
// bj-component-install <каталог подготовки>
// bj-component-install -root /tmp/песочница -pub test.pub -no-restart <каталог> (проверка на копии)
package main
import (
"encoding/json"
"flag"
"fmt"
"os"
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/release"
)
func main() {
fs := flag.NewFlagSet("bj-component-install", flag.ExitOnError)
root := fs.String("root", "", "корень установки (для проверки в песочнице; по умолчанию /)")
pubPath := fs.String("pub", "/etc/bj/update.pub", "открытый ключ подписи релизов (base64 Ed25519), файл root")
noRestart := fs.Bool("no-restart", false, "не перезапускать службы")
_ = fs.Parse(os.Args[1:])
var res release.InstallResult
if pub, err := release.LoadPublicKey(*pubPath); err != nil {
res.Error = fmt.Sprintf("открытый ключ обновлений (%s): %v", *pubPath, err)
} else {
res = release.InstallStaged(fs.Arg(0), release.InstallOptions{Root: *root, PubKey: pub, Restart: !*noRestart})
}
b, _ := json.Marshal(res)
fmt.Println(string(b))
if !res.OK {
os.Exit(1)
}
}