← Назад к курсу

Подробное пособие по работе с n8n

Что такое n8n

n8n – это open‑source платформа для автоматизации (workflow‑engine) с визуальным редактором.
Она позиционируется как «доступный Zapier», но имеет несколько ключевых отличий:

Плюс n8n Почему это важно
Self‑hosted (можно запустить в Docker, на VPS, в облаке) Полный контроль над данными и стоимостью
Open source (MIT‑лицензия) Можно менять код, добавлять новые узлы и делиться ими
Node‑based (каждый шаг – это node) Гибкое построение логики, поддержка условных веток, циклов, параллелизма
Большой каталог интеграций (≈ 300+ готовых узлов) Работает с API популярных сервисов (Google, Slack, GitHub, Shopify, Airtable, …)
JavaScript в каждом узле Возможность писать кастомную логику без ограничения
Встроенный “Credentials Store” Безопасное хранение токенов, паролей и секретов
Событийные триггеры (Webhook, Cron, Polling) Запуск выполняется в ответ на внешние запросы или по расписанию
Поддержка “Execute Workflow” Один воркфлоу может вызывать другой, создавая библиотеки переиспользуемых процессов

Как установить n8n (кратко)

NB: Если вам нужен только пробный запуск, можно воспользоваться n8n.cloud (SaaS) – там всё уже настроено. Ниже привожу варианты self‑hosted.

Способ Команда / шаг Примечание
Docker (рекомендовано) docker run -d \ <br> --name n8n \ <br> -p 5678:5678 \ <br> -v ~/.n8n:/home/node/.n8n \ <br> n8nio/n8n Данные сохраняются в ~/.n8n.
Docker‑Compose yaml version: '3'\nservices:\n n8n:\n image: n8nio/n8n\n ports:\n - \"5678:5678\"\n volumes:\n - ~/.n8n:/home/node/.n8n\n environment:\n - N8N_BASIC_AUTH_ACTIVE=true\n - N8N_BASIC_AUTH_USER=admin\n - N8N_BASIC_AUTH_PASSWORD=supersecret\n Позволяет добавить env‑переменные, например basic auth.
npm (Node.js) npm install n8n -g\nn8n start Требует Node ≥ 18 и постоянного процесса (systemd, pm2).
Helm chart (K8s) helm repo add n8n https://helm.n8n.io && helm install my-n8n n8n/n8n Подойдёт для кластеров.

После запуска откройте в браузере http://localhost:5678 (или ваш домен/порт). При первом входе будет предложено создать учетную запись.


Основные понятия в n8n

Термин Описание
Workflow Полный граф задач, который выполняется от начала до конца. Сохраняется в JSON в базе данных.
Node Один блок (шаг). Может быть Trigger, Action, Utility, Custom и т.п.
Trigger node Узел, который инициирует выполнение воркфлоу (Webhook, Cron, Polling, MQTT, …). У воркфлоу может быть только один триггер.
Credentials Секреты (API‑ключи, OAuth‑токены, пароли), привязываются к узлам, но хранятся отдельно.
Expressions Специальный синтаксис {{ }} – позволяет подставлять данные из предыдущих узлов, переменные окружения, функции JavaScript.
Execute Workflow Узел, который запускает другой workflow и передаёт в него данные (параметры).
Error Trigger Узел в секции “Error” позволяет отлавливать падения и делать откат/уведомление.
Branch (IF) Узел условия, ветвление логики.
Set Узел «Set», позволяющий задать/переназначить переменные.
Function / FunctionItem Узлы для выполнения собственного JavaScript‑кода (со значением item или массивом items).
SplitInBatches / Merge Позволяют обрабатывать большие списки порциями.

Пошаговое создание собственного workflow

Рассмотрим пример: Получать новые сообщения в Slack и сохранять их в Google Sheet.

1. Создать новый workflow

  1. На главной странице нажмите “+ New Workflow”.
  2. Откроется пустой холст с серой панелью слева.

2. Добавить Trigger (Webhooks)

  1. На панели Nodes найдите “Webhook” → перетащите в центр.
  2. В настройках:
    • HTTP Method – POST (Slack будет отправлять POST‑запрос).
    • Path – slack/new-message (получится URL вида https://yourdomain.com/webhook/slack/new-message).
  3. Сохраните – n8n автоматически сгенерирует публичный URL (если у вас включён Expose API / используете ngrok или туннель).
  4. Важно: в Slack‑приложении (или в настройках вашего канала) укажите именно этот URL в качестве Request URL для события message.channels.

3. Обработать входные данные (optional)

Добавим Set‑узел, чтобы вынести только нужные поля.

  1. Добавьте SetConnect от Webhook к Set.
  2. В Fields to Set нажмите Add ValueExpression → вписать:
    • {{ $json["event"]["text"] }} → назовите поле text.
    • {{ $json["event"]["user"] }} → user.
    • {{ $json["event"]["ts"] }} → timestamp.

Это избавит от лишних вложенностей JSON и будет удобно дальше.

4. Добавить Google Sheets (Action)

  1. Найдите Google SheetsAppend (добавить строку в лист).
  2. При первом использовании появится запрос Credentials → выберите Google OAuth2 API → авторизуйтесь (нужен доступ к Google Drive/Sheets).
  3. В настройках укажите:
    • Spreadsheet ID – ID вашего файла (можно скопировать из URL).
    • Sheet Name – Messages.
    • Range – оставьте A1 (n8n сам определит следующую пустую строку).
  4. В секции Values нажмите Add Value для каждой колонки:
    • ={{ $json["text"] }} → Column A.
    • ={{ $json["user"] }} → Column B.
    • ={{ $json["timestamp"] }} → Column C.

5. Обратная связь (optional)

Можно отправить ответ в Slack, чтобы пользователь видел, что сообщение сохранено:

  1. Добавьте SlackMessage (или Post Message).
  2. Укажите Credentials → ваш Slack‑бот.
  3. В Channel можно задать {{ $json["user"] }} (или #general).
  4. Текст сообщения: Message saved to Google Sheet ✅.

6. Соединить узлы

Соедините их в линейную цепочку:

Webhook → Set → Google Sheets Append → Slack Message

7. Тестировать

  1. Нажмите кнопку “Play” в правом верхнем углу → workflow перейдёт в режим Active (триггер включён).
  2. Отправьте сообщение в канале Slack, где установлен ваш бот.
  3. Проверьте:
    • Получили ли вы ответ в Slack?
    • Появилась ли строка в Google Sheet?

Если всё работает → Сохраните workflow (Ctrl+S).

8. Делать запуск в проде

  • Чтобы workflow был доступен постоянно, активируйте его в виде “Active” (кнопка переключения рядом с названием).
  • При необходимости добавьте Error Workflow: в правом меню → Workflow Settings → Error Workflow → выберите отдельный воркфлоу, который будет отправлять письма администратору, если возникнет ошибка.

Расширенные возможности

1. Параллельные ветки и условия

  • IF node: разбивает поток на true/false.
  • SplitInBatches: разбивает массив (например, список заказов) на партии по N штук, чтобы не перебрать лимиты API.
  • Merge: собирает результаты обратно.

2. Циклические вызовы (Loop)

n8n официально не поддерживает «while», но вы можете имитировать:

Webhook → Function (return [{continue: true, data: …}]) → IF (continue === true) → Function (modify data) → Merge (keep looping) …

Для большинства задач достаточно Execute Workflow + Recursive‑вызов с ограничением глубины.

3. Динамический Webhook

Внутри одного воркфлоу можно генерировать новые webhook‑URL через Set + Expression {{ $node["Webhook"].webhookUrl }} и отдать их внешним клиентам.

4. Управление секретами через Environment Variables

В настройках n8n (.env или Docker -e) можно объявить переменные, а в узлах использовать {{ $env["MY_API_KEY"] }}. Это удобно для CI/CD.

5. Versioning & Deployment

  • Export/Import: каждый воркфлоу можно экспортировать в JSON и импортировать в другую инстанцию (Git, CI).
  • Git Integration (сообществом): есть готовый кастомный node n8n-node-git, позволяющий хранить версии в репозитории.
  • Docker‑Compose + docker‑restart: при изменении кода (custom nodes) перезапускайте контейнер – n8n автоматически подхватит новые файлы из /home/node/.n8n/custom.

6. Пишем свой node (Custom node)

  1. Создайте каталог custom-nodes внутри ~/.n8n.
  2. Структура:
custom-nodes/
├─ MyNode/
│  ├─ MyNode.node.ts   (TypeScript)  // или .js
│  └─ package.json
  1. Пример простейшего node:
import { INodeType, INodeTypeDescription, IExecuteFunctions } from 'n8n-workflow';

export class MyNode implements INodeType {
  description: INodeTypeDescription = {
    displayName: 'My Node',
    name: 'myNode',
    group: ['transform'],
    version: 1,
    description: 'Пример кастомного узла',
    defaults: {
      name: 'My Node',
    },
    inputs: ['main'],
    outputs: ['main'],
    properties: [
      {
        displayName: 'Input Text',
        name: 'inputText',
        type: 'string',
        default: '',
      },
    ],
  };

  async execute(this: IExecuteFunctions) {
    const items = this.getInputData();
    const returnData = [];

    for (let i = 0; i < items.length; i++) {
      const text = this.getNodeParameter('inputText', i) as string;
      returnData.push({ json: { result: text.toUpperCase() } });
    }

    return this.prepareOutputData(returnData);
  }
}
  1. Перезапустите n8n – узел появится в палитре.

7. Мониторинг и логирование

  • Built‑in UIExecution List: отображает каждый запуск, статус, время, детали.
  • External logging: задайте переменную LOG_LEVEL=debug и вывод будет в stdout контейнера.
  • Для продакшена удобно подключать ELK/Grafana, используя Docker‑лог драйвер (--log-driver=json-file и forward).

Как быстро научиться создавать воркфлоу

Ресурс Что даст
Официальный docshttps://docs.n8n.io Полный справочник по каждому node, примеры.
YouTube channel “n8n.io” Видео‑уроки от базовых до продвинутых (по 5‑15 мин).
n8n Community Forum Отвечают на вопросы, делятся готовыми шаблонами.
Awesome-n8n (GitHub) Коллекция готовых workflow‑ов и custom‑nodes.
n8n.io/templates Готовые шаблоны (Slack → Google Sheets, Shopify → Telegram и т.д.).
Книги/Курсы Udemy “Automate everything with n8n” – полезен для практических проектов.

Часто задаваемые вопросы (FAQ)

Вопрос Ответ
Где хранится состояние workflow? По умолчанию в SQLite (~/.n8n/database.sqlite). Можно переключить на Postgres (DB_TYPE=postgresdb), MySQL или MariaDB.
Можно ли запускать воркфлоу без веб‑интерфейса? Да – через CLI: n8n execute --workflowId=12. Подходит для cron‑jobs.
Что делать, если Webhook не вызывается (NAT/Firewall)? Убедитесь, что порт 5678 открыт и/или используйте n8n Cloud, ngrok, cloudflare tunnel.
Как ограничить количество одновременных запусков? В Settings → Workflow → Max Execution Time задайте таймаут; в n8n.config.js можно указать maxConcurrentExecutions.
Можно ли интегрировать с Docker Swarm / Kubernetes? Да, используйте официальный Helm‑chart, задавайте N8N_HOST и N8N_PORT, а также переменные EXECUTIONS_PROCESS=main.
Как отлавливать ошибки и отправлять алерты? Добавьте отдельный Error Workflow (через UI → Settings → Error Workflow) и в нём отправьте email, Slack, PagerDuty.
Можно ли использовать два триггера в одном workflow? Нет, в одном воркфлоу только один Trigger node. Нужно создать два отдельных workflow и объединить их через Execute Workflow или Webhook‑мульти‑endpoint.
Как масштабировать обработку больших массивов (например, 10 000 записей)? Используйте SplitInBatches (например, 500) и Execute Workflow в каждой партии; включите “Execute Workflow as Child Process” для распределения нагрузки.
Что такое “Credential type = OAuth2” и как обновлять токен? n8n автоматически хранит refresh token и обновляет access‑token при необходимости. Для кастомных сервисов указывайте accessTokenUrl, authUri, scope.
Как сделать workflow доступным только по токену? В Workflow Settings → Authentication включите API Key и укажите имя заголовка (X-API-KEY). Затем клиенту нужно передавать этот заголовок.

Мини‑чеклист для собственного workflow

  1. Определите цель (что должно происходить, какие данные входят/выходят).
  2. Создайте Trigger (Webhook, Cron, Polling).
  3. Подготовьте и очистите данные (Set, Function, Remove, SplitInBatches).
  4. Выполните основную бизнес‑логику (API‑запросы, DB‑операции, трансформации).
  5. Обработайте результат (логирование, запись в хранилище, уведомление).
  6. Настройте Error handling (Error workflow, try‑catch через IF).
  7. Тестируйте на небольшом наборе → проверьте логи.
  8. Переведите в режим Active и задайте мониторинг.
  9. Бэкапы: экспортируйте JSON в репозиторий, делайте dump базы.
  10. Документируйте: в Workflow → Settings → Description напишите краткое описание и ссылку на схему.

Пример готового JSON‑workflow (для вышеописанного Slack → Google Sheets)

{
  "name": "Slack → Google Sheet",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "slack/new-message",
        "responseMode": "onReceived"
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [250, 200]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "text",
              "value": "={{ $json[\"event\"][\"text\"] }}"
            },
            {
              "name": "user",
              "value": "={{ $json[\"event\"][\"user\"] }}"
            },
            {
              "name": "timestamp",
              "value": "={{ $json[\"event\"][\"ts\"] }}"
            }
          ]
        },
        "options": {}
      },
      "name": "Set Message",
      "type": "n8n-nodes-base.set",
      "typeVersion": 2,
      "position": [500, 200]
    },
    {
      "parameters": {
        "sheetId": "1ABcdefGhIJKLmnoPQRstuVwXyZ-1234567890",
        "range": "A1",
        "valueInputMode": "RAW",
        "values": [
          [
            "={{ $json[\"text\"] }}",
            "={{ $json[\"user\"] }}",
            "={{ $json[\"timestamp\"] }}"
          ]
        ]
      },
      "name": "Append to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 1,
      "position": [750, 200],
      "credentials": {
        "googleApi": {
          "id": "1",
          "name": "Google OAuth2"
        }
      }
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "channel": "={{ $json[\"user\"] }}",
        "text": "Message saved to Google Sheet ✅"
      },
      "name": "Notify Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [1000, 200],
      "credentials": {
        "slackApi": {
          "id": "2",
          "name": "Slack Bot"
        }
      }
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Set Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Message": {
      "main": [
        [
          {
            "node": "Append to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append to Sheet": {
      "main": [
        [
          {
            "node": "Notify Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionTimeout": 3600
  },
  "id": "23"
}

Импортировать такой JSON можно через Workflow → Import from File.


Заключение

n8n – мощный, гибкий и полностью открытый инструмент для построения автоматизаций.
Создавать workflow в нём легче, чем в большинстве традиционных платформ, потому что:

  • Визуально – перетаскивание узлов и автодополнение выражений.
  • Кодом – вы всегда можете «написать» JavaScript, если готовой функции нет.
  • Самоконтролем – собственный хостинг, хранение данных и возможность писать кастомные node.

Следуя описанному выше пошаговому процессу, вы сможете быстро собрать свои первые автоматизации, а дальше расширять их, используя условные ветки, циклы, кастомные узлы и интеграцию с CI/CD.

Если возникнут конкретные вопросы (например, аутентификация OAuth2 для вашего API, настройка масштабирования в Kubernetes или отладка Webhook‑ов за NAT), задавайте – будем разбирать подробно!