НПР / УДС — отдельная служба bj-npr

Модуль вынесен в modules/npr + cmd/bj-npr (127.0.0.1:8083), обновляется
независимо от ядра. Служба читает подключение из setup.json и принимает
запросы только со служебным ключом модулей (/var/lib/bj/.bj/module.key,
создаёт bj-server). Полные страницы отдаются фрагментом (X-BJ-Layout: page).

bj-server хранит настройки и проверку подключения, проксирует /admin/npr
после входа, прав и лицензии и встраивает страницы модуля в общий макет
(admin.modulePage); если служба не отвечает — понятная страница.
Unit bj-npr.service встроен в установщик, установщик включает службы
установленных модулей; build-release.sh собирает bj-npr.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-16 01:00:31 +03:00
parent d8dee07213
commit 5527a464ca
15 changed files with 872 additions and 467 deletions
+15 -2
View File
@@ -609,8 +609,15 @@ func (in *installer) stepServices() (string, error) {
if err != nil {
return "", err
}
enable := []string{"enable", "bj-keymedia.service", "bj-server.service"}
// службы установленных модулей (bj-npr и т. п.), для которых есть unit-файл
for name := range release.LoadInstalled(in.P(release.InstalledFile)) {
if c, ok := release.ComponentByName(name); ok && !c.Core && c.Unit != "" && unitTemplate(c.Unit) {
enable = append(enable, c.Unit+".service")
}
}
if in.root == "" {
for _, c := range [][]string{{"daemon-reload"}, {"enable", "bj-keymedia.service", "bj-server.service"}} {
for _, c := range [][]string{{"daemon-reload"}, enable} {
if out, err := run("systemctl", c...); err != nil {
return "", fmt.Errorf("systemctl %s: %v %s", strings.Join(c, " "), err, out)
}
@@ -625,7 +632,13 @@ func (in *installer) stepFirstRun() (string, error) {
return "", err
}
if in.root == "" {
for _, unit := range []string{"bj-keymedia", "bj-server"} {
units := []string{"bj-keymedia", "bj-server"}
for name := range release.LoadInstalled(in.P(release.InstalledFile)) {
if c, ok := release.ComponentByName(name); ok && !c.Core && c.Unit != "" && unitTemplate(c.Unit) {
units = append(units, c.Unit)
}
}
for _, unit := range units {
if out, err := run("systemctl", "restart", unit); err != nil {
return "", fmt.Errorf("запуск %s: %v %s", unit, err, out)
}
+44
View File
@@ -0,0 +1,44 @@
// Command bj-npr — служба модуля «НПР / УДС» (modules/npr), обновляется независимо от ядра bj.
//
// Слушает только локальный адрес: пользователи работают через bj-server, который проверяет вход,
// права и лицензию и проксирует раздел /admin/npr со служебным ключом.
//
// bj-npr [-addr 127.0.0.1:8083] [-setup /var/lib/bj/.bj/setup.json] [-key /var/lib/bj/.bj/module.key]
// bj-npr -version
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"time"
"git.zetit.ru/zuevav/Bridge-and-Join-s/modules/npr"
)
// version — версия модуля (go build -ldflags "-X main.version=…").
var version = "0.1.0"
func main() {
addr := flag.String("addr", "127.0.0.1:8083", "адрес службы (только локальный)")
setup := flag.String("setup", "/var/lib/bj/.bj/setup.json", "настройки bj (раздел npr)")
key := flag.String("key", "/var/lib/bj/.bj/module.key", "служебный ключ модулей (создаёт bj-server)")
showVersion := flag.Bool("version", false, "показать версию")
flag.Parse()
if *showVersion {
fmt.Println("bj-npr", version)
return
}
srv, err := npr.New(npr.Config{SetupPath: *setup, KeyPath: *key})
if err != nil {
log.Fatalf("bj-npr: %v", err)
}
log.Printf("bj-npr %s: слушаю %s", version, *addr)
hs := &http.Server{Addr: *addr, Handler: srv.Handler(), ReadHeaderTimeout: 10 * time.Second}
if err := hs.ListenAndServe(); err != nil {
log.Printf("bj-npr: %v", err)
os.Exit(1)
}
}