AITM позволяет запускать собственные периодические скрипты обслуживания и автоматизации прямо внутри работающего экземпляра — без пересборки образа Docker и повторного развёртывания, достаточно перезапустить контейнер.

User Jobs (запланированные задания плагинов)

Где находится папка плагинов

Каждая сборка релиза AITM (полный, онлайн и облегчённый варианты Docker) содержит слой plugins-runtime/, встроенный в образ. Однако важна для пользователя та папка, которая находится на постоянном, смонтированном (bind-mount) томе данных: plugins внутри каталога данных — как правило, $AITM_DATA_DIR/plugins внутри работающего контейнера, а не путь внутри образа.

  • При первой установке она пуста.
  • При первом запуске точка входа контейнера заполняет её эталонным плагином example-scheduled-job — но только если этого подкаталога ещё нет, поэтому собственные правки в этой папке сохраняются при обновлениях и перезапусках.
  • AITM заново сканирует каталог плагинов при каждом запуске контейнера — поэтому после добавления или изменения задания необходимо перезапустить контейнер, чтобы оно было подхвачено (пересборка не требуется).

Добавление собственного задания

  1. Создайте новый подкаталог в смонтированном пути plugins/ (один каталог на задание/плагин).
  2. Добавьте в него файл plugin.json, содержащий массив aitm.jobs.
  3. Добавьте файл скрипта, на который указывает handler.path задания.
  4. Перезапустите контейнер 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/override
  • PUT /api/scheduler/jobs/:name/override

Безопасность: никогда не используйте приоритет "high"

Задание, написанное пользователем, никогда не должно задавать priority: "high" — этот уровень приоритета зарезервирован для собственных внутренних заданий планировщика AITM, и его использование в пользовательском задании не поддерживается.

Полный технический справочник (внутреннее устройство схемы манифеста заданий, семантика kind/allowedModes, механика тайм-аутов и повторных попыток) содержится в собственной документации AITM.