Разворачивание и первые сценарии n8n

Курс знакомит с установкой и развертыванием n8n в разных средах, базовой настройкой и безопасностью. Вы научитесь собирать первые рабочие автоматизации, подключать сервисы, обрабатывать данные и настраивать запуск по расписанию и вебхукам.

1. Что такое n8n и как он устроен

Что такое n8n и как он устроен

Зачем нужен n8n

n8n — это платформа для автоматизации задач и интеграции сервисов, где логика собирается в виде визуальных workflow (сценариев) из блоков nodes (узлов). n8n помогает:

  • связывать API разных сервисов без написания большого количества кода
  • запускать процессы по расписанию, вебхукам или событиям
  • обрабатывать данные: преобразовывать, фильтровать, объединять
  • контролировать выполнение: логи, ошибки, повторы, история запусков
  • Официальный сайт и документация:

  • n8n
  • n8n Documentation
  • Базовые понятия

    Workflow

    Workflow — это схема автоматизации: набор связанных узлов, которые выполняются в определённом порядке.

    Характерные свойства workflow:

  • имеет один или несколько стартовых узлов (обычно это триггеры)
  • передаёт данные от узла к узлу
  • может содержать ветвления, условия и циклы (в зависимости от выбранных узлов)
  • Node

    Node — шаг процесса. Узел может:

  • запускать workflow (триггер)
  • читать данные из внешнего сервиса
  • записывать данные во внешний сервис
  • преобразовывать данные внутри n8n
  • В n8n есть два больших класса узлов:

  • Trigger nodes — стартуют выполнение (например, Webhook, Schedule)
  • Regular nodes — выполняют действия и трансформации данных
  • Execution

    Execution — конкретный запуск workflow. Один и тот же workflow может иметь много executions (например, каждый час по расписанию).

    Execution хранит:

  • входные и промежуточные данные узлов
  • статус выполнения (успешно, ошибка, остановлено)
  • время запуска и длительность
  • Credentials

    Credentials — сохранённые учётные данные для доступа к сервисам (токены, логины, ключи API). Они хранятся отдельно от workflow и подставляются в узлы.

    Важно:

  • credentials позволяют переиспользовать доступ в нескольких workflow
  • управлять доступом к credentials нужно так же аккуратно, как и к ключам в коде
  • Как устроен workflow внутри

    Поток данных между узлами

    n8n передаёт данные между узлами в виде items (элементов). Обычно item — это объект JSON (набор полей), а на выходе узла может быть один или много items.

    Типичный принцип:

  • узел получает список items на вход
  • обрабатывает каждый item
  • отдаёт список items на выход
  • Это удобно для задач вроде:

  • получить список заказов → обработать каждый заказ → записать результаты
  • Соединения и ветвления

    Связи между узлами определяют порядок выполнения. Ветвления обычно появляются, когда:

  • один узел отправляет результат в несколько следующих узлов
  • используется узел с логикой выбора (например, If)
  • Выражения и доступ к данным

    n8n позволяет подставлять значения из предыдущих шагов через expressions (выражения). Это механизм, который даёт доступ к данным выполнения без ручного копирования.

    Примеры, где это используется:

  • подставить email пользователя из шага “Получить пользователя” в шаг “Отправить письмо”
  • сформировать URL запроса на основе данных из предыдущего узла
  • Обычно выражения применяются в полях узлов, где вы видите переключение между “вручную” и “выражение”.

    Виды запусков: триггеры

    Webhook

    Webhook — это HTTP-адрес, на который внешний сервис может отправить запрос, чтобы запустить workflow. Это основа для событийных интеграций.

    Сценарии:

  • платежная система присылает событие “оплата прошла”
  • форма на сайте отправляет данные заявки
  • ваш внутренний сервис вызывает n8n при наступлении события
  • Документация:

  • Webhook node
  • Schedule

    Schedule запускает workflow по времени (например, каждые 10 минут или по cron-расписанию).

    Документация:

  • Schedule Trigger node
  • Где “живёт” n8n: основные компоненты

    Ниже — упрощённая картина того, из чего состоит n8n как приложение.

    | Компонент | Роль | Что важно на старте | |---|---|---| | Editor UI | Веб-интерфейс для сборки workflow | Через него вы создаёте узлы и связи | | n8n server | “Мозг” системы: API, запуск workflow, выполнение узлов | Именно его вы разворачиваете на сервере | | Database | Хранение workflow, credentials, пользователей, истории | Часто используют PostgreSQL; в простых случаях возможны другие режимы | | Executions storage | Данные о запусках и результатах | Важно для отладки и расследования ошибок |

    !Упрощённая архитектура: интерфейс, сервер, база и внешние сервисы

    Как n8n выполняет сценарий

    Упрощённый жизненный цикл выполнения выглядит так:

  • Срабатывает триггер (Webhook, Schedule или другой).
  • Создаётся execution и фиксируется старт.
  • Узлы выполняются по связям графа слева направо (с учётом ветвлений).
  • Данные переходят от узла к узлу как items.
  • При ошибке execution получает статус “error”, и вы видите место падения.
  • Результаты и логи сохраняются для просмотра в UI.
  • Ошибки и надёжность: что важно понимать заранее

    Даже простой workflow может ломаться из-за внешних причин: недоступен API, истёк токен, сервис вернул 500, изменился формат ответа.

    Что в n8n помогает работать с этим:

  • отображение ошибки на конкретном узле в execution
  • возможность повторного запуска после исправлений
  • узлы и настройки, позволяющие продолжать выполнение при ошибках в отдельных местах (подход зависит от сценария)
  • Главная привычка на старте: строить workflow так, чтобы было легко понять, на каком шаге и с какими входными данными всё сломалось.

    Что будет дальше в курсе

    В следующих материалах вы развернёте n8n (обычно через Docker), настроите хранение данных и начнёте собирать первые сценарии: триггеры, запросы к API, обработка данных и отправка результатов.

    Чтобы двигаться уверенно, зафиксируйте для себя в этой статье три вещи:

  • workflow — это граф узлов, а execution — конкретный запуск
  • данные идут между узлами как список items (обычно JSON)
  • триггеры определяют, когда начинается выполнение
  • 2. Локальная установка: Desktop, npm, Docker

    Локальная установка: Desktop, npm, Docker

    Эта статья продолжает предыдущую (“Что такое n8n и как он устроен”) и переводит теорию в практику: чтобы собирать workflow, запускать executions и тестировать triggers, нужно сначала поднять n8n у себя локально.

    Локальная установка подходит для:

  • обучения и экспериментов
  • прототипирования сценариев перед переносом на сервер
  • отладки интеграций и выражений без влияния на продакшен
  • Какой способ установки выбрать

    Ниже — три основных варианта локального запуска. Все они дают одинаковый Editor UI, но различаются удобством, обновлениями и тем, как вы управляете данными и окружением.

    | Способ | Когда выбирать | Плюсы | Ограничения | |---|---|---|---| | Desktop-приложение | Хотите “установил и работает” | Минимум настроек, удобно новичкам | Меньше контроля над окружением, обычно сложнее приблизить к продакшену | | npm (Node.js) | Нужен быстрый запуск и гибкость без контейнеров | Просто обновлять, легко запускать скриптами, удобно для разработчиков | Нужно поставить Node.js, следить за версиями | | Docker / Docker Compose | Хотите повторяемость и близость к серверному развёртыванию | Изоляция, переносимость, удобная “упаковка” | Нужно знать основы Docker и томов (volumes) |

    !Подсказка по выбору подходящего способа установки

    Официальные источники (общие):

  • Документация n8n
  • Репозиторий n8n на GitHub
  • Важные базовые понятия перед установкой

    Чтобы установка не превратилась в “магическую кнопку”, важно понимать два практических термина:

  • Порт — локальный адрес приложения. По умолчанию n8n открывается на http://localhost:5678.
  • Папка данных n8n — место, где хранится всё, что вы создаёте в UI: workflow, credentials, история запусков (в зависимости от настроек). Если удалить эту папку или запустить без сохранения тома в Docker, данные могут пропасть.
  • Установка через Desktop-приложение

    Desktop удобен, если вы хотите быстро начать собирать первые workflow без Docker и без установки Node.js.

    Что нужно заранее

  • Windows, macOS или Linux
  • права на установку приложений
  • Установка и запуск

  • Откройте страницу загрузки n8n.
  • Скачайте Desktop-версию под вашу ОС.
  • Установите приложение и запустите.
  • Откройте Editor UI (обычно приложение само открывает окно или предлагает перейти в браузер).
  • Полезные ссылки:

  • Страница загрузки n8n
  • Документация: Desktop app
  • Что важно учитывать в Desktop

  • Desktop ориентирован на локальную работу. Если вы хотите принимать внешние вебхуки из интернета, понадобится проброс порта, туннелирование или отдельный серверный хостинг.
  • Credential-данные по-прежнему являются чувствительными: даже локально относитесь к ним как к ключам API.
  • Установка через npm (Node.js)

    Этот способ — “классический” запуск n8n как Node.js-приложения. Подходит, если вы хотите лучше контролировать окружение и легко автоматизировать запуск.

    Что нужно заранее

  • Установленный Node.js версии LTS.
  • npm (обычно ставится вместе с Node.js).
  • Ссылки:

  • Node.js (официальный сайт)
  • Документация: n8n installation via npm
  • Установка

    Установите n8n глобально:

    Проверьте, что команда доступна:

    Запуск

    После запуска откройте в браузере:

  • http://localhost:5678
  • Где хранятся данные

    При локальном запуске n8n обычно использует папку пользователя ~/.n8n (Linux/macOS) как основное место хранения локальных данных и конфигурации.

    Практический вывод:

  • если вы переустановите n8n, но сохраните папку ~/.n8n, ваши workflow и credentials обычно сохранятся
  • если удалить ~/.n8n, вы фактически “сбросите” локальную среду
  • Обновление

    Минимальная безопасность (если вы всё же открываете доступ)

    Локально n8n часто запускают “для себя”, но как только вы делаете его доступным по сети, включайте хотя бы базовую защиту:

  • Включить Basic Auth через переменные окружения (конкретные переменные и актуальные значения смотрите в документации).
  • Не публиковать без HTTPS, если доступ идёт из интернета.
  • Ссылка:

  • Документация: Security
  • Установка через Docker и Docker Compose

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

    Что нужно заранее

  • установленный Docker (для Windows/macOS обычно Docker Desktop)
  • Ссылки:

  • Docker
  • Документация: n8n installation with Docker
  • Быстрый запуск через docker run

    Этот пример подойдёт, чтобы быстро проверить, что всё работает. Ключевой момент — том (volume), чтобы данные не терялись.

    Что здесь важно:

  • -p 5678:5678 пробрасывает порт, чтобы UI был доступен на http://localhost:5678
  • -v n8n_data:/home/node/.n8n сохраняет данные n8n в Docker volume, чтобы они не исчезли при пересоздании контейнера
  • Рекомендуемый вариант для обучения: Docker Compose

    Docker Compose удобен тем, что конфигурация описана в одном файле и легко повторяется.

    Создайте файл docker-compose.yml:

    Запуск:

    Остановка:

    Обратите внимание:

  • down останавливает контейнер, но не удаляет volume по умолчанию, поэтому данные сохраняются
  • если вы удалите volume вручную, вы потеряете локальные workflow и credentials
  • Обновление Docker-версии n8n

  • Скачайте свежий образ.
  • Пересоздайте контейнер.
  • Проверка, что n8n работает

    После установки любым способом:

  • Откройте http://localhost:5678.
  • Убедитесь, что доступен Editor UI.
  • Создайте простой workflow, чтобы проверить execution:
  • узел Manual Trigger
  • узел, который создаёт тестовые данные (например, Set)
  • нажмите запуск вручную и посмотрите результат выполнения
  • Это напрямую связывает установку с базовыми понятиями из предыдущей статьи: вы создаёте workflow и наблюдаете конкретный execution с данными, проходящими между узлами.

    Частые проблемы и быстрые решения

  • Порт 5678 занят
  • - закройте программу, которая заняла порт, или измените порт запуска (в Docker — поменяйте левую часть проброса портов, например 5679:5678)
  • В Docker данные пропали после перезапуска
  • - почти всегда причина в том, что вы не подключили volume к /home/node/.n8n
  • n8n через npm не запускается или падает
  • - проверьте, что установлен Node.js LTS, и переустановите n8n

    Что дальше

    Теперь у вас есть локальный n8n, где можно безопасно экспериментировать. В следующих материалах логично перейти к первым практическим сценариям: триггеры (Schedule, Webhook), запросы к API и базовая обработка данных между узлами.

    3. Продакшн-развертывание: VPS, Docker Compose, reverse proxy

    Продакшн-развертывание: VPS, Docker Compose, reverse proxy

    В предыдущих статьях вы разобрали, как устроен n8n и как запустить его локально для экспериментов. Теперь задача меняется: поднять n8n так, чтобы он стабильно работал в продакшне, принимал входящие вебхуки из интернета, переживал перезапуски сервера и обновления, а также был защищён.

    Продакшн-развертывание отличается от локального тем, что вам нужно контролировать:

  • доступ из интернета по домену
  • HTTPS (TLS-сертификаты)
  • хранение данных (workflow, credentials, executions)
  • обновления и бэкапы
  • безопасность (минимум открытых портов, надёжные секреты)
  • !Общая архитектура: домен и HTTPS через reverse proxy, n8n в Docker, база отдельно

    Термины, которые понадобятся

  • VPS — виртуальный сервер у провайдера. Вы получаете публичный IP и доступ по SSH.
  • DNS — система, которая связывает домен (например, n8n.example.com) с IP-адресом сервера.
  • Reverse proxy — сервер “впереди” приложения. Он принимает входящие запросы, даёт HTTPS и проксирует дальше в n8n.
  • TLS (HTTPS) — шифрование трафика. В продакшне почти всегда обязательно.
  • Docker Compose — способ описать несколько контейнеров (n8n, база, reverse proxy) одним файлом docker-compose.yml.
  • Volume — постоянное хранилище Docker, чтобы данные не пропадали при пересоздании контейнеров.
  • Что мы соберём в итоге

    Минимально жизнеспособный и практичный стек:

  • VPS
  • Docker + Docker Compose
  • контейнер n8n
  • контейнер PostgreSQL для хранения данных
  • reverse proxy (в примере будет Caddy, потому что он проще всего выдаёт HTTPS)
  • Официальные источники:

  • Документация n8n: Docker
  • Документация n8n: Environment variables
  • Документация Caddy
  • Документация Docker Compose
  • Подготовка VPS

    Минимальные требования

    Для учебного продакшна обычно достаточно:

  • 1–2 CPU
  • 2–4 GB RAM
  • 20+ GB SSD
  • Для реальной нагрузки требования зависят от частоты executions, тяжести узлов и объёма истории.

    Установка Docker и Compose

    Порядок действий на большинстве Linux-дистрибутивов такой:

  • Установить Docker.
  • Убедиться, что Docker работает.
  • Установить Docker Compose (если он не доступен как docker compose).
  • Лучше идти по официальной инструкции под ваш дистрибутив:

  • Установка Docker Engine
  • Домен и DNS

    Чтобы n8n был доступен снаружи и корректно формировал URL для вебхуков, нужен домен.

  • Купите домен или используйте существующий.
  • Создайте DNS-запись типа A:
  • имя: n8n (или другое)
  • значение: публичный IP вашего VPS
  • После обновления DNS (иногда это занимает время) домен должен указывать на сервер.

    Почему нужен reverse proxy

    Reverse proxy решает сразу несколько задач:

  • принимает входящие соединения на 443 и выдаёт HTTPS
  • перенаправляет запросы внутрь Docker-сети на n8n
  • позволяет держать n8n не торчащим наружу напрямую
  • Практический принцип: наружу открыты только порты 80 и 443, а n8n работает внутри сети Compose.

    Docker Compose: n8n + PostgreSQL + Caddy

    Ниже — пример структуры проекта на VPS:

  • папка /opt/n8n/
  • файл docker-compose.yml
  • файл Caddyfile
  • файл .env с секретами
  • Файл .env

    Создайте /opt/n8n/.env:

    Что здесь важно:

  • POSTGRES_PASSWORD должен быть длинным и уникальным
  • N8N_ENCRYPTION_KEY нужен, чтобы n8n мог шифровать чувствительные данные стабильно между перезапусками
  • > Если вы потеряете N8N_ENCRYPTION_KEY, вы рискуете потерять возможность корректно использовать ранее сохранённые credentials после переезда или восстановления.

    Файл docker-compose.yml

    Создайте /opt/n8n/docker-compose.yml:

    Пояснения к ключевым настройкам:

  • postgres_data сохраняет базу на диске VPS через Docker volume
  • n8n_data сохраняет локальные данные n8n (в том числе настройки инстанса)
  • N8N_HOST, N8N_PROTOCOL, WEBHOOK_URL помогают n8n корректно генерировать публичные URL, что критично для webhook-сценариев
  • контейнер n8n не публикует порт наружу, к нему ходит только reverse proxy внутри окружения Compose
  • Файл Caddyfile

    Создайте /opt/n8n/Caddyfile:

    Как это работает:

  • Caddy сам получает TLS-сертификат и обновляет его
  • все запросы на домен проксируются в сервис n8n на порт 5678
  • Запуск

    Из папки /opt/n8n/:

    Проверка:

  • Откройте в браузере https://n8n.example.com.
  • Убедитесь, что открывается Editor UI.
  • Если не открывается, проверьте:

  • DNS A-запись указывает на IP сервера
  • порты 80 и 443 доступны извне
  • логи контейнеров:
  • Безопасность: минимум, который стоит сделать сразу

    Не публиковать 5678 наружу

    Если вы не пробрасываете 5678:5678 в Compose, то прямого доступа к n8n извне не будет, и это хорошо.

    Обновлять образы

    Регулярное обновление уменьшает риск уязвимостей:

    Сильные секреты и контроль доступа

  • Длинный POSTGRES_PASSWORD.
  • Длинный N8N_ENCRYPTION_KEY.
  • В самом n8n включите и используйте встроенную систему пользователей и прав доступа.
  • Практика: проверка webhook-сценария в продакшне

    Чтобы связать эту статью с темой триггеров из первой статьи курса, сделайте простой тест:

  • Создайте workflow.
  • Добавьте узел Webhook.
  • Добавьте узел Respond to Webhook.
  • Активируйте workflow.
  • Вызовите webhook по публичному URL через curl:
  • Смысл проверки: запрос приходит из интернета на reverse proxy, тот проксирует его в n8n, n8n создаёт execution, и вы видите результат в Editor UI.

    Бэкапы: что именно сохранять

    В продакшне важно понимать, что является источником истины.

    Обычно нужно бэкапить:

  • PostgreSQL (в ней лежат workflow, executions, пользователи, credentials в зашифрованном виде)
  • секрет N8N_ENCRYPTION_KEY (без него восстановление может быть неполным)
  • при необходимости Docker volumes n8n_data и конфиги reverse proxy
  • Пример бэкапа базы через pg_dump внутри контейнера:

    Частые проблемы в продакшн-развёртывании

    | Симптом | Частая причина | Что проверить | |---|---|---| | Вебхуки не приходят | неверный публичный URL | WEBHOOK_URL, домен, HTTPS | | UI открывается по HTTP, а не HTTPS | reverse proxy настроен неверно | конфиг Caddy/Nginx, открытые порты | | После обновления “сломались” credentials | изменился или потерян N8N_ENCRYPTION_KEY | значение ключа в .env | | Данные пропали | удалены volumes | что volumes подключены и не удалялись |

    Что дальше

    Теперь у вас есть инфраструктурная база для работы “как по-настоящему”: домен, HTTPS, Docker Compose, отдельная база и reverse proxy. Следующий логичный шаг курса — собирать первые сценарии, которые используют продакшн-возможности: Webhook, Schedule, запросы к внешним API и обработку данных, уже с пониманием того, где живут executions и как их расследовать.

    4. Первый workflow: триггеры, узлы и передача данных

    Первый workflow: триггеры, узлы и передача данных

    Эта статья соединяет инфраструктурную часть курса (локальная установка и продакшн-развёртывание) с практикой: вы соберёте первый рабочий workflow и поймёте, как в n8n запускаются сценарии, как данные переходят между узлами и как это отлаживать.

    К этому моменту у вас уже должен быть доступ к Editor UI:

  • локально: http://localhost:5678
  • в продакшне: https://ваш-домен (если вы развернули через reverse proxy)
  • Что вы построите в этой статье

    Вы соберёте учебный workflow, который:

  • запускается вручную (для удобной отладки)
  • создаёт входные данные
  • преобразует их в следующем узле
  • ветвится по условию
  • показывает, как работать с выражениями и items
  • В конце вы сделаете версию этого же сценария с внешним запуском через webhook.

    !Общая схема первого workflow и потока данных между узлами

    Минимальный словарь перед стартом

    Чтобы в статье не было “магии”, зафиксируем определения простыми словами:

  • Trigger — узел, который запускает workflow.
  • Node — шаг обработки (получение данных, преобразование, запрос к API, запись результата).
  • Execution — конкретный запуск workflow.
  • Item — элемент данных, который передаётся между узлами (обычно объект JSON).
  • Документация, к которой стоит привыкнуть обращаться:

  • Документация n8n
  • Webhook node
  • Schedule Trigger node
  • Как данные “текут” между узлами: items на практике

    В n8n почти всегда работает один и тот же принцип:

  • узел получает массив items на вход
  • обрабатывает каждый item
  • отдаёт массив items на выход
  • Даже если вы визуально видите “один объект”, внутри это обычно список из одного элемента.

    Практический вывод для новичка:

  • если вы получили 10 items (например, 10 заказов), то следующий узел обычно выполнится 10 раз по одному item
  • если вы хотите “собрать” всё в один объект, для этого понадобятся узлы агрегации (вы к ним придёте позже)
  • Workflow для обучения: Manual Trigger → Set → Code → If

    Шаг 1: Создайте новый workflow

  • Откройте Editor UI.
  • Нажмите создание нового workflow.
  • Переименуйте workflow, например в Первый workflow.
  • Шаг 2: Добавьте триггер Manual Trigger

  • Добавьте узел Manual Trigger.
  • Этот узел не требует настроек.
  • Зачем он нужен:

  • вы запускаете workflow вручную в любой момент
  • удобно смотреть данные на каждом шаге
  • Справка:

  • Manual Trigger node
  • Шаг 3: Добавьте узел Set и создайте тестовые данные

  • Добавьте узел Set и соедините его с Manual Trigger.
  • В Set добавьте поля:
  • name: Alex
  • email: alex@example.com
  • amount: 1500
  • Смысл узла Set:

  • быстро сформировать предсказуемый JSON для тестов
  • “имитировать” данные, которые в реальности придут из API/формы/вебхука
  • Справка:

  • Set node
  • Шаг 4: Добавьте узел Code и преобразуйте данные

  • Добавьте узел Code и соедините его после Set.
  • В узле сделайте простое преобразование: добавьте статус на основе суммы.
  • Пример кода (режим JavaScript):

    Что важно понять на этом шаге:

  • items — массив входных элементов
  • item.json — ваш объект данных
  • вы возвращаете массив items обратно в n8n
  • Справка:

  • Code node
  • Шаг 5: Добавьте If и сделайте ветвление

  • Добавьте узел If после Code.
  • Настройте условие так, чтобы проверять isVip.
  • Логика:

  • если isVip равно true, идём в ветку true
  • иначе идём в ветку false
  • Справка:

  • If node
  • Шаг 6: Добавьте два узла Set для результата ветвления

  • В ветке true добавьте Set и создайте поле segment со значением VIP.
  • В ветке false добавьте Set и создайте поле segment со значением REGULAR.
  • Так вы увидите, что “ветка” — это не абстракция, а реальный поток данных в разные узлы.

    Как запускать и отлаживать: Execution и просмотр данных

    Запуск

  • Нажмите запуск workflow (ручной запуск).
  • Убедитесь, что отработали узлы: Manual TriggerSetCodeIf → одна из веток.
  • Просмотр данных на каждом узле

    Практика отладки в n8n почти всегда одинаковая:

  • кликните на узел
  • посмотрите Input и Output
  • сравните, где именно данные изменились
  • Что полезно проверять при отладке:

  • сколько items пришло на вход
  • какие поля есть в json
  • типы значений (строка или число), потому что от этого часто “ломаются” условия
  • Выражения: как подставлять значения из предыдущих узлов

    Выражения — это способ использовать данные из выполнения, не копируя их вручную.

    Типовые задачи для выражений:

  • собрать текст сообщения на основе полей
  • подставить email в отправку письма
  • сформировать URL запроса
  • Справка:

  • Expressions
  • Мини-пример выражения

    Допустим, в одном из Set-узлов вы хотите собрать строку note.

  • Добавьте поле note.
  • Включите режим выражения.
  • Используйте данные из текущего item.
  • Пример логики: подставить имя и сегмент.

    Важно: выражение берёт данные из контекста выполнения, поэтому корректнее всего проверять себя через Input/Output на узлах.

    Переход от Manual Trigger к реальному запуску: Webhook

    Manual Trigger нужен для обучения, но реальная автоматизация часто начинается с входящего запроса.

    Минимальный webhook workflow

  • Создайте новый workflow.
  • Добавьте узел Webhook.
  • Добавьте узел Respond to Webhook.
  • Соедините WebhookRespond to Webhook.
  • Активируйте workflow.
  • Справка:

  • Webhook node
  • Respond to Webhook node
  • Проверка через curl

    Локально (если n8n на вашей машине):

    В продакшне (если вы настроили домен и HTTPS):

    Почему в продакшне это особенно важно:

  • вы проверяете весь путь: домен → reverse proxy → n8n → execution
  • сразу видно, корректно ли настроены WEBHOOK_URL, домен и HTTPS (из прошлой статьи)
  • Типовые ошибки новичков и как их диагностировать

  • Условие в If не срабатывает ожидаемо
  • Причина часто в типах: "1500" как строка и 1500 как число — разные вещи
  • Решение: смотрите Output узла и приводите типы (например, Number(...) в Code)
  • Вебхук не вызывается извне
  • Причина часто в том, что n8n доступен только локально, или неправильно настроен публичный URL
  • Решение: для продакшна используйте домен и reverse proxy; для локальной разработки используйте локальный URL и тестируйте запросом на localhost
  • Данные “пропадают” после перезапуска
  • Причина почти всегда в хранении: нет volume в Docker или вы удалили volume
  • Решение: проверьте volumes (как в статье про Docker/Compose)
  • Что дальше

    После этой статьи у вас должна появиться базовая “мышечная память”:

  • триггер запускает workflow
  • данные идут как items между узлами
  • вы умеете смотреть execution и понимать, где данные изменились
  • Следующий логичный шаг — собрать первые сценарии, которые используют внешние API и расписание: HTTP Request, Schedule Trigger, обработку ответа и сохранение/отправку результата.

    5. Интеграции и доступы: OAuth, API-ключи, Credentials

    Интеграции и доступы: OAuth, API-ключи, Credentials

    В предыдущих статьях вы развернули n8n (локально или на VPS) и собрали первый workflow, где данные передаются между узлами как items. Теперь следующий практический шаг: научиться безопасно подключать внешние сервисы.

    Почти любой полезный сценарий упирается в доступы:

  • нужно авторизоваться в API (например, CRM, почта, мессенджер)
  • нужно хранить секреты так, чтобы не «размазать» их по узлам
  • нужно уметь переносить workflow между окружениями (локально → прод)
  • В этой статье вы разберёте, как n8n работает с Credentials, чем отличаются OAuth и API-ключи, и какие базовые правила безопасности стоит принять как привычку.

    !Как credentials отделены от workflow и используются узлами для доступа к внешним API

    Что такое интеграция в n8n

    Интеграция в контексте n8n обычно означает один из двух вариантов:

  • вы используете готовый узел конкретного сервиса (например, узел для Google Sheets)
  • вы используете универсальный узел, чаще всего HTTP Request, чтобы ходить в любое API
  • В обоих случаях почти всегда нужен механизм авторизации.

    Полезная справка:

  • HTTP Request node
  • Credentials в n8n: что это и зачем они нужны

    Credentials в n8n это сохранённые параметры доступа к сервисам: API-ключи, токены, логины и пароли, OAuth-настройки.

    Зачем credentials вынесены отдельно от workflow:

  • безопасность: секреты не должны быть «вшиты» в узлы и выражения
  • переиспользование: один и тот же доступ можно подключать в нескольких workflow
  • удобство замены: если ключ поменялся, вы обновляете его в одном месте
  • разделение прав: в командной работе (когда включены пользователи и роли) можно управлять доступами к credentials отдельно
  • Важно помнить связь с продакшн-развёртыванием из прошлых статей:

  • credentials и workflow хранятся в базе данных (часто PostgreSQL)
  • значение N8N_ENCRYPTION_KEY критично для стабильной работы с зашифрованными данными после перезапусков и миграций
  • Справка по безопасности и переменным окружения:

  • Security in n8n
  • Environment variables
  • Способы авторизации: краткая карта

    Ниже самые частые способы авторизации в API и то, как они обычно выглядят в n8n.

    | Способ | Что это | Как выглядит в запросе | Когда использовать | |---|---|---|---| | API-ключ | «Постоянный» секрет, выданный сервисом | заголовок X-API-Key: ... или параметр ?api_key=... | сервер-сервер интеграции, простые API | | Bearer token | токен, который передаётся как «пропуск» | Authorization: Bearer <token> | когда сервис выдаёт токены (часто вместе с OAuth) | | Basic Auth | логин и пароль (или ключ) в формате basic | Authorization: Basic ... | простые внутренние сервисы, редко публичные API | | OAuth 2.0 | «делегированный доступ» через подтверждение пользователя | токены выдаются после авторизации и обновляются | доступ к данным пользователя (Google, Microsoft и другие) |

    Дальше разберём два самых важных для новичка варианта: API-ключи и OAuth.

    API-ключи: самый простой старт

    Как устроен API-ключ

    API-ключ это секретная строка, которую сервис выдаёт для доступа к API.

    Ключевые свойства:

  • ключ часто действует долго, пока вы его не отзовёте
  • ключ обычно даёт доступ в рамках аккаунта или проекта
  • утечка ключа почти всегда означает, что злоумышленник сможет делать запросы от вашего имени
  • Как использовать API-ключ в n8n правильно

    Правильный принцип: ключ живёт в credentials, а не в узле.

    Практический паттерн для HTTP Request:

  • Создайте credential (тип зависит от API: иногда это отдельный тип, иногда подходит generic HTTP auth).
  • В HTTP Request выберите этот credential.
  • Передавайте ключ как требует сервис: в заголовке или в query.
  • Даже если вы пока делаете учебный прототип, привычка «ключи только в credentials» окупается при переносе в продакшн.

    Мини-сценарий для тренировки

    Соберите workflow:

  • Manual Trigger
  • HTTP Request
  • В HTTP Request:

  • Method: GET
  • URL: любой тестовый API, который требует ключ (лучше ваш реальный сервис, где вы можете выпустить тестовый ключ)
  • Authentication: выберите вариант, который подходит вашему API
  • Если сервис требует заголовок Authorization: Bearer ..., проверьте, что:

  • значение токена не прописано текстом в узле
  • токен хранится в credential, а в запрос подставляется автоматически
  • OAuth 2.0: доступ через подтверждение пользователя

    OAuth 2.0 стоит изучить сразу, потому что многие крупные сервисы (Google, Microsoft, Slack и другие) для доступа к данным пользователя используют именно его.

    Официальная спецификация:

  • RFC 6749: The OAuth 2.0 Authorization Framework
  • Термины простыми словами

  • Client ID и Client Secret это «пара ключей приложения», которое вы регистрируете в сервисе
  • Redirect URL это адрес, куда сервис вернёт пользователя после подтверждения доступа
  • Scope это список разрешений, которые вы запрашиваете (например, читать таблицы, отправлять письма)
  • Access token это короткоживущий токен для запросов
  • Refresh token это токен для выпуска новых access token без повторного входа пользователя
  • Как в целом выглядит OAuth-поток в n8n

    Упрощённо процесс обычно такой:

  • Вы регистрируете приложение в сервисе и получаете Client ID и Client Secret.
  • В n8n создаёте credential типа OAuth2 (или credential конкретного сервиса).
  • В настройках OAuth в сервисе указываете Redirect URL n8n.
  • Нажимаете в n8n кнопку подключения, проходите подтверждение доступа.
  • n8n сохраняет токены в credential и дальше узлы используют их автоматически.
  • Самая частая проблема: неправильный Redirect URL

    Redirect URL должен совпадать посимвольно с тем, что ожидает OAuth-провайдер.

    Почему это связано с темой продакшна из прошлой статьи:

  • если n8n в продакшне работает за reverse proxy и доменом, сервис должен возвращать пользователя на публичный домен
  • если WEBHOOK_URL, N8N_HOST и N8N_PROTOCOL настроены неверно, n8n может генерировать некорректные внешние адреса
  • Практический вывод:

  • для локального обучения OAuth часто проще, когда n8n доступен по стабильному адресу
  • для продакшна почти всегда нужен домен и HTTPS, чтобы OAuth был «как у людей»
  • Где нельзя хранить секреты

    Типовые ошибки, которые потом сложно разгрести:

  • вставить API-ключ прямо в поле заголовка HTTP Request
  • хранить токен в Set и дальше передавать по узлам
  • писать токены в Code как строковые литералы
  • отправлять секреты в логи, чаты и таск-трекеры при отладке
  • Правильная стратегия:

  • секреты хранятся в credentials
  • конфигурация окружения (домен, протокол, ключ шифрования) живёт в переменных окружения и .env
  • в workflow остаётся только логика и безопасные ссылки на credentials
  • Бэкапы и переносы: что критично сохранить

    Если вы уже развернули n8n на VPS из прошлой статьи, относитесь к данным как к продакшн-активу.

    Что нужно уметь восстановить:

  • база данных (workflow, executions, пользователи, credentials в зашифрованном виде)
  • значение N8N_ENCRYPTION_KEY
  • Если вы восстановили базу, но потеряли N8N_ENCRYPTION_KEY, вы можете столкнуться с тем, что сохранённые доступы перестанут корректно использоваться.

    Мини-чеклист перед подключением нового сервиса

  • Понимаю, какой тип авторизации использует сервис: API-ключ или OAuth.
  • Создал отдельный credential, а не храню секрет в узле.
  • Проверил, что доступы не попадают в логи и тестовые ответы.
  • Для OAuth проверил, что Redirect URL соответствует публичному адресу моего n8n.
  • В продакшне n8n доступен по HTTPS и не торчит наружу на 5678 напрямую.
  • Что дальше по курсу

    Теперь у вас есть база для реальных интеграций: вы понимаете, где и как хранить доступы и почему продакшн-настройки (домен, HTTPS, N8N_ENCRYPTION_KEY) влияют не только на вебхуки, но и на OAuth.

    Следующий практический шаг после этой статьи обычно такой:

  • взять внешний API
  • подключить его через credentials
  • построить workflow с Schedule Trigger или Webhook
  • обработать ответ как items и отправить результат дальше
  • 6. Типовые сценарии: Webhook, Cron, HTTP Request, обработка JSON

    Типовые сценарии: Webhook, Cron, HTTP Request, обработка JSON

    В прошлых материалах вы:

  • разобрали архитектуру n8n, понятия workflow, execution, items
  • подняли n8n локально и в продакшне (Docker Compose + reverse proxy)
  • собрали первый workflow и увидели, как данные переходят между узлами
  • разобрались, как хранить доступы через Credentials (API-ключи, OAuth)
  • Теперь соберём типовые рабочие паттерны, которые встречаются почти в любой автоматизации:

  • входящие события через Webhook
  • запуск по времени через Cron (узел Schedule Trigger)
  • запросы в внешние API через HTTP Request
  • обработка JSON в формате, который понимает n8n (items)
  • !Три самых частых паттерна: событие, расписание и API-запрос с обработкой данных

    Как выбрать старт сценария: Webhook или Cron

    Оба варианта делают одно и то же на уровне n8n: создают execution и передают данные дальше как items. Разница в том, кто и когда запускает выполнение.

    | Старт | Что это | Когда использовать | Что важно учесть | |---|---|---|---| | Webhook | Внешний сервис вызывает URL n8n | формы, платежи, события из CRM, чат-боты | публичный URL, HTTPS, корректный WEBHOOK_URL в продакшне | | Schedule Trigger (Cron) | n8n сам запускает workflow по времени | отчёты, синхронизации, периодические проверки | часовой пояс, нагрузка, идемпотентность (повторяемость) |

    Справка:

  • Webhook node
  • Schedule Trigger node
  • Сценарий с Webhook: принять JSON → обработать → ответить

    Зачем нужен Respond to Webhook

    Если вы хотите, чтобы вызывающая система получила понятный HTTP-ответ (например, 200 OK и JSON с результатом), используйте узел Respond to Webhook. Тогда webhook становится не только “триггером”, но и “API-эндпоинтом”.

    Справка:

  • Respond to Webhook node
  • Минимальный рабочий шаблон

  • Узел Webhook
  • Узел обработки данных (часто Set, If, Code)
  • Узел Respond to Webhook
  • Практическая мысль: вызывающий сервис обычно ждёт ответ быстро. Если ваша логика тяжёлая (много запросов, долгие вычисления), лучше отвечать сразу “принято”, а обработку делать дальше асинхронно.

    Как протестировать webhook через curl

  • Создайте workflow: WebhookRespond to Webhook.
  • В Webhook выберите метод POST и путь, например lead.
  • Активируйте workflow.
  • Тест локально:

    Тест в продакшне (если вы подняли домен и HTTPS):

    Если в продакшне запрос “не доходит”, вернитесь к настройкам из статьи про развёртывание: домен, reverse proxy, WEBHOOK_URL, N8N_HOST, N8N_PROTOCOL.

    Где в n8n лежит JSON из запроса

    Webhook-узел превращает входящий запрос в структуру, доступную следующим узлам. Чаще всего вам понадобятся:

  • тело запроса (body)
  • query-параметры
  • заголовки
  • Проверяйте себя через просмотр Input/Output на узлах текущего execution: это самый быстрый способ понять, где именно лежит нужное поле.

    Пример обработки: сегментация по сумме и формирование ответа

    Соберите workflow:

  • Webhook (POST /lead)
  • Code (добавить признак VIP)
  • Respond to Webhook (вернуть JSON)
  • Код для узла Code:

    Что здесь происходит:

  • items — массив входных элементов
  • item.json — данные одного элемента
  • мы пытаемся взять amount либо из body.amount (часто так у webhook), либо из amount (если структура другая)
  • на выходе возвращаем массив items, чтобы n8n продолжил работу
  • Справка по Code:

  • Code node
  • Сценарий по расписанию: Cron через Schedule Trigger

    Schedule Trigger умеет запускать workflow:

  • с простыми интервалами (каждые N минут/часов)
  • по расписанию cron
  • Что такое cron простыми словами

    Cron-расписание — это строка, которая описывает в какие моменты времени должен стартовать workflow.

    Практический совет: если вы только начинаете, используйте пресеты в UI узла Schedule Trigger, а cron подключайте, когда нужно что-то точнее.

    Что важно про часовой пояс

    Если у вас “по идее должно стартовать в 9:00”, но запускается “в другое время”, почти всегда причина в часовом поясе.

    Проверьте:

  • настройку часового пояса в узле Schedule Trigger
  • переменные окружения TZ и GENERIC_TIMEZONE (если вы на Docker/VPS)
  • Типовой шаблон: Cron → HTTP Request → обработка → отправка/сохранение

    На практике Cron-воркфлоу часто выглядит так:

  • Schedule Trigger
  • HTTP Request (забрать данные)
  • обработка (Code, If, Set)
  • отправка результата (почта, мессенджер, запись в таблицу/БД)
  • HTTP Request: как ходить в любое API

    Узел HTTP Request — универсальный инструмент для интеграций, особенно когда у сервиса нет готового узла.

    Справка:

  • HTTP Request node
  • Базовые настройки, которые встречаются чаще всего

  • Method: GET, POST, PUT, DELETE
  • URL: адрес эндпоинта
  • Authentication: без авторизации или через credentials (API-ключ, OAuth2 и другие)
  • Response Format: обычно JSON (чтобы n8n сразу распарсил ответ)
  • Headers: например Content-Type: application/json, Authorization: Bearer ... (лучше через credentials)
  • Учебный пример на публичном API

    Чтобы потренироваться без токенов и регистраций, удобно использовать тестовые сервисы:

  • JSONPlaceholder — фейковые данные (посты, комментарии)
  • httpbin — сервис для проверки HTTP-запросов
  • Пример: получить список постов и отфильтровать их.

  • Manual Trigger или Schedule Trigger
  • HTTP Request:
  • Method: GET
  • URL: https://jsonplaceholder.typicode.com/posts
  • Response Format: JSON
  • После выполнения вы получите массив объектов. Дальше важно понять, как этот массив превращается в items.

    Обработка JSON в n8n: от “массива объектов” к items

    Главная модель данных

    n8n почти всегда работает так:

  • узел получает массив items
  • каждый item содержит json (объект)
  • следующий узел обычно обрабатывает каждый item отдельно
  • Это отлично подходит для сценариев “взять список сущностей и обработать каждую”.

    Частая проблема: API вернул массив, а вам нужны отдельные items

    Некоторые API возвращают JSON вида:

    А некоторые — вида:

    В обоих случаях правильная стратегия одна: сначала выяснить по Output узла, где именно лежит массив, и затем “развернуть” его в items.

    Универсальный способ развернуть массив в items через Code

    Если после HTTP Request нужный массив лежит в item.json.data, можно сделать так:

    Что важно:

  • out.push({ json: el }) создаёт новый item
  • на выходе получится много items, и следующие узлы выполнятся по одному на каждый элемент
  • Фильтрация, нормализация, вычисляемые поля

    Три самых частых действия с JSON перед отправкой дальше:

  • фильтрация: оставить только нужные элементы
  • нормализация: переименовать поля и привести типы (строка → число)
  • обогащение: добавить вычисляемые поля (статус, сегмент, ссылка)
  • Пример нормализации одного item:

    Выражения: как безопасно “доставать” поля

    Выражения удобны, когда вам нужно собрать строку, URL или поле для следующего узла без написания кода.

    Справка:

  • Expressions
  • Практические советы:

  • всегда проверяйте путь к данным через Input/Output узлов
  • аккуратно относитесь к отсутствующим полям (частая причина падений)
  • Типовые ошибки и как их быстро диагностировать

  • Webhook работает в тестовом режиме, но не работает после активации
  • - причина часто в том, что вы используете test URL вместо production URL в узле Webhook - решение: активируйте workflow и используйте production URL

  • If-условия “не совпадают”, хотя значение выглядит правильным
  • - причина часто в типах данных: число и строка сравниваются по-разному - решение: приводите типы (например, Number(...)) и смотрите output

  • HTTP Request возвращает неожиданный формат
  • - причина: неверный Response Format или API вернул ошибку в другом виде - решение: смотрите сырой ответ в узле, проверяйте статус-код и тело

  • Cron запускается “не в то время”
  • - причина: часовой пояс - решение: проверьте настройки timezone в узле и переменные окружения TZ, GENERIC_TIMEZONE

    Итог: базовая “боевая связка”

    Если у вас в голове сложится один устойчивый паттерн, дальше будет проще строить любые интеграции:

  • старт (Webhook или Schedule Trigger)
  • получение данных (HTTP Request или входящий JSON)
  • приведение к удобному виду (items, нормализация, фильтрация)
  • действие (запись/уведомление/ответ)
  • В следующем практическом шаге курса обычно делают один цельный сценарий “от события до результата”: входящий webhook или cron → запрос к внешнему API с credentials → обработка JSON → отправка результата в нужный сервис.

    7. Надежность и безопасность: переменные окружения, бэкапы, логи

    Надежность и безопасность: переменные окружения, бэкапы, логи

    В предыдущих статьях вы подняли n8n локально и в продакшне (Docker Compose + reverse proxy), собрали первый workflow и подключили внешние сервисы через Credentials. Теперь важно сделать шаг, который отличает «работает у меня» от стабильно работает в реальности: настроить надежность и безопасность.

    В n8n это почти всегда упирается в три практики:

  • переменные окружения как единый способ конфигурации инстанса
  • бэкапы как гарантия восстановления
  • логи и диагностика как способ быстро понять, что сломалось и где
  • !Карта того, где живут настройки, данные, логи и что именно нужно бэкапить

    Что такое переменные окружения и почему они важны

    Переменные окружения — это значения, которые приложение (n8n) читает при старте. Это основной способ управлять конфигурацией в Docker и продакшне.

    Практическая идея такая:

  • workflow и credentials вы настраиваете в UI
  • поведение инстанса (домен, протокол, база, шифрование, часовой пояс) вы задаете переменными окружения
  • Официальная справка:

  • Environment variables
  • Где задают переменные окружения в Docker Compose

    Обычно используют файл .env рядом с docker-compose.yml. Это удобно, потому что:

  • секреты не размазываются по файлам
  • значения легко менять без правки YAML
  • проще переносить конфигурацию между серверами
  • Ключевая привычка:

  • файл .env не коммитить в Git
  • хранить его доступным только администратору сервера
  • Почему переменные окружения влияют на webhook и OAuth

    Из предыдущих статей вы уже видели, что вебхуки и OAuth зависят от того, какой у вас публичный адрес n8n.

    Если n8n развернут за reverse proxy, то инстанс должен знать:

  • какой у него домен
  • какой протокол (обычно https)
  • какой внешний базовый URL использовать при генерации ссылок
  • Иначе типичные симптомы:

  • webhook URL генерируется неверно
  • внешние сервисы «не достучались» до webhook
  • OAuth ругается на несовпадающий Redirect URL
  • Официальная справка по безопасности развертывания:

  • Security
  • Переменные окружения, которые критичны в продакшне

    Ниже — набор переменных, который чаще всего встречается в учебном и небольшом продакшн-развертывании (пример в курсе был на Docker Compose + PostgreSQL + reverse proxy).

    | Зона | Примеры переменных | Зачем это нужно | Что будет, если ошибиться | |---|---|---|---| | Шифрование | N8N_ENCRYPTION_KEY | Шифрует чувствительные данные (например, содержимое credentials в базе) | После переезда или восстановления credentials могут стать непригодны | | Публичный адрес | N8N_HOST, N8N_PROTOCOL, WEBHOOK_URL | Корректные внешние URL для webhook и OAuth | Вебхуки «не доходят», OAuth Redirect URL не совпадает | | База данных | DB_TYPE и параметры подключения к Postgres | Стабильное хранение workflow, пользователей, executions | Потеря данных или нестабильная работа | | Время | TZ, GENERIC_TIMEZONE | Корректные расписания в Schedule Trigger | Cron запускается «не в то время» |

    Самая важная переменная: N8N_ENCRYPTION_KEY

    N8N_ENCRYPTION_KEY — это ключ, который позволяет n8n стабильно шифровать и расшифровывать чувствительные данные.

    Практические правила:

  • задайте ключ один раз и храните его как секрет
  • не меняйте ключ без понимания последствий
  • обязательно включайте ключ в стратегию бэкапа
  • Связь с предыдущей статьей про Credentials прямая: credentials лежат в базе в зашифрованном виде, а расшифровка завязана на этот ключ.

    Переменные публичного URL и вебхуки

    Если вы развернули n8n на домене через reverse proxy, публичный URL должен быть консистентным. Обычно на практике проверяют так:

  • в UI n8n webhook URL должен быть на вашем домене и на https
  • вызов webhook через curl должен попадать в execution
  • Справка по вебхукам:

  • Webhook node
  • Переменные времени и расписаний

    Когда вы используете Schedule Trigger, время запуска зависит от настроек таймзоны.

    Что важно для устойчивости:

  • выбрать единый часовой пояс для инстанса
  • понимать, что при переезде на другой сервер без настройки TZ расписания могут «съехать»
  • Справка по расписанию:

  • Schedule Trigger node
  • Минимальная безопасность продакшн-инстанса

    Эти принципы связывают статью о продакшн-развертывании и статью про credentials.

    Оставляйте наружу только 80 и 443

    Если n8n работает за reverse proxy:

  • наружу открыты порты 80 и 443
  • порт n8n (5678) доступен только внутри Docker-сети
  • Это резко снижает поверхность атаки: к n8n нельзя обратиться напрямую, минуя HTTPS и правила proxy.

    Секреты не должны жить в workflow

    Повторим ключевую практику из статьи про интеграции:

  • API-ключи и OAuth-токены должны храниться в Credentials
  • переменные окружения и .env должны хранить конфигурацию инстанса, а не секреты из узлов
  • в узлах не должно быть «захардкоженных» токенов и паролей
  • Учетные записи и доступы в UI

    Если инстансом пользуется больше одного человека:

  • включайте работу через пользователей и роли
  • ограничивайте доступ к credentials по необходимости
  • Это важно не только для безопасности, но и для надежности: меньше риск случайно сломать общий продакшн-воркфлоу.

    Бэкапы: что сохранять и как проверять восстановление

    Бэкап — это не файл на диске, а гарантия восстановления. Поэтому важны два вопроса:

  • что именно является источником истины
  • проверяли ли вы восстановление хотя бы один раз
  • Что нужно бэкапить в типовом Docker Compose развертывании

    Обычно достаточно следующего набора:

  • база данных PostgreSQL (в ней лежат workflow, пользователи, executions, credentials в зашифрованном виде)
  • значение N8N_ENCRYPTION_KEY
  • файлы инфраструктуры, чтобы быстро поднять окружение заново (например, docker-compose.yml, конфиг reverse proxy)
  • Если вы храните данные n8n в volume (например, n8n_data), его тоже стоит учитывать в бэкап-стратегии, но основным источником данных в продакшн-схеме с Postgres обычно является база.

    Пример бэкапа PostgreSQL через pg_dump

    Команда часто выглядит так (пример из курса):

    На практике это означает:

  • docker compose exec postgres запускает команду внутри контейнера PostgreSQL
  • pg_dump выгружает базу в текстовый дамп
  • результат сохраняется в файл backup.sql на сервере
  • Важно для надежности:

  • храните дампы не только на том же сервере (иначе потеря диска = потеря бэкапа)
  • делайте бэкапы по расписанию
  • контролируйте доступ к бэкапам, потому что в них есть чувствительные данные (пусть и зашифрованные)
  • Как проверять, что бэкап реально работает

    Проверка восстановления — обязательная часть процесса. Минимальный подход:

  • Поднимите тестовое окружение (например, на отдельной VM или локально).
  • Поднимите пустой PostgreSQL.
  • Восстановите дамп в тестовую базу.
  • Запустите n8n с тем же N8N_ENCRYPTION_KEY.
  • Убедитесь, что workflow видны, а credentials работают.
  • Ключевой момент: если вы восстановили базу, но забыли N8N_ENCRYPTION_KEY, вы рискуете получить инстанс, где credentials не получится использовать.

    Логи и диагностика: как быстро понять, что сломалось

    В n8n есть два основных источника информации при инцидентах:

  • Executions в UI, где видно входы/выходы узлов и место ошибки
  • системные логи процесса (в Docker это обычно docker compose logs)
  • Диагностика через Executions

    Это продолжение практики из статьи про первый workflow:

  • открывайте конкретный execution
  • смотрите, на каком узле ошибка
  • сравнивайте Input и Output соседних узлов
  • Плюс этого подхода в том, что вы видите не абстрактную «ошибку API», а конкретные данные, которые к ней привели.

    Диагностика через Docker-логи

    Если проблема на уровне инфраструктуры (не стартует контейнер, отвалилась база, проблемы reverse proxy), начинать нужно с логов контейнеров:

    И отдельно, если вебхуки не доходят или есть проблемы с HTTPS:

    Практический паттерн расследования:

  • Проверить, что UI открывается.
  • Проверить, что создаются executions.
  • Если executions не создаются при обращении извне, смотреть reverse proxy.
  • Если n8n падает или не стартует, смотреть логи n8n и базы.
  • Как сделать логи полезными, а не шумными

    Логи помогают, когда у вас есть дисциплина:

  • фиксируйте время инцидента и связывайте его с execution в UI
  • не выводите секреты в данные узлов и ответах webhook
  • отделяйте ошибки бизнес-логики (например, API вернул 400) от инфраструктурных (контейнер не стартует)
  • Мини-чеклист перед тем, как считать инстанс готовым

  • N8N_ENCRYPTION_KEY задан и сохранен в надежном месте.
  • Публичный URL настроен так, что webhook URL в UI указывает на домен и https.
  • Внешние порты открыты только 80 и 443, порт n8n не опубликован напрямую.
  • Есть регулярный бэкап PostgreSQL и понятный план восстановления.
  • Вы знаете, где смотреть executions и где смотреть docker-логи.
  • Что дальше по курсу

    Теперь у вас есть основа, чтобы запускать реальные сценарии из предыдущей статьи (Webhook, Schedule Trigger, HTTP Request) без страха «потерять все при первом обновлении».

    Следующий практический шаг — собрать один цельный workflow с внешним API и расписанием или вебхуком и довести его до состояния:

  • защищено
  • наблюдаемо (понятно, где смотреть ошибки)
  • восстанавливаемо (есть бэкап и проверка восстановления)