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

Службы

Эта страница — каталог фоновых служб портала. Службы делают работу «за кадром»: отправляют почту, синхронизируют AD, чистят корзину, строят поисковый индекс, делают бэкапы.

Откройте: Админка → Службы.

Читайте сверху вниз для общего понимания или перейдите к нужной службе по оглавлению в сводке ниже.
Для разработчиков расширений дополнительно: Service Framework, Hot deploy.


ПонятиеПростыми словами
СлужбаИменованная фоновая функция портала (строка в таблице Службы)
Включена / выключенаТумблер: выключенная служба не выполняет задания
Расписание (cron)Автозапуск по времени (например, каждую ночь в 03:00)
ЗапуститьРучной одноразовый запуск из меню
Задание (job)Единица работы в очереди; её выполняет процесс Portal.Worker
backup-runnerОтдельный процесс только для резервных копий (не обычный Worker)

Схема:

Событие в портале → Event Receivers → очередь portal_jobs → Worker
Расписание (cron) → portal_jobs (или portal_backups) → Worker / backup-runner

Важно: если служба выключена, Worker не выполняет её задания: они завершаются без ошибки (пропуск) и не попадают в журнал ошибок. Новые задания по cron для неё тоже не ставятся. Если ключа службы в реестре нет — задание падает со статусом failed: «Служба не найдена».


  1. Войдите как администратор.
  2. Админка → Службы.
  3. Увидите таблицу со всеми встроенными службами: название, статус, расписание, время последнего запуска.

У каждой строки справа — меню . В зависимости от службы там могут быть:

ПунктЧто делает
Включить / ВыключитьТумблер службы
Запустить / Полный обходРучной запуск (где есть)
Очистить индексТолько у поискового индекса
⚙ НастройкиОтдельная страница настроек
РасписаниеМодальное окно с временем автозапуска
  1. ⋮ → Расписание — откроется модальное окно (строка таблицы не раскрывается).
  2. Включите автозапуск и задайте время в понятном виде.
  3. Сохраните — в системе сохранится cronExpression и флаг cronEnabled.

В колонке расписания текст виден и при выключенном cron: рядом будет пометка (выкл).

Пример в БД/API: 0 3 * * * — каждый день в 03:00.

Worker перечитывает расписание из БД примерно раз в минуту (CRON_RELOAD_INTERVAL_MS, по умолчанию 60000).

ЭлементЧто увидеть
? у названияКраткая справка (popover) со ссылкой на этот каталог
Колонка ПоследнийВремя последнего запуска из журнала или по cron
Runner onlineНе в таблице Служб — только на странице бэкапа и в Обзор → Обслуживание

Состояние индекса и корзины: Админка → Обзор → Обслуживание.
Срок хранения журнала заданий: Админка → Задания.


После установки (если расписание ещё не меняли):

СлужбаКогдаВкл. по умолчанию
Резервное копирование (portal-backup)02:00расписание выкл (нужны путь и runner)
Поисковый индекс (search-crawler)03:00да
Экспорт списков — очистка файлов (list-export)03:00да (в БД; в UI пункта «Расписание» нет)
Экспорт опросов — очистка файлов (survey-export)03:00да (в БД; в UI пункта «Расписание» нет)
Корзина (recycle-bin)04:00да
Журнал заданий (jobs-cleanup)05:00да
Очистка чата (chat-cleanup)03:00да
КЭДО (kedo)09:00да (напоминания о сроке подписания)
Отпуска (модуль)Timer Job korport.vacations.maintenanceда (см. Планирование отпусков)

Порядок как в таблице Службы.

#КлючНазваниеВкл.*Расписание в UIРучной запускНастройки
1auditАудитданетнет
2notificationsУведомлениянетнетда (тест e-mail)SMTP в Настройки
3ad-syncСинхронизация ADнетдада/services/ad-sync
4search-crawlerПоисковый индексда + cronдада (полный обход)
5recycle-binКорзинада + cronдада
6event-extensionsEvent Receiversданетнетвкладка Event Receivers
7timer-extensionsTimer Jobsданет**нетвкладка Timer Jobs
8list-exportЭкспорт списковданет***нет
9survey-exportЭкспорт опросовданет***нет
10portal-backupРезервное копированиедаданет****/services/portal-backup
11jobs-cleanupЖурнал заданийда + cronдадаretention на Задания
12chat-cleanupОчистка чатада + cronдада/services/chat-cleanup
13kedoКЭДОда + cronдада/kedo/settings

* Ориентир для новой установки; фактические флаги смотрите в таблице Службы.
** Расписание задаётся у экземпляров Timer Job, не у строки службы.
*** Cron purge в БД есть; пункта «Расписание» в меню нет.
**** Копия / проверка / восстановление — со страницы настроек, не через «Запустить».


Ключ: audit
В UI: «Журналирование событий портала».

Служба пишет важные действия пользователей в журнал аудита. Сама по себе она «не бегает по ночам» — записи появляются, когда срабатывают подписчики Event Receivers.

Журнал смотрите на Админка → Обзор.

  • Служба включена.
  • Расписания нет, кнопки «Запустить» в UI нет.
Тип заданияКогда
audit.logEventEvent Receiver среагировал на событие (чаще всего создание / изменение / удаление элемента списка)

Подписчики: Админка → Event Receivers.

Новые записи аудита через этот канал перестанут появляться. Старый журнал и экран обзора останутся.


Ключ: notifications
В UI: «Отправка почты через SMTP».

Это шлюз исходящей почты портала. Пока служба выключена, портал не шлёт письма (ни по событиям, ни по API, ни тестовой кнопкой из Служб).

  • Служба выключена.
  • Расписания нет — письма уходят по событиям и запросам.
  1. Откройте Админка → Настройки → SMTP / Почта.
  2. Укажите host, порт, From, при необходимости логин и пароль.
  3. Сохраните. При наличии кнопки теста SMTP — проверьте сервер (тест не требует включённой службы).
  4. Откройте Админка → Службы.
  5. У строки Уведомления⋮ → Включить.
  6. Проверка реальной отправки: ⋮ → Запустить → введите e-mail → должно прийти тестовое письмо.

Настройки SMTP хранятся в конфиге службы notifications. Если в UI пусто — могут подставляться переменные SMTP_* из окружения сервера.

ИсточникЧто происходит
Event Receiver notifications.sendEventEmailНа событие ставится задание → Worker шлёт письмо по шаблону
API POST /api/v1/mail/sendВ очередь или сразу (сразу — только admin)
⋮ → ЗапуститьPrompt e-mail → тестовое письмо
  • Тест из и /mail/send — ошибка.
  • Задания уведомлений падают.
  • Настройки SMTP и тест SMTP в Настройках остаются.

Не путать с пакетными обработчиками модулей (у них свой serviceKey) и со службой event-extensions.


Ключ: ad-sync
В UI: «Импорт и обновление доменных пользователей и групп из LDAP/AD».

Служба забирает пользователей (и при желании группы) из Active Directory / LDAP в Portal: создаёт и обновляет учётки auth_source=domain, поля профиля, состав групп.

Без настроенного LDAP строка в таблице недоступна — нельзя включить, запустить или задать расписание.

  • Служба выключена, cron выкл.
  1. Службы → Синхронизация AD → ⚙ Настройки (адрес /services/ad-sync).
  2. Откройте аккордеон Подключение:
    • URL каталога, Base DN, Bind DN и пароль;
    • фильтры входа/поиска, атрибут логина;
    • дождитесь badge статуса подключения.
  3. Откройте Настройка синхронизации:
    • фильтры и лимиты пользователей / групп;
    • поля профиля — чекбоксы (givenName, sn, department, …) или «Выбрать все»;
    • дополнительные поля — ручной маппинг (например отчество → middleName);
    • флаги групп и деактивации (у каждого значок с подсказкой).
  4. Сохраните.
  5. На вкладке Службы⋮ → Включить.
  6. При необходимости ⋮ → Расписание или ⋮ → Запустить (без лишнего confirm; результат — тост / вкладка Задания).

Карточка пользователя с импортированными полями: Админка → Пользователи/users/{id}.

Разделы UI Группы и Пользователи — разные настройки.

Флаг в UIConfigСмысл
Синхронизировать группы ADsyncGroupsИмпорт групп и участников. Выкл — только пользователи
Удалять участников, которых нет в AD-группеremoveMissingGroupMembersУбрать из группы Portal; учётки не трогает
Удалять группы Portal, пропавшие из ADremoveMissingGroupsУдалить ранее импортированные группы вне фильтра; локальные группы не трогает
Деактивировать пользователей, отсутствующих в ADcronDeactivateMissingis_active=false для domain-пользователей вне выборки; работает и при ручном запуске, и по cron. Не про состав групп

Отчества в стандартном каталоге AD/Portal часто нет — добавьте в «Дополнительные поля».

Вложенные AD-группы не разворачиваются — только прямые member.

Тип задания: adSync.run. В ответе — счётчики users / groups (synced, created, updated, …).

Cron и ручной запуск недоступны. Уже импортированные пользователи и группы остаются. Вход через AD (если настроен отдельно) от этой службы не обязательно зависит.


Ключ: search-crawler
В UI: «Полная переиндексация (сверка). Повседневные изменения индексируются сразу при сохранении».

  • Обычные правки (страницы, списки, документы) попадают в поиск сразу при сохранении — без этой службы.
  • Служба нужна для полного ночного обхода или после кнопки «Очистить индекс».
  • Включена, cron ежедневно в 03:00 (0 3 * * *).
ДействиеКак
Вкл/выкл
Расписание⋮ → Расписание
Полный обход⋮ → Запустить («Полный обход»)
Очистить индекскнопка у службы или POST /admin/search/clear (без постановки crawl)
СтатусОбзор → Обслуживание

Тип задания: searchCrawler.run.

Списки и библиотеки с выключенным «Участвует в поиске» в индекс не попадают.

Полный обход и его cron падают. Инкрементальная индексация при сохранении обычно продолжает работать.


Ключ: recycle-bin
В UI: «Автоочистка корзины удалённых элементов узлов (старше 30 дней)».

Служба окончательно удаляет из корзины объекты старше 30 дней. Срок зашит в код (RetentionDays) и не редактируется в настройках службы.

Мягкое удаление и экран корзины узла работают независимо от тумблера — служба отвечает только за автоочистку.

Типы объектов: элемент списка, страница, файл библиотеки, список, библиотека и др.

  • Включена, cron ежедневно в 04:00.
ДействиеКак
Вкл/выкл
Расписание⋮ → Расписание
Немедленная очистка⋮ → Запустить
СчётчикОбзор → Обслуживание

Тип задания: recycleBin.purgeExpired.

Автоочистка и ручной purge через службу останавливаются; объекты могут лежать в корзине дольше 30 дней.


Ключ: event-extensions
В UI: «Пользовательские обработчики событий из пакетов .portalevent».

Это рубильник для пакетных обработчиков событий. Сама служба не ходит по cron: при событии ставится задание, Worker загружает DLL пакета и вызывает обработчик.

Рекомендуемый serviceKey в манифесте пакета: "event-extensions". Если указать другой ключ — в реестре служб должна быть включённая строка с этим ключом, иначе задания упадут. Платформа сама не создаёт произвольные ключи (кроме upsert event-extensions при install).

  • Включена.
  • Расписания и ручного запуска у строки нет.

Админка → Event Receivers — пакеты и привязки к спискам/событиям.

Пакетные ER с service_key=event-extensions не выполняются. Встроенные audit и notifications живут на своих ключах и этим тумблером не гасятся.


Ключ: timer-extensions
В UI: «Пользовательские задания по расписанию из пакетов .portaltimer».

Рубильник для пакетных заданий по расписанию. Время запуска задаётся у каждого экземпляра на вкладке Timer Jobs, а не у строки службы в списке Служб.

Рекомендуемый serviceKey в манифесте: "timer-extensions".

  • Включена.
  • У строки службы cron/run в UI нет.

Админка → Timer Jobs — экземпляры, расписание, ручной запуск экземпляра.

Пакетные timer-jobs с этим ключом не ставятся и не выполняются.


Ключ: list-export
В UI: «Фоновый экспорт элементов списка в XLSX через worker».

  1. Пользователь в списке нажимает экспорт → Worker собирает файл XLSX (живёт 24 часа).
  2. Ночью служба удаляет просроченные файлы экспорта.
  • Включена.
  • В БД cron 0 3 * * * для purge; в UI меню пунктов «Расписание» и «Запустить» нет.
job_typeНазначение
listExport.runСобрать XLSX
listExport.purgeExpiredУдалить файлы старше 24 часов
ДействиеГде
Заказать экспортUI списка (не строка службы)
Вкл/выклСлужбы → ⋮ — при выкл. и export, и purge падают
Расписание purgeтолько через API/БД (PATCH /services/list-export)

Ключ: survey-export
В UI: «Фоновый экспорт результатов опросов в XLSX через worker».

  1. Автор опроса на странице Результаты нажимает Выгрузить в Excel → Worker собирает XLSX (листы Сводка и Ответы, живёт 24 часа).
  2. Ночью служба удаляет просроченные файлы экспорта.
  3. Для анонимного опроса в файле нет ФИО респондентов.
  • Включена.
  • В БД cron 0 3 * * * для purge; в UI меню пунктов «Расписание» и «Запустить» нет.
job_typeНазначение
surveyExport.runСобрать XLSX
surveyExport.purgeExpiredУдалить файлы старше 24 часов
ДействиеГде
Заказать экспортСтраница Результаты опроса на узле (не строка службы)
Вкл/выклСлужбы → ⋮ — при выкл. и export, и purge падают
Расписание purgeтолько через API/БД (PATCH /services/survey-export)

См. также Опросы.


12. portal-backup — Резервное копирование {#portal-backup}

Заголовок раздела «12. portal-backup — Резервное копирование {#portal-backup}»

Ключ: portal-backup
В UI: «Архивы PostgreSQL + S3 + portal_data в каталог на хосте».

Строка службы разрешает очередь и расписание в портале. Сама архив не пишет — это делает отдельный backup-runner.

В архиве обычно: PostgreSQL, файлы (S3), данные установки (portal_data). Подробная инструкция: Резервное копирование и восстановление.

Очередь — portal_backups (не portal_jobs): виды validate, backup, restore.

  • Служба включена.
  • Предложен cron 0 2 * * *, но автозапуск выкл, пока не настроены путь и проверка.
  1. Поднимите backup-runner и смонтируйте каталог (PORTAL_BACKUP_HOST_DIR / PORTAL_BACKUP_MOUNT_PATH для Docker).
  2. Откройте Службы → Резервное копирование → ⚙ Настройки (/services/portal-backup).
  3. Аккордеон Резервное копирование: путь (в Docker — ровно mount path), retention, Проверить запись, создание копии, журнал, бейдж Runner online.
  4. Аккордеон Восстановление: выбор копии из restorable, подтверждение, очередь restore.
  5. Расписание: на вкладке Службы⋮ → Расписание (после успешного validate и online runner).

Включение cron требует: служба вкл, путь проверен (lastValidatedOk), runner online.

У строки службы кнопки Запустить нет (POST …/run отвергается).

Новые задания бэкапа из портала не ставятся. Архивы на диске не удаляются. CLI portal-cli backup может работать отдельно от UI-очереди.


Ключ: jobs-cleanup
В UI: «Автоудаление записей журнала заданий старше срока хранения».

Чистит таблицу portal_jobs (историю заданий), а не бизнес-данные портала. Удаляет завершённые записи (completed / failed / dismissed) старше срока. Строки pending и running не трогает.

  • Включена, cron в 05:00.
  • Срок хранения: 30 дней (допустимо 1…3650).
ДействиеКак
Вкл/выкл, расписание, ручной purgeСлужбы → ⋮
Срок храненияАдминка → Задания → retention

Тип задания: jobs.purgeOlder.

Журнал перестанет автоматически сокращаться; ручной purge через службу тоже недоступен.


Ключ: chat-cleanup
В UI: «Ночное удаление старых сообщений и вложений корпоративного чата».

По расписанию (или вручную) удаляет старые сообщения и файлы в Portal.Chat. Имеет смысл только если установлен модуль чата и PORTAL_CHAT_ENABLED=true.

Установка runtime и модуля: Корпоративный чат.

  • Включена, cron в 03:00.
  • Сообщения: 365 дней, вложения: 180 дней (0 = не удалять).

Владельцы групповых чатов могут задавать свои сроки в UI чата; глобальные — в настройках службы.

  1. Службы → Очистка чата → ⚙ Настройки (/services/chat-cleanup) — задайте сроки.
  2. ⋮ → Включить (если выкл).
  3. ⋮ → Расписание и/или ⋮ → Запустить.

Тип задания: chat.purgeOlder (через PORTAL_CHAT_INTERNAL_URL).

Автоочистка и ручной purge останавливаются; данные чата накапливаются.


С версии korport.kedo 2.0 напоминания — Timer Job korport.kedo.reminders внутри модуля (списки Portal). Встроенная служба kedo / job kedo.remindPending отключена миграцией и не регистрируется в BuiltinServices.

UI: /kedo/pages/home. Platform SDK: KedoCryptoService + KedoPackageAdapter, job kedo.createIntegrationPackage (отпуска и др.). Доменные SQL-таблицы КЭДО сняты миграцией 083; в SQL остаются только crypto (kedo_ca, kedo_certificates, kedo_key_blobs).

См. КЭДО.


С версии korport.vacations 2.0 обслуживание отпусков — Timer Job korport.vacations.maintenance и Event Receiver korport.vacations.workflow внутри модуля (списки Portal). Встроенной службы vacations / job vacations.maintenance больше нет.

См. Планирование отпусков.


Встроенные службы из таблицы выше — фиксированный набор платформы.

Пакеты .portalevent / .portaltimer и модули обычно используют serviceKey: "event-extensions" или "timer-extensions".

Если в манифесте указан свой ключ (например korport.helpdesk.ticket-notifications):

  • подписчик/job ссылается на этот ключ;
  • при установке пакета, подписчика и модуля в portal_services появляется включённая строка с тем же ключом (её можно выключить в Админка → Службы);
  • повторная установка той же версии модуля тоже проверяет, что строка есть.

Управление пакетами: вкладки Event Receivers и Timer Jobs.


КомпонентНазначение
portal_servicesРеестр служб
portal_jobsОчередь большинства служб
portal_backupsОчередь validate / backup / restore
event_receiversПодписчики на события
WorkerОпрос очереди, cron, hot-load пакетов
backup-runnerОтдельный процесс для бэкапов
МетодПутьОписание
GET/admin/dashboardОбзор
POST/admin/search/clearОчистить поисковый индекс
GET/servicesСписок служб
PATCH/services/{key}Вкл/выкл, cron, config
POST/services/{key}/runРучной запуск (где есть)
GET/jobsЖурнал заданий
POST/jobs/{id}/retryПовторить задание
GET/PUT/jobs/settings/retentionСрок журнала
GET/POST/PATCH/DELETE/event-receiversПодписчики
ПолеОписание
cron_enabledВключить автозапуск
cron_expressionCron (5 полей)
cron_job_typeТип задания (в UI не редактируется)
cron_last_run_atПоследний запуск по расписанию
  • WORKER_POLL_INTERVAL_MS — опрос очереди (по умолчанию 5000)
  • WORKER_BATCH_SIZE — размер пакета (по умолчанию 10)
  • CRON_RELOAD_INTERVAL_MS — перезагрузка расписания (по умолчанию 60000)

Для почты и бэкапа см. также SMTP_*, PORTAL_BACKUP_* в установке и backup-restore.

  1. Реализуйте обработчик в Worker (IJobHandler) или пакет .portalevent / .portaltimer.
  2. Для платформы — регистрация в BuiltinServices / JobProcessor.
  3. Для пакета — манифест + install; подписчик или Timer Job через админку / API / module.json.

См. Job-модули, SDK Event Receiver, SDK Timer Job.