Перейти к содержанию

Планировщик задач

Модуль на главной странице ставит shell-скрипты проектов в очередь на запуск в заданное время:

  • одноразовые задачи — через системную утилиту at;
  • регулярные задачи — через системный crontab.

Откуда берутся задачи

Планировщик читает переменную SCRIPTS_PROJECT_PATHS из .env — список каталогов проектов со скриптами через запятую (~ разворачивается в $HOME):

SCRIPTS_PROJECT_PATHS=<project-a-directory>,<project-b-directory>

В .env каждого такого проекта задаётся словарь SCHEDULER_TASKS:

SCHEDULER_TASKS='{"send-report": {"name": "Ежедневный отчёт", "script": "send_report.sh"}}'

В интерфейсе и API задача адресуется ключом <проект>:<ключ> — имя проекта (каталога) приводится к нижнему регистру, например armory:send-report.

Удалённые серверы (прод, Docker)

На проде ARMory работает в Docker и сам ничего не выполняет: задачи ставятся на целевые серверы по SSH, где их исполняет локальный at. Это позволяет запускать скрипты в родном окружении каждого сервера, а очередь переживает редеплой контейнера.

Настройка:

  1. Установите at и cron на каждый сервер со скриптами (apt install at cron), убедитесь, что демоны atd и cron запущены.
  2. Сгенерируйте выделенный ключ в выбранном безопасном каталоге. Публичную часть добавьте в <remote-user-home>/.ssh/authorized_keys на каждом целевом сервере.
  3. Заполните .env:
# Пути к проектам — как они выглядят на целевых серверах
SCRIPTS_PROJECT_PATHS=<project-a-directory>,<project-b-directory>
# Привязка проектов к серверам (проект — имя каталога)
SCRIPTS_PROJECT_SSH=project-a=<ssh-user>@<server-a>,project-b=<ssh-user>@<server-b>
# Ключ: путь внутри контейнера и путь на хосте (монтируется в compose.yml)
SCHEDULER_SSH_KEY=<container-ssh-key-path>
SCHEDULER_SSH_KEY_HOST=<host-ssh-key-path>

Проекты без записи в SCRIPTS_PROJECT_SSH выполняются локально — режим разработки не меняется. Время выполнения трактуется в локальной таймзоне целевого сервера.

Планирование

Одноразовые задачи (at)

Во вкладке «Планировщик» выберите задачу, переключатель «Одноразово» и дату/время — скрипт будет поставлен в очередь at. Скрипт запускается из каталога своего проекта, поэтому относительные пути внутри него работают.

POST /api/scheduler/schedule с schedule_type: "once" дополнительно принимает массив args — аргументы добавляются к команде запуска скрипта:

{
  "project": "armory:send-report",
  "schedule_type": "once",
  "datetime": "2026-07-20T09:00",
  "args": ["--mode", "full"]
}

Регулярные задачи (cron)

Переключите тип на «Регулярно» и укажите выражение cron в формате из 5 полей (минута час день месяц день_недели). Скрипт будет добавлен в системный crontab целевого сервера с маркером # armory-cron-job:<uuid>, поэтому ARMory может впоследствии показывать и удалять только свои задачи.

{
  "project": "armory:todo-telegram",
  "schedule_type": "recurring",
  "cron": "0 9 * * 1",
  "args": []
}

На удалённых серверах crontab должен быть установлен (apt install cron) и демон cron запущен.

Очередь at

  • Список запланированных задач — GET /api/scheduler/atq (вывод atq со всех задействованных серверов; каждая строка снабжена префиксом [сервер] или [local]).
  • Удаление из очереди — POST /api/scheduler/remove-task с task_id: просто ID для локальной очереди или <сервер>:<ID> для удалённой (выполняется atrm).

Регулярные задачи

  • Список регулярных задач — GET /api/scheduler/cron. Каждая задача содержит job_id, cron, command и target.
  • Добавление — POST /api/scheduler/cron:
{
  "project": "armory:todo-telegram",
  "cron": "0 9 * * 1",
  "args": []
}
  • Удаление — POST /api/scheduler/remove-cron с job_id.

Telegram-список задач

В ToDo-списке кнопка «Сохранить для Telegram» сохраняет конфигурацию рассылки и открывает планировщик для задачи armory:todo-telegram. Таким образом отправку списка задач в Telegram можно запланировать однократно или регулярно.

API

GET  /api/scheduler/tasks
POST /api/scheduler/schedule
GET  /api/scheduler/atq
POST /api/scheduler/remove-task
GET  /api/scheduler/cron
POST /api/scheduler/cron
POST /api/scheduler/remove-cron

Календарь

Календарь доступен отдельно и показывает задачи, дедлайны и события по месяцам. Подробнее в calendar.md.