n8n: графици и cron със Schedule Trigger
Задачи, които се пускат сами: сутрешен бриф, седмичен отчет, проверка на всеки 15 минути. Научаваш как да кажеш на n8n „кога“, как да не те изненада часовата зона и какво става с пуснатите задачи, когато системата е била изключена.
01Какво ще научиш
- Как да настроиш Schedule Trigger — по интервал или по cron израз.
- Как се чете cron израз и как да го проверяваш, преди да му се довериш.
- Коя часова зона важи и как да я зададеш за целия n8n или за един процес.
- Какво става с пуснатите задачи, когато n8n е изключен или рестартиран.
- Как да пускаш задача само в работни дни и да прескачаш празниците.
- Как да построиш сутрешен бриф, който се изпраща сам.
02Преди да започнеш
- Работещ n8n 2.x 🔒 локално от Обучение 1 — със
TZиGENERIC_TIMEZONE=Europe/Sofiaв compose файла. - Знаеш какво е тригер и как се изпълнява процес (Обучение 1).
- За брифа по-долу: достъп до Postgres, настроен имейл изпращач (SMTP) и локален модел през Ollama — ако нямаш нещо от тях, строи само графика и работните дни.
03Стъпки
-
Интервалите на Schedule Trigger
Добави нод Schedule Trigger. В Trigger Rules избираш единица за интервал; останалите полета зависят от нея. В един нод може да има няколко правила, всяко със свой график.
Интервал Полета Пример (от документацията) Seconds Seconds Between Triggers 30 → на всеки 30 секунди Minutes Minutes Between Triggers 5 → на всеки 5 минути Hours Hours Between Triggers · Trigger at Minute 6 и минута 30 → на всеки 6 часа, в 30-а минута Days Days Between Triggers · Trigger at Hour · Trigger at Minute 2 дни, 9 ч, минута 15 → през ден в 9:15 Weeks Weeks Between Triggers · Trigger on Weekdays · час · минута 2 седмици, понеделник, 15:30 Months Months Between Triggers · Trigger at Day of Month · час · минута 3 месеца, ден 28, 9:00 → на тримесечие Custom (Cron) Expression пълен cron израз — следващата стъпка ⚠️Ден 29–31 при „Months“Ако месецът няма избрания ден, нодът не се задейства. Например ден 30 прескача февруари. За „последен ден от месеца“ този интервал не върши работа. -
Cron изразът — шест полета
Cron е кратък запис на график. n8n очаква секунди, минути, час, ден от месеца, месец, ден от седмицата. Секундите са по желание: документацията казва, че нодът работи и без тях, т.е. и петполеен израз се приема.
cron · полета# секунди минути час ден_от_месеца месец ден_от_седмицата # 0-59 0-59 0-23 1-31 1-12 Нд-Сб (0 = неделя, 1 = понеделник) # # * всяка стойност , списък (9,14,18) # - диапазон (1-5) / стъпка (*/15 = на всеки 15) 0 30 7 * * 1-5Как се чете последният ред: секунда 0, минута 30, час 7, всеки ден от месеца, всеки месец, дни 1–5 (понеделник–петък) → 07:30 в работни дни.
⚠️Непотвърдено в документациятаДокументацията показва дните като „Sun–Sat“. Дали 7 също означава неделя и дали се приемат имена (MON,JAN) не е написано — затова използвай числа, а за неделя0.✅Променливи в изразаАко вкараш променлива в cron израза, стойността ѝ се чете само при публикуване. Смениш ли я после, графикът не се променя — спри публикуването и публикувай наново. -
Примерите — със следващите пускания
Всеки израз по-долу е изчислен с начало 01.10.2026, 12:00 във Варна. Така виждаш не само какво „значи“, а кога реално ще се пусне.
Израз (6 полета) Значение Следващи пускания (изчислени) 0 0 7 * * *Всеки ден в 07:00 пт 02.10, сб 03.10, нд 04.10 — в 07:00 0 30 8 * * 1-5Пн–Пт в 08:30 пт 02.10, пн 05.10, вт 06.10 — в 08:30 (уикендът е прескочен) 0 0 9 * * 1Всеки понеделник в 09:00 05.10, 12.10, 19.10, 26.10 — в 09:00 0 0 6 1 * *1-во число на месеца в 06:00 нд 01.11, вт 01.12, пт 01.01.2027 — в 06:00 0 */15 * * * *На всеки 15 минути 01.10 в 12:15, 12:30, 12:45 0 0 9,14,18 * * 1-5Работни дни в 09:00, 14:00, 18:00 01.10 в 14:00 и 18:00; пт 02.10 в 09:00, 14:00, 18:00 0 0 23 * * *Всяка вечер в 23:00 01.10, 02.10, 03.10 — в 23:00 0 0 0 * * 0Всяка неделя в полунощ нд 04.10, 11.10, 18.10, 25.10 — в 00:00 0 0 8 1,15 * *1-во и 15-о число в 08:00 чт 15.10, нд 01.11, нд 15.11 — в 08:00 0 30 7 * * 1-5Брифът по-долу: Пн–Пт в 07:30 пт 02.10, пн 05.10, вт 06.10 — в 07:30 💡Как да проверяваш свои изразиПолзвай crontab.guru, но махни колоната за секунди — там форматът е с пет полета (така съветва и документацията на n8n). Ако нодът даде „Invalid cron expression“, виж дали не е вътре несъвместим синтаксис.🧩Документираните примери на n8n*/10 * * * * *— на всеки 10 секунди ·0 6 * * *— всеки ден в 6:00 ·0 9 * * 1-5— работни дни в 9:00 ·0 9-17 * * *— всеки час от 9 до 17 ·0 0 1 1,4,7,10 *— тримесечие, 1-во число в полунощ. -
Часовата зона
Нодът ползва зоната така: 1. настройката Timezone на самия процес, ако е зададена; 2. иначе зоната на целия n8n (
GENERIC_TIMEZONE). Ако не си задал нищо, при самостоятелна инсталация еAmerica/New_York— а това е 6–7 часа след Варна, не „2–3 часа по-рано“.compose.yaml · environment (вече е в Обучение 1)TZ: Europe/Sofia GENERIC_TIMEZONE: Europe/SofiaЗа един процес: три точки горе вдясно → Settings → Timezone → Save. След смяна на променливите в compose файла рестартирай контейнера (
docker compose up -d).⚠️Лятно и зимно часово време във ВарнаПрез 2026 часовникът се премества напред на 29.03 (03:00 → 04:00) и назад на 25.10 (04:00 → 03:00). Изчислено: график „всеки ден в 07:30“ остава в 07:30 по местно време и преди, и след промяната. Часът 03:00–03:59 обаче в една нощ липсва, а в друга се повтаря — не слагай там важни задачи. Документацията на n8n казва, че „durable scheduler“ борави по-вярно с тези случаи при интервали час/ден/седмица/месец; как точно ги решава вътрешният график ⚠️ не е описано. -
Какво става с пропуснатите изпълнения
По подразбиране n8n държи графика в паметта. Ако е бил изключен или рестартиран в часа на задачата, тази задача се пропуска и не се навързва после. Това е нормално поведение, не грешка — затова за важни задачи мисли за запис „кога последно успях“.
От n8n 2.36 има избор — но само ако включиш „durable scheduler“ и само за Schedule Trigger нодове, добавени от тази версия нататък. В настройките на нода (Settings):
Настройка Какво прави If Execution Is Missed Don't Run Missed Executions (по подразбиране) — пропуснатото се изхвърля; Run the Most Recent Missed Execution — една наваксваща задача за последния пропуснат час; … Per Rule — по една за всяко правило Missed Execution Grace Period (Seconds) Колко късно може да започне задачата, за да не се брои за пропусната; 0 = настройката на системата (60 секунди по подразбиране) env · включване на durable scheduler (по желание)N8N_SCHEDULER_ENABLED=true N8N_USE_WORKFLOW_PUBLICATION_SERVICE=true⚠️Двете променливи вървят заедноБез втората n8n пише предупреждение и графиците остават в паметта. Функцията е изключена по подразбиране.💡Няколко главни екземпляраПри обикновения (в паметта) график в такава подредба задачите пуска само водещият екземпляр, а при смяна на водач часът може да се размести. С durable scheduler всяко пускане се прави веднъж между екземплярите. Отделните работници (queue mode) не сме сверявали.✅Промени на графикаСмяната на интервала действа едва след unpublish и публикуване на нова версия. Интервалите се броят от момента на публикуване: ако е било „на всеки час“ и в 11:30 публикуваш „на всеки 2 часа“, следващото пускане е в 13:30. -
Само в работни дни — Code и If
Schedule Trigger не знае официалните празници. Cron
1-5прескача уикенда, но не и 3 март. Затова след тригера сложи Code нод (Run Once for All Items), а след него — If с условие{{ $json.isWorkday }}е истина. Кодът ползва Luxon (DateTime) — така работи с часовата зона на n8n, за разлика от обикновенияDate().javascript · Code нодconst today = DateTime.now().setZone('Europe/Sofia'); // Официални празници 2026 (дати, в които не се работи). // Проверявай списъка всяка година по официалния акт. const holidays = [ '2026-01-01', // Нова година '2026-03-03', // Освобождението '2026-04-10', // Велики петък '2026-04-13', // Великденски понеделник '2026-05-01', // Ден на труда '2026-05-06', // Гергьовден '2026-09-22', // Независимостта '2026-12-24', // Бъдни вечер '2026-12-25', // Рождество // Празник в събота/неделя → първият работен ден след него е почивен // (Кодекс на труда, чл. 154, ал. 2; не важи за Великден): '2026-05-25', // за 24 май (неделя) '2026-09-07', // за 6 септември (неделя) '2026-12-28', // за 26 декември (събота) ]; // Самите 24.05, 06.09 и 26.12 падат в уикенд — хващат се с weekday. const dateStr = today.toFormat('yyyy-MM-dd'); const isWeekend = today.weekday >= 6; // 1 = понеделник, 7 = неделя const isHoliday = holidays.includes(dateStr); return [{ json: { isWorkday: !isWeekend && !isHoliday, dayName: today.weekdayLong, dateStr }}];⚠️Списъкът е за 2026 и не е пъленСверен е с публичен списък на официалните празници на България: Нова година, 3 март, Велики петък и Великден (петък до понеделник; през 2026 Великден е 12 април), 1 май, 6 май, 24 май, 6 септември, 22 септември и 24–26 декември. 1 ноември не е почивен ден и не е в списъка. Когато празник (без Великден) падне в събота или неделя, първият работен ден след него е почивен — чл. 154, ал. 2 от Кодекса на труда; затова в списъка са 25.05, 07.09 и 28.12.2026. Министерският съвет може да обяви и допълнителни неприсъствени дни (чл. 154, ал. 3) — добави ги ръчно от решението му. Списъкът важи само за 2026.Алтернатива без код: If нод със сравнение на дата (Date & Time) или Filter нод.
-
Практика: сутрешен бриф в 07:30
Верига от нодове; всяка стъпка се пробва отделно с Execute step.
Schedule Trigger — Custom (Cron):
0 30 7 * * 1-5. След него Code + If от предната стъпка.Postgres — незавършени задачи на собственика:
sql · примерна таблицаSELECT title, priority, deadline FROM tasks WHERE status = 'open' AND assigned_to = 'owner' ORDER BY priority DESC, deadline ASC LIMIT 10;Postgres — нови запитвания от снощи:
sqlSELECT COUNT(*) AS new_inquiries FROM inquiries WHERE received > NOW() - INTERVAL '16 hours';HTTP Request — курсът от Обучение 1. Лева вече не се публикуват, затова питаме за евро:
urlhttps://api.frankfurter.dev/v1/latest?base=USD&symbols=EURBasic LLM Chain с локален модел през Ollama (Обучение 3) — подкана:
подканаТи си личен асистент на собственика. Напиши кратък сутрешен бриф (3–4 изречения) на български, въз основа на: - Отворени задачи: {{ $('Postgres Tasks').all().map(t => t.json.title).join(', ') }} - Нови запитвания: {{ $('Postgres Inquiries').item.json.new_inquiries }} - Курс USD/EUR: {{ $('HTTP Request').item.json.rates.EUR }} Тон: делови, кратък, ориентиран към действие.Имената в
$('…')трябва да съвпадат с имената на нодовете ти (виж Обучение 1 за преименуване).Send Email (SMTP) — до твоя адрес. Тема:
КАГАМИ · бриф · {{ $now.toFormat('dd.MM.yyyy') }}, текст: изходът на модела.Запис в журнал — файловият нод иска двоични данни: първо Convert to File (Convert to Text File), после Read/Write Files from Disk → Write File to Disk, Append включено, път
/home/node/.n8n-files/daily_digest.log(разрешената папка — Обучение 1).
Натисни Execute Workflow и провери писмото и реда в журнала. Чак тогава публикувай процеса.
-
Чести проблеми
❌Задачата тръгва в грешен часПровери в този ред: зоната в настройките на процеса, послеGENERIC_TIMEZONEна n8n (рестартирай контейнера след промяна). Без нито едно от двете часът е нюйоркски.❌Не се пуска изобщоПроцесът не е публикуван (Publish). Ръчното „Execute Workflow“ не доказва, че графикът работи.❌Новият интервал не се прилагаСпри публикуването и публикувай нова версия. Същото важи за променлива в cron израза.❌Пуска се по-често от очакванотоВ един нод може да има няколко правила и всяко се задейства само — виж дали не се застъпват. Ако имаш и втори екземпляр на n8n със същия процес, проверявай и него. ⚠️ Други причини не сме проверявали в документацията.❌След рестарт липсва изпълнениеТака е по подразбиране: пропуснатото се хвърля. Виж стъпката за пропуснати изпълнения.
04Проверка
Чеклист
GENERIC_TIMEZONE(или Timezone на процеса) еEurope/Sofia.- Процесът е публикуван; промените в графика са приложени чрез спиране и ново публикуване.
- Cron изразът е проверен без колоната за секунди и следващите пускания съвпадат с очакваното.
- Важни задачи не са в 03:00–03:59 в нощите на смяна на часа.
- Знаеш, че рестартът пропуска задачи, и при нужда си включил durable scheduler.
- Списъкът с празници е сверен със сегашната година.
- Брифът е пробван ръчно, преди да разчиташ на графика.
Тест
1. Какво означава 0 30 7 * * 1-5?
2. Коя зона важи, ако нито процесът, нито GENERIC_TIMEZONE са настроени (самостоятелен n8n)?
3. Какво става по подразбиране със задача, чийто час е минал, докато n8n е бил рестартиран?
4. Променил си интервала на публикуван процес. Кога влиза в сила?
05Какво следва
06Източници
- n8n: Schedule Trigger — интервали, cron примери, шестото поле, опции за пропуснати изпълнения · чести проблеми.
- n8n: настройки на процеса — Timezone · часова зона и локал (
GENERIC_TIMEZONE). - n8n: durable scheduler — рестарти, пропуснати изпълнения, няколко екземпляра, смяна на часово време.
- n8n: дати и часове (Luxon) · Code · If · Send Email · Read/Write Files from Disk.
- crontab.guru 🌐 глобален — визуална проверка на изрази с пет полета.
- Frankfurter 🌐 глобален — API за курсове; лева вече не се публикуват.
- Официални празници в България 🌐 глобален — публичен списък; сверявай с официалния акт.