Перейти к содержимому

API: Администрирование

Только portal_admin. Базовый путь: /api/v1/admin.

Статистика заданий, служб, журнал аудита, инфраструктура и текущая нагрузка.

В блоке maintenance (вкладка Обзор → Обслуживание, только статус; действия — Службы):

ПолеСодержание
searchIndexЧисло записей, время обновления, расписание search-crawler, health
recycleBinЧисло записей корзины, расписание recycle-bin
backupВкл/выкл, runner online, число успешных копий, дата/размер последней, расписание portal-backup
adSyncВкл/выкл, LDAP настроен (available), расписание и последний job ad-sync

Полностью очищает portal_search_index без переобхода. Только portal_admin. В UI: Службы → Поисковый индекс (иконка очистки).

Окно терминала
curl -X POST "http://localhost/api/v1/admin/search/clear" \
-H "Authorization: Bearer $TOKEN"

Ответ: { "success": true, "data": { "total": 0 } }.

Полный обход после очистки (или для сверки): POST /api/v1/services/search-crawler/run или ▶ у службы в админке. Повседневные изменения контента индексируются сразу при сохранении — см. Поиск.

Блок load (окно HTTP ≈ 60 с, обновляется на вкладке «Обзор» каждые 5 с):

ПолеОписание
levelok / warn / high
http.rps / http.rpmЗапросов в секунду / минуту
http.error_rateДоля ответов 5xx
http.avg_latency_ms / http.max_latency_msСредняя и пиковая latency
worker.pending / worker.runningОчередь и in-flight worker
worker.completed_1mЗавершённых заданий за последнюю минуту
process.memory_mbWorking set API-процесса
postgres.active_connectionsАктивные подключения к БД

Подключение к каталогу и синхронизация настраиваются в админке. По умолчанию LDAP не настроен.

  1. Службы → Синхронизация AD → ⚙ Настройки (/services/ad-sync) — два аккордеона:
    • Подключение — URL, Base DN, Bind DN, пароль, фильтры входа/поиска, атрибут логина;
    • Настройка синхронизации — фильтры sync, поля профиля (каталог + доп. атрибуты), флаги групп и деактивации пользователей.
  2. Проверить статус подключения (badge «Подключён»)
  3. На вкладке Службы — включить ad-sync, ⋮ → Расписание и/или Запустить (без confirm; флаги берутся из сохранённых настроек)
  4. Результат — вкладка Задания; карточка пользователя — /users/{id}

Статус подключения: configured, connected, url, baseDn, error.

Параметры подключения (хранятся в portal_services.config службы ad-sync):

ПолеОписание
urlURL сервера (ldap:// или ldaps://)
baseDnБазовый DN поиска
bindDnDN сервисной учётной записи
hasPasswordЗадан ли пароль (сам пароль не возвращается)
userFilterФильтр входа, плейсхолдер {{username}}
searchFilterФильтр поиска в каталоге, плейсхолдер {{query}}
loginAttrАтрибут логина (sAMAccountName, uid, …)
searchLimitЛимит результатов поиска
connectTimeoutMsТаймаут подключения (мс)
configuredВсе обязательные поля заданы
defaultsЗначения по умолчанию для пустых полей
{
"url": "ldap://dc.company.local:389",
"baseDn": "dc=company,dc=local",
"bindDn": "cn=portal-svc,dc=company,dc=local",
"bindPassword": "secret",
"userFilter": "(sAMAccountName={{username}})",
"searchFilter": "(|(sAMAccountName=*{{query}}*)(displayName=*{{query}}*)(mail=*{{query}}*))",
"loginAttr": "sAMAccountName",
"searchLimit": 20
}

Пароль: новое значение, или опустите поле / отправьте ********, чтобы оставить текущий.

Переменные LDAP_* в portal.env больше не используются. При первом запуске после обновления значения из env автоматически переносятся в БД; затем удалите блок LDAP_* из env и перезапустите backend.

Настройки службы ad-sync (синхронизация пользователей и групп):

Пользователи:

ПолеОписание
syncFilterLDAP-фильтр пользователей (пусто → значение по умолчанию)
syncLimitЛимит за один проход
effectiveSyncFilter, effectiveSyncLimitФактически применяемые значения

Группы AD:

ПолеОписание
syncGroupsИмпортировать группы AD как domain_linked
groupSyncFilter, groupSyncLimitФильтр и лимит групп
removeMissingGroupMembersУбирать участников, отсутствующих в AD (по умолчанию true)
removeMissingGroupsУдалять группы Portal, пропавшие из AD (по умолчанию false)

Прочее:

ПолеОписание
cronDeactivateMissingДеактивировать доменных пользователей вне выборки sync (и по cron, и при ручном запуске, если в теле run не передан override). UI: «Деактивировать пользователей, отсутствующих в AD». Не связано с флагами состава групп

Поля профиля пользователя:

ПолеОписание
catalogВстроенный каталог атрибутов (key, ldapAttr, label, isCoreColumn, isBinary)
syncUserAttributesВключённые ключи встроенного каталога. Если ключ не задан в конфиге — все из каталога (включая thumbnailPhoto)
personCardVisibleFieldsКлючи полей meta-блока карточки сотрудника (порядок сохраняется). Если ключ не задан — department, title, telephoneNumber, mobile, email
defaultPersonCardVisibleFieldsСправочно: набор по умолчанию
customUserAttributesДоп. маппинги: { "key", "ldapAttr", "label" }[]

Логин и objectSid / external_id синхронизируются всегда. email и displayName пишутся в колонки users; строковые атрибуты — в users.directory_attrs. Бинарный thumbnailPhoto (по умолчанию включён) пишется в объектное хранилище (S3/MinIO, ключ avatars/{userId}), в БД — avatar_storage_key / hash / content-type. DN руководителя (manager) резолвится в users.manager_user_id после sync. В карточке сотрудника (GET /users/{id}/profile) meta-поля приходят в card_fields согласно personCardVisibleFields (без displayName / manager / thumbnailPhoto — они в шапке, оргструктуре и аватаре).

{
"syncFilter": "(&(objectCategory=person)(objectClass=user))",
"syncLimit": 500,
"syncGroups": true,
"groupSyncFilter": "(&(objectCategory=group)(objectClass=group))",
"groupSyncLimit": 200,
"removeMissingGroupMembers": true,
"removeMissingGroups": false,
"cronDeactivateMissing": true,
"syncUserAttributes": ["email", "displayName", "department", "title"],
"personCardVisibleFields": ["department", "title", "telephoneNumber", "mobile", "email"],
"customUserAttributes": [
{ "key": "employeeId", "ldapAttr": "employeeID", "label": "Табельный номер" }
]
}

Пустой syncFilter сбрасывает переопределение и возвращает значение по умолчанию.

МетодПутьОписание
GET/servicesСписок служб (available: false для ad-sync без LDAP)
PATCH/services/ad-sync{ "isEnabled": true, "cronEnabled": true, "cronExpression": "0 3 * * *" }
POST/services/ad-sync/runРучной запуск. Тело можно не передавать ({}): деактивация берётся из cronDeactivateMissing. Опциональный override: { "deactivateMissing": true|false }

В админке расписание — модальное окно (⋮ → Расписание): как часто (каждый час / каждые N часов / ежедневно / еженедельно / каждые N минут) и время или день → сохраняется как cronExpression.

Тип задания: adSync.run. Результат во вкладке Задания (users, groups). UI не показывает confirm при запуске.

См. также: Службы → ad-sync, Job-модули, Каталог AD.

UI: Службы → Резервное копирование → Настройки (/services/portal-backup). Руководство: Бэкап.

МетодПутьОписание
GET/admin/settings/backupПуть, retention, lastValidatedOk, статус runner
PUT/admin/settings/backupСохранить каталог и retention
POST/admin/settings/backup/validateПоставить validate в очередь runner
GET/admin/backupsЖурнал (page, limit) — validate / backup / restore
POST/admin/backupsПоставить создание копии (backup)
GET/admin/backups/restorableУспешные копии с файлом на диске (для UI восстановления)
POST/admin/backups/{id}/restoreВосстановление из выбранной копии
GET/admin/backups/{id}Статус одной записи
DELETE/admin/backups/{id}Удалить запись журнала (и файл, если есть)

Расписание службы — PATCH /services/portal-backup (cronEnabled, cronExpression). Ручной POST /services/portal-backup/run не используется.

Настройки хранятся в конфиге службы notifications. Чтобы портал реально отправлял письма (API, Event Receivers, «Запустить» в Службах), службу нужно включить. Тест SMTP ниже работает и при выключенной службе. См. notifications, API: Почта.

Текущие настройки (пароль не возвращается, только hasPassword).

{
"host": "smtp.company.local",
"port": 587,
"secure": false,
"user": "portal@company.local",
"password": "secret",
"fromEmail": "portal@company.local",
"fromName": "Portal",
"replyTo": "",
"allowAuthenticatedSend": false
}

Проверка подключения к SMTP.

{ "to": "admin@company.local" }

Подробнее: mail.md.

Версия установленного релиза берётся из файла RELEASE в дистрибутиве (см. Обновление Portal). В админке: Настройки → Продукт и лицензия.

Текущие настройки версии релиза:

ПолеОписание
installedReleaseVersionВерсия из RELEASE или БД
installedReleaseSourcefile или database
releaseFilePathПуть к найденному файлу RELEASE
canEditInstalledVersionfalse, если версия задана файлом
lastKnownLatestVersionПоследняя версия с korport.ru
lastUpdateCheckAtВремя последней проверки
updateCheckUrlURL API вендора (по умолчанию korport.ru)
updatesPageUrlСтраница changelog

Ручное изменение версии — только если файл RELEASE не найден (режим разработки):

{ "installedReleaseVersion": "1.0.0" }

Статус Portal Office: включён ли редактор, доступность по PORTAL_OFFICE_INTERNAL_URL, установленная версия (probe portal-office-version.json или env PORTAL_OFFICE_VERSION).

Сверка установленной версии Office с GET {OfficeUpdateCheckUrl} на korport (/api/portal/office/version). Обновление пакета — вручную через portal-office (не update-runner).

Проверка обновлений на korport.ru. Ответ:

ПолеОписание
installedReleaseVersionУстановленная версия
latestVersionАктуальный релиз на korport.ru
updateAvailabletrue, если есть более новая версия
upToDatetrue, если версии совпадают
whatsNew, fixesСписки изменений
updatesUrlСсылка на страницу обновлений
licenseOkДействует ли локальная лицензия
canUpgradeOnlineМожно ли запускать онлайн-обновление
upgradeBlockedReasonПричина, если онлайн-обновление недоступно
channel, platformКанал/платформа установки

Публичный API вендора (без авторизации): GET https://korport.ru/api/portal/version.

Статус update-runner и последнего задания обновления:

ПолеОписание
runnerOnlineЕсть ли heartbeat от portal-cli update-runner
licenseOkДействует ли лицензия
channel, platformКанал/платформа установки
entitleUrlURL entitle API на korport.ru
latestJobПоследнее задание или null

Ставит задание в очередь. Требует: новая версия на korport.ru, действующая лицензия, Online update-runner. Ответ — объект задания.

Статус конкретного задания.

ПолеОписание
idUUID задания
statusqueued | running | succeeded | failed
phasequeuedentitledownloadapplyrestartdone (или failed)
fromVersion, toVersionИсходная и целевая версии релиза
channel, platformКанал/платформа установки
messageТекущий статус или текст ошибки
createdAt, startedAt, completedAtМетки времени

Сценарий для администратора: Обновление из админки.

Публичный entitle API вендора: POST https://korport.ru/api/portal/updates/entitle (тело: licenseKey, installBinding, channel, platform, currentVersion) → одноразовый downloadUrl.

В админке: Настройки → Продукт и лицензия — версия сборки, статус лицензии, привязка инсталляции, entitlement платных модулей (modules в ключе), активация LICENSE.key без терминала.

Версия продукта и полный статус лицензии (product, license).

Только статус лицензии (LicenseStatusDto).

ПолеОписание
modetrial, licensed, expired, invalid
validРазрешена ли запись в API
expiresAt, daysRemainingСрок действия ключа
installId, installBindingИдентификатор инсталляции и SHA256-привязка для вендора
channel, platformКанал и платформа в ключе
installedChannel, installedPlatformФактическая установка (install.mode, install.platform)
modulesEntitlement платных модулей (korport.helpdesk.*, * и т.д.); при licensed без поля в ключе — пустой массив

Активация лицензии из админки (альтернатива portal-cli license activate).

{ "licenseKey": "base64url(payload).base64url(signature)" }

Можно передать содержимое файла LICENSE.key (первая непустая строка без #).

Ответ (LicenseActivationResultDto):

ПолеОписание
licenseОбновлённый LicenseStatusDto (включая modules)
storagePathПуть, куда сохранён ключ (по умолчанию {PORTAL_DATA_DIR}/license.key)
messageПодсказка: API и установка модулей доступны сразу; Worker — после перезапуска Portal

Проверки: подпись Ed25519, срок, привязка install, канал/платформа. Ошибки валидации — 400 VALIDATION_ERROR.

После активации entitlement из поля modules сразу учитываются в GET /modules/catalog/status, POST /modules/install-template и установке с korport.ru (см. modules.md).

Список пользователей (local + domain).

ПараметрОписание
qПоиск по логину, имени, email
page, limitПагинация
isPortalAdminОпциональный фильтр: true — только администраторы портала, false — только без роли

В ответе у пользователя дополнительно: is_seed_admin — системная bootstrap-учётка (SEED_ADMIN_LOGIN, по умолчанию admin). Список не включает directory_attrs.

Карточка в UI: отдельная страница /users/{id} (не вкладка списка).

Полная карточка пользователя:

ПолеОписание
поля спискаlogin, display_name, email, флаги, даты
external_idSID / внешний id (для domain)
updated_atПоследнее обновление записи
directory_attrsОбъект доп. атрибутов AD (key → строка)
attribute_schemaЭффективная схема полей sync (key, ldapAttr, label, isCoreColumn, isBuiltin) для подписей в UI

Создать локального пользователя:

{
"login": "user1",
"password": "secret123",
"displayName": "Иван Иванов",
"email": "ivan@company.local",
"isPortalAdmin": false
}
{
"displayName": "Новое имя",
"email": "new@mail.local",
"isActive": true,
"isPortalAdmin": false
}

Снятие isPortalAdmin отклоняется (400 VALIDATION_ERROR), если:

  • роль снимают с себя;
  • учётка — bootstrap (SEED_ADMIN_LOGIN);
  • это последний администратор портала.

Только для auth_source: local:

{ "password": "new_secret" }

Узел Админка портала → вкладки Пользователи, Группы, Настройки, Службы, Задания. Руководства: Администрирование, Службы.

Группы доступа: вкладка Группы в админке (список); страницы /groups, /groups/new, /groups/{uuid}, /groups/{uuid}/edit. Подробнее: Группы доступа.

Узлы: вкладка Узлы в админке (список); создание и редактирование — /nodes/new (опционально ?parentId=), /nodes/{uuid}/edit.

LDAP / AD: Службы → Синхронизация AD → Настройки (/services/ad-sync) — подключение, статус, параметры синхронизации и поля профиля. См. ad-sync.

Резервное копирование: Службы → Резервное копирование → Настройки (/services/portal-backup) — аккордеоны «Резервное копирование» и «Восстановление». Восстановление: POST /api/v1/admin/backups/{id}/restore (очередь backup-runner); список копий: GET /api/v1/admin/backups/restorable. Подробнее: Бэкап.

Версия релиза: Настройки → Продукт и лицензия — версия из RELEASE, кнопки Проверить обновления и Обновить (при Online update-runner).

Portal Office: в том же разделе — установленная версия редактора, кнопка Проверить версию Office, ссылка на скачивание пакета (Native обновляет Office отдельно).

Лицензия: Настройки → Продукт и лицензия — статус, привязка, entitlement модулей, загрузка LICENSE.key или вставка ключа, кнопка Активировать лицензию.

Синхронизация AD: Службы → Синхронизация AD — включить, ⋮ → Расписание, Запустить (без confirm); настройки — /services/ad-sync. Результат во вкладке Задания.

Журнал заданий: вкладка Задания — срок хранения (по умолчанию 30 дней). Служба jobs-cleanup по расписанию удаляет завершённые записи старше срока (GET/PUT /api/v1/jobs/settings/retention).

Служба ad-sync недоступна для включения, пока LDAP не настроен и не проходит проверку подключения. Действия в таблице Служб — меню ; у названия — справка ?.