Документация / CI/CD и API
API сервера лицензий
Сервер лицензий отвечает на три открытых метода: активация ключа, проверка ключа и открытый ключ подписи. Их вызывает Core. Вручную они нужны, чтобы проверить ключ до активации или разобраться с ошибкой.
Базовый адрес и доступ
- Адрес:
https://securityflow.ru. В Core он задан переменнойLICENSE_SERVER, см. Параметры конфигурации. - Аутентификации нет. Ключ лицензии передаётся в теле запроса.
- Если на сервере включён белый список адресов, методы отвечают только адресам из списка. Остальным - 403 с текстом
Доступ с вашего адреса закрыт.(не JSON). Для Core в списке должен быть внешний адрес, с которого кластер выходит в интернет, см. Кабинет лицензий. - Ограничение частоты: больше 60 запросов в минуту к
/api/с одного адреса (с запасом 30) - ответ 429.
Активация ключа
POST /api/v1/license/activate/
| Параметр | Где | Описание |
|---|---|---|
license_key |
JSON или форма | ключ лицензии. Пробелы и переносы строк вырезаются, поэтому ключ можно вставить из PDF |
Core отправляет ключ формой (application/x-www-form-urlencoded), сервер принимает и JSON.
curl -s -X POST https://securityflow.ru/api/v1/license/activate/ \
-H 'Content-Type: application/json' \
-d '{"license_key": "<ключ>"}'
Успех, 200:
{
"result": true,
"status": "activated",
"detail": "Лицензия активирована",
"license_id": "<id лицензии>",
"type": "paid",
"expires_at": "2027-10-10T00:00:00+00:00"
}
type- тип лицензии:demo,auditorилиpaid, см. Лицензирование.expires_at- окончание срока, ISO 8601.- Повторная активация того же ключа тоже даёт 200. Сервер отмечает время последней активации и считает активации.
Отказ, 400: result: false, status: "rejected", причина в detail.
detail |
Причина |
|---|---|
Не передан ключ лицензии |
пустое поле license_key |
Лицензия не найдена |
такого ключа на сервере нет |
Лицензия отозвана |
ключ отключён в кабинете |
Срок лицензии истёк |
срок вышел |
Проверка ключа
POST /api/v1/license/status/ с JSON {"license_key": "<ключ>"} или GET /api/v1/license/status/?license_key=<ключ>. Форму этот метод не принимает. Предпочитайте POST: ключ не попадает в адрес запроса.
curl -s -X POST https://securityflow.ru/api/v1/license/status/ \
-H 'Content-Type: application/json' \
-d '{"license_key": "<ключ>"}'
Ответ 200:
{
"is_valid": true,
"state": "active",
"type": "paid",
"license_id": "<id лицензии>",
"valid_to": "2027-10-10T00:00:00+00:00",
"activated_at": "2026-10-10T09:00:00+00:00"
}
| Код | Тело | Что значит |
|---|---|---|
| 200 | is_valid, state и данные лицензии |
ключ найден. is_valid: true только при state: "active". Другие состояния - revoked (отозван) и expired (истёк) |
| 400 | {"is_valid": false, "detail": "Не передан ключ лицензии"} |
ключ не передан |
| 404 | {"is_valid": false, "detail": "Лицензия не найдена"} |
ключа на сервере нет или он удалён |
activated_at - время последней активации или null, если ключ не активировали.
Открытый ключ
GET /api/public-key - открытый ключ RSA в формате PEM, text/plain. Им Core проверяет подпись лицензий: значение переменной LICENSE_SERVER_PUBLIC_KEY.
curl -s https://securityflow.ru/api/public-key
Метод подходит для проверки доступности сервера из сети Core.
Как Core использует API
| Когда | Метод | Что делает Core с ответом |
|---|---|---|
| Активация и замена лицензии | POST /api/v1/license/activate/, форма |
200 и result: true - сохраняет ключ. 400 - показывает detail. Если лицензия в Core уже есть - отвечает 420, см. Активация лицензии в Core |
| Каждые 300 секунд и при работе пользователей, не чаще раза в минуту на процесс | POST /api/v1/license/status/, JSON, таймаут 10 секунд |
см. таблицу ниже |
Реакция Core на проверку:
| Ответ сервера | Решение Core |
|---|---|
200, is_valid: true |
лицензия остаётся |
200, is_valid: false (отозвана, истекла) |
лицензия удаляется, интерфейс показывает экран активации |
| 404 | лицензия удаляется |
сеть недоступна, таймаут, 5xx, 403 белого списка, ответ не JSON, нет is_valid |
лицензия остаётся, решение не меняется |
Без связи с сервером Core работает до окончания срока в самом ключе: подпись и срок Core проверяет локально открытым ключом. Интервал проверки задаёт LICENSE_CHECK_INTERVAL_SECONDS, таймаут - LICENSE_CHECK_TIMEOUT, см. Параметры конфигурации.