Планировщик задач
Модуль на главной странице ставит shell-скрипты проектов в очередь на запуск в заданное время:
- одноразовые задачи — через системную утилиту
at; - регулярные задачи — через системный
crontab.
Откуда берутся задачи
Планировщик читает переменную SCRIPTS_PROJECT_PATHS из .env — список каталогов проектов со скриптами через запятую (~ разворачивается в $HOME):
В .env каждого такого проекта задаётся словарь SCHEDULER_TASKS:
В интерфейсе и API задача адресуется ключом <проект>:<ключ> — имя проекта (каталога) приводится к нижнему регистру, например armory:send-report.
Удалённые серверы (прод, Docker)
На проде ARMory работает в Docker и сам ничего не выполняет: задачи ставятся на целевые серверы по SSH, где их исполняет локальный at. Это позволяет запускать скрипты в родном окружении каждого сервера, а очередь переживает редеплой контейнера.
Настройка:
- Установите
atиcronна каждый сервер со скриптами (apt install at cron), убедитесь, что демоныatdиcronзапущены. - Сгенерируйте выделенный ключ в выбранном безопасном каталоге. Публичную часть добавьте в
<remote-user-home>/.ssh/authorized_keysна каждом целевом сервере. - Заполните
.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:
- Удаление —
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.