# Лицензирование 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`. Без лицензирования (публичный ключ не зашит) — открытый режим, гейты не действуют (бесплатная редакция / разработка). ## Издателю ```bash # 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) Админ → Настройка → **Лицензия** → вставить ключ → «Активировать». Проверка офлайн; статус (организация, план, срок, обновления) виден сразу. ## Онлайн-отзыв (опционально) ```bash bj-license-server --addr :8091 --revoked /var/lib/bj-license/revoked.json ``` `revoked.json` — JSON-массив отозванных license ID: ```json ["28db4973-fde8-434c-b102-e83623eede2c"] ``` `GET /v1/check?id=` → `{"revoked":true|false}`. Перечитывается раз в минуту. В проде заменить файл на PostgreSQL + admin API выпуска/отзыва. ## Зашивка публичного ключа в релиз ```bash go build -ldflags "\ -X .../lkgateway.DefaultLicensePublicKey= \ -X .../lkgateway.DefaultUpdatePublicKey= \ -X .../lkgateway.BuildVersion=1.0.0" -o bj-server ./cmd/bj-server/ ```