- bj-license-server: активация по коду и продление токенов (API /v1), кабинет администратора (клиенты, лицензии, установки, журнал, администраторы) - защита: доверенные IP установок, jail fail2ban api/admin, раздел «Защита» с режимом обороны, белым списком и сроками блокировок (root-помощник fw-apply) - доступ к кабинету: свой адрес вместо /admin, вход только из белого списка, второй фактор — TOTP или подтверждение в «ЗЕТИТ Ключ» (push/код) - deploy/license: unit-файлы, fail2ban, path/timer помощника; контракт API в docs Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Лицензирование Bridge-and-Join-s (#19)
Годовые лицензии с офлайн-проверкой по подписи Ed25519 + опциональный онлайн-отзыв.
Компоненты
internal/license— формат лицензии + подпись/проверка (offline).cmd/bj-license— издательский CLI: keygen, issue, verify.cmd/bj-license-server— онлайн-реестр отзывов (revocation).- Интеграция в bj-server:
internal/lkgateway/licensecheck.go— проверка лицензии + гейт обновлений; UI раздел «Лицензия».
Модель
Лицензия — самодостаточный подписанный токен: payload.signature.keyid.
bj-server проверяет подпись зашитым публичным ключом и срок офлайн —
работает без связи с сервером. Online-сервер нужен только для отзыва.
Гейт обновлений: если лицензирование включено (есть публичный ключ),
авто-обновление (#20) выполняется только при валидной лицензии с фичей
updates. Без лицензирования (публичный ключ не зашит) — открытый режим,
гейты не действуют (бесплатная редакция / разработка).
Издателю
# 1. Ключи лицензий (однократно; приватный — в секрете!)
bj-license keygen -out ./keys/license
# публичный base64 — зашить в bj-server (DefaultLicensePublicKey)
# 2. Выпустить годовую лицензию клиенту
bj-license issue -tenant "ООО Ромашка" -plan pro -days 365 \
-features updates,web-cabinet -key ./keys/license.priv -keyid main
# → выводит ключ payload.signature.keyid — отдать клиенту
# 3. Проверить
bj-license verify -key-file license.key -pub ./keys/license.pub
Планы: free (без фич), pro (перечисленные features), enterprise
(всё включено). Фичи: updates, web-cabinet, …
Клиенту (on-prem bj-server)
Админ → Настройка → Лицензия → вставить ключ → «Активировать». Проверка офлайн; статус (организация, план, срок, обновления) виден сразу.
Онлайн-отзыв (опционально)
bj-license-server --addr :8091 --revoked /var/lib/bj-license/revoked.json
revoked.json — JSON-массив отозванных license ID:
["28db4973-fde8-434c-b102-e83623eede2c"]
GET /v1/check?id=<id> → {"revoked":true|false}. Перечитывается раз в
минуту. В проде заменить файл на PostgreSQL + admin API выпуска/отзыва.
Зашивка публичного ключа в релиз
go build -ldflags "\
-X .../lkgateway.DefaultLicensePublicKey=<base64-pub> \
-X .../lkgateway.DefaultUpdatePublicKey=<base64-pub-артефактории> \
-X .../lkgateway.BuildVersion=1.0.0" -o bj-server ./cmd/bj-server/