Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
n8n-07 · Schedules and cron jobs
series
n8n · lesson 7 of 10
level
Beginner
duration
about 30 min
prerequisites
A running self-hosted n8n 2.x (lesson 1) with GENERIC_TIMEZONE set
trust_label
VERIFIED 2026-10-01 (against the official n8n docs: Schedule Trigger, its common issues, workflow settings, timezone variables, durable scheduler) · UPDATED 2026-10-01 · NOT TESTED in a running n8n; every cron expression in the lesson was checked by computing next run times with a Python cron library (5-field part, seconds field verified by hand), which is not n8n's own engine
versions
n8n 2.x (missed-execution options need 2.36+ and the durable scheduler)
language
human view: bg · english edition: /en/academy/n8n/ (lesson 7)
previous / next
n8n 06 · Integration with a chat-channel gateway / n8n 08 · Error handling and retry logic
PURPOSE

Run n8n workflows on a schedule with the Schedule Trigger node: pick an interval or a custom cron expression, make sure the timezone is right (Europe/Sofia), understand what happens to runs missed during downtime, skip public holidays with a Code node plus an If node, and build a weekday morning digest.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

n8n 08 · Error handling and retry logic · catch failures, retry, alert · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
n8nschedule-triggercrontimezoneautomationeurope-sofia
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

n8n: графици и cron със Schedule Trigger

Задачи, които се пускат сами: сутрешен бриф, седмичен отчет, проверка на всеки 15 минути. Научаваш как да кажеш на n8n „кога“, как да не те изненада часовата зона и какво става с пуснатите задачи, когато системата е била изключена.

⏱ около 30 мин Начинаещ n8n · Обучение 7/10 Schedule Trigger · cron · Europe/Sofia
n8n · Schedule Trigger🔒 локално Локален модел през Ollama (за брифа)🔒 локално Публично API за курсове (Frankfurter)🌐 глобален
🔄
ОБНОВЕНО · 01.10.2026 — какво
Поправена е часовата зона. В старата версия пишеше, че без настройка графиците вървят по UTC; по документацията подразбиращата се зона на самостоятелно инсталиран n8n е America/New_York, а на отделния процес може да се зададе своя (настройка Timezone). Cron форматът е сверен: n8n приема израз с по-ранно поле за секунди (шест полета), а секундите са по желание; добавени са документираните примери и предупреждението, че променливи в израза се смятат само при публикуване. Старата таблица „режими“ е заменена с истинските интервали на нода (секунди, минути, часове, дни, седмици, месеци, cron) с полетата им. Махнато е непроверимото: настройка „Concurrency → Max runs: 1“ не фигурира в настройките на процеса, а „Redis lock“ не е препоръка на документацията — затова раздел „Чести проблеми“ е пренаписан. Добавено: какво става с пропуснати изпълнения (по подразбиране се пропускат; опциите са от n8n 2.36 с „durable scheduler“), бележка за няколко екземпляра и за смяната на лятно/зимно часово време във Варна. Празниците са поправени: 1 ноември не е почивен ден, затова е махнат; добавена е бележка за преместените почивни дни. Сутрешният бриф е променен: курсът е USD → EUR (лева вече не се публикуват в API-то), записът във файл е през „Read/Write Files from Disk“ в разрешената папка, а личните данни са заменени с ролята „собственик“. «Activate» е „Publish“ (n8n 2.x). Проверени са всички cron изрази — вж. таблицата.
⚠️
Какво не сме пускали сами
Нямахме работещ n8n при проверката, затова няма етикет „ТЕСТВАНО“. Cron изразите са изчислени с библиотека на Python (пет полета; секундите са 0 и са проверени на ръка) — това не е двигателят на n8n, но показва какво очакваш да видиш. ⚠️ Не намерихме в документацията: дали денят от седмицата приема 7 за неделя и имена на месеци/дни (ползвай 0–6 и числа), и как точно се държи вътрешният график на n8n в часа, който се губи или повтаря при смяна на часовото време. Подробностите за опашен режим с отделни работници (queue mode) не сме сверявали — в този урок е само случаят с няколко главни екземпляра.

01Какво ще научиш

02Преди да започнеш

💡
Защо графикът иска „Publish“
Schedule Trigger се задейства сам само когато процесът е публикуван. С бутона „Execute Workflow“ го пускаш ръчно за тест — той не чака часа. Неактивен (непубликуван) процес не се пуска по график, дори след рестарт.

03Стъпки

  1. Интервалите на Schedule Trigger

    Добави нод Schedule Trigger. В Trigger Rules избираш единица за интервал; останалите полета зависят от нея. В един нод може да има няколко правила, всяко със свой график.

    ИнтервалПолетаПример (от документацията)
    SecondsSeconds Between Triggers30 → на всеки 30 секунди
    MinutesMinutes Between Triggers5 → на всеки 5 минути
    HoursHours Between Triggers · Trigger at Minute6 и минута 30 → на всеки 6 часа, в 30-а минута
    DaysDays Between Triggers · Trigger at Hour · Trigger at Minute2 дни, 9 ч, минута 15 → през ден в 9:15
    WeeksWeeks Between Triggers · Trigger on Weekdays · час · минута2 седмици, понеделник, 15:30
    MonthsMonths Between Triggers · Trigger at Day of Month · час · минута3 месеца, ден 28, 9:00 → на тримесечие
    Custom (Cron)Expressionпълен cron израз — следващата стъпка
    ⚠️
    Ден 29–31 при „Months“
    Ако месецът няма избрания ден, нодът не се задейства. Например ден 30 прескача февруари. За „последен ден от месеца“ този интервал не върши работа.
  2. 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 израза, стойността ѝ се чете само при публикуване. Смениш ли я после, графикът не се променя — спри публикуването и публикувай наново.
  3. Примерите — със следващите пускания

    Всеки израз по-долу е изчислен с начало 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:0005.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:0001.10 в 14:00 и 18:00; пт 02.10 в 09:00, 14:00, 18:00
    0 0 23 * * *Всяка вечер в 23:0001.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-во число в полунощ.
  4. Часовата зона

    Нодът ползва зоната така: 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“ борави по-вярно с тези случаи при интервали час/ден/седмица/месец; как точно ги решава вътрешният график ⚠️ не е описано.
  5. Какво става с пропуснатите изпълнения

    По подразбиране n8n държи графика в паметта. Ако е бил изключен или рестартиран в часа на задачата, тази задача се пропуска и не се навързва после. Това е нормално поведение, не грешка — затова за важни задачи мисли за запис „кога последно успях“.

    От n8n 2.36 има избор — но само ако включиш „durable scheduler“ и само за Schedule Trigger нодове, добавени от тази версия нататък. В настройките на нода (Settings):

    НастройкаКакво прави
    If Execution Is MissedDon'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.
  6. Само в работни дни — 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 нод.

  7. Практика: сутрешен бриф в 07:30

    Верига от нодове; всяка стъпка се пробва отделно с Execute step.

    1. Schedule Trigger — Custom (Cron): 0 30 7 * * 1-5. След него Code + If от предната стъпка.

    2. Postgres — незавършени задачи на собственика:

      sql · примерна таблица
      SELECT title, priority, deadline
      FROM tasks
      WHERE status = 'open' AND assigned_to = 'owner'
      ORDER BY priority DESC, deadline ASC
      LIMIT 10;
    3. Postgres — нови запитвания от снощи:

      sql
      SELECT COUNT(*) AS new_inquiries
      FROM inquiries
      WHERE received > NOW() - INTERVAL '16 hours';
    4. HTTP Request — курсът от Обучение 1. Лева вече не се публикуват, затова питаме за евро:

      url
      https://api.frankfurter.dev/v1/latest?base=USD&symbols=EUR
    5. Basic 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 за преименуване).

    6. Send Email (SMTP) — до твоя адрес. Тема: КАГАМИ · бриф · {{ $now.toFormat('dd.MM.yyyy') }}, текст: изходът на модела.

    7. Запис в журнал — файловият нод иска двоични данни: първо 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 и провери писмото и реда в журнала. Чак тогава публикувай процеса.

  8. Чести проблеми

    ❌
    Задачата тръгва в грешен час
    Провери в този ред: зоната в настройките на процеса, после GENERIC_TIMEZONE на n8n (рестартирай контейнера след промяна). Без нито едно от двете часът е нюйоркски.
    ❌
    Не се пуска изобщо
    Процесът не е публикуван (Publish). Ръчното „Execute Workflow“ не доказва, че графикът работи.
    ❌
    Новият интервал не се прилага
    Спри публикуването и публикувай нова версия. Същото важи за променлива в cron израза.
    ❌
    Пуска се по-често от очакваното
    В един нод може да има няколко правила и всяко се задейства само — виж дали не се застъпват. Ако имаш и втори екземпляр на n8n със същия процес, проверявай и него. ⚠️ Други причини не сме проверявали в документацията.
    ❌
    След рестарт липсва изпълнение
    Така е по подразбиране: пропуснатото се хвърля. Виж стъпката за пропуснати изпълнения.

04Проверка

Чеклист

Тест

1. Какво означава 0 30 7 * * 1-5?

2. Коя зона важи, ако нито процесът, нито GENERIC_TIMEZONE са настроени (самостоятелен n8n)?

3. Какво става по подразбиране със задача, чийто час е минал, докато n8n е бил рестартиран?

4. Променил си интервала на публикуван процес. Кога влиза в сила?

05Какво следва

06Източници

  1. n8n: Schedule Trigger — интервали, cron примери, шестото поле, опции за пропуснати изпълнения · чести проблеми.
  2. n8n: настройки на процеса — Timezone · часова зона и локал (GENERIC_TIMEZONE).
  3. n8n: durable scheduler — рестарти, пропуснати изпълнения, няколко екземпляра, смяна на часово време.
  4. n8n: дати и часове (Luxon) · Code · If · Send Email · Read/Write Files from Disk.
  5. crontab.guru 🌐 глобален — визуална проверка на изрази с пет полета.
  6. Frankfurter 🌐 глобален — API за курсове; лева вече не се публикуват.
  7. Официални празници в България 🌐 глобален — публичен списък; сверявай с официалния акт.