AITM позволяет запускать собственные периодические скрипты обслуживания и автоматизации прямо внутри работающего экземпляра — без пересборки образа Docker и повторного развёртывания, достаточно перезапустить контейнер.
User Jobs (запланированные задания плагинов)
Где находится папка плагинов
Каждая сборка релиза AITM (полный, онлайн и облегчённый варианты Docker) содержит слой plugins-runtime/, встроенный в образ. Однако важна для пользователя та папка, которая находится на постоянном, смонтированном (bind-mount) томе данных: plugins внутри каталога данных — как правило, $AITM_DATA_DIR/plugins внутри работающего контейнера, а не путь внутри образа.
- При первой установке она пуста.
- При первом запуске точка входа контейнера заполняет её эталонным плагином
example-scheduled-job— но только если этого подкаталога ещё нет, поэтому собственные правки в этой папке сохраняются при обновлениях и перезапусках. - AITM заново сканирует каталог плагинов при каждом запуске контейнера — поэтому после добавления или изменения задания необходимо перезапустить контейнер, чтобы оно было подхвачено (пересборка не требуется).
Добавление собственного задания
- Создайте новый подкаталог в смонтированном пути
plugins/(один каталог на задание/плагин). - Добавьте в него файл
plugin.json, содержащий массивaitm.jobs. - Добавьте файл скрипта, на который указывает
handler.pathзадания. - Перезапустите контейнер AITM.
Структура plugin.json
| Поле | Описание |
|---|---|
name | Уникальный идентификатор задания. |
label | Читаемое название, отображаемое в интерфейсе. |
intervalMs | Как часто задание повторяется, в миллисекундах. |
priority | Приоритет планирования — см. примечание по безопасности ниже; значение "high" зарезервировано для собственных внутренних заданий AITM. |
timeoutMs | Максимальное время выполнения, по истечении которого задание завершается. |
onTimeout | Что происходит при достижении тайм-аута. |
heavy | Помечает задание как ресурсоёмкое. |
parallel | Может ли оно выполняться одновременно с другими заданиями. |
concurrencyGroup | Группа, внутри которой задания никогда не выполняются одновременно. |
after | Задания, которые должны завершиться до запуска этого. |
next | Задание, запускаемое после успешного завершения этого. |
minFreeRamMb / minFreeCpuPercent | Минимум свободных ресурсов, необходимый для запуска. |
kind | 'in-process' | 'child-process' | 'remote' — способ выполнения задания. |
allowedModes | Режимы сервера, в которых заданию разрешено выполняться. |
handler | { type: 'script', path, args, env } — что запускается и как. |
Рабочий пример
Иллюстративная структура, соответствующая поставляемому example-scheduled-job:
{
"aitm": {
"jobs": [
{
"name": "example-scheduled-job",
"label": "Example Scheduled Job",
"intervalMs": 3600000,
"priority": "normal",
"timeoutMs": 60000,
"kind": "child-process",
"handler": {
"type": "script",
"path": "./run.js",
"args": [],
"env": {}
}
}
]
}
}
Настройка задания без повторного развёртывания
Оператор может переопределить интервал, приоритет или состояние включённости работающего задания через REST без перезапуска контейнера и повторного развёртывания:
GET /api/scheduler/jobs/:name/overridePUT /api/scheduler/jobs/:name/override
Безопасность: никогда не используйте приоритет "high"
Задание, написанное пользователем, никогда не должно задавать priority: "high" — этот уровень приоритета зарезервирован для собственных внутренних заданий планировщика AITM, и его использование в пользовательском задании не поддерживается.
Полный технический справочник (внутреннее устройство схемы манифеста заданий, семантика kind/allowedModes, механика тайм-аутов и повторных попыток) содержится в собственной документации AITM.