Подробное пособие по работе с 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
- На главной странице нажмите “+ New Workflow”.
- Откроется пустой холст с серой панелью слева.
2. Добавить Trigger (Webhooks)
- На панели Nodes найдите “Webhook” → перетащите в центр.
- В настройках:
- HTTP Method – POST (Slack будет отправлять POST‑запрос).
- Path – slack/new-message (получится URL вида https://yourdomain.com/webhook/slack/new-message).
- Сохраните – n8n автоматически сгенерирует публичный URL (если у вас включён Expose API / используете ngrok или туннель).
- Важно: в Slack‑приложении (или в настройках вашего канала) укажите именно этот URL в качестве Request URL для события message.channels.
3. Обработать входные данные (optional)
Добавим Set‑узел, чтобы вынести только нужные поля.
- Добавьте Set → Connect от Webhook к Set.
- В Fields to Set нажмите Add Value → Expression → вписать:
- {{ $json["event"]["text"] }} → назовите поле text.
- {{ $json["event"]["user"] }} → user.
- {{ $json["event"]["ts"] }} → timestamp.
Это избавит от лишних вложенностей JSON и будет удобно дальше.
4. Добавить Google Sheets (Action)
- Найдите Google Sheets → Append (добавить строку в лист).
- При первом использовании появится запрос Credentials → выберите Google OAuth2 API → авторизуйтесь (нужен доступ к Google Drive/Sheets).
- В настройках укажите:
- Spreadsheet ID – ID вашего файла (можно скопировать из URL).
- Sheet Name – Messages.
- Range – оставьте A1 (n8n сам определит следующую пустую строку).
- В секции Values нажмите Add Value для каждой колонки:
- ={{ $json["text"] }} → Column A.
- ={{ $json["user"] }} → Column B.
- ={{ $json["timestamp"] }} → Column C.
5. Обратная связь (optional)
Можно отправить ответ в Slack, чтобы пользователь видел, что сообщение сохранено:
- Добавьте Slack → Message (или Post Message).
- Укажите Credentials → ваш Slack‑бот.
- В Channel можно задать {{ $json["user"] }} (или #general).
- Текст сообщения: Message saved to Google Sheet ✅.
6. Соединить узлы
Соедините их в линейную цепочку:
Webhook → Set → Google Sheets Append → Slack Message
7. Тестировать
- Нажмите кнопку “Play” в правом верхнем углу → workflow перейдёт в режим Active (триггер включён).
- Отправьте сообщение в канале Slack, где установлен ваш бот.
- Проверьте:
- Получили ли вы ответ в 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)
- Создайте каталог custom-nodes внутри ~/.n8n.
- Структура:
custom-nodes/ ├─ MyNode/ │ ├─ MyNode.node.ts (TypeScript) // или .js │ └─ package.json
- Пример простейшего 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);
}
}
- Перезапустите n8n – узел появится в палитре.
7. Мониторинг и логирование
- Built‑in UI → Execution List: отображает каждый запуск, статус, время, детали.
- External logging: задайте переменную LOG_LEVEL=debug и вывод будет в stdout контейнера.
- Для продакшена удобно подключать ELK/Grafana, используя Docker‑лог драйвер (--log-driver=json-file и forward).
Как быстро научиться создавать воркфлоу
| Ресурс | Что даст |
|---|---|
| Официальный docs – https://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
- Определите цель (что должно происходить, какие данные входят/выходят).
- Создайте Trigger (Webhook, Cron, Polling).
- Подготовьте и очистите данные (Set, Function, Remove, SplitInBatches).
- Выполните основную бизнес‑логику (API‑запросы, DB‑операции, трансформации).
- Обработайте результат (логирование, запись в хранилище, уведомление).
- Настройте Error handling (Error workflow, try‑catch через IF).
- Тестируйте на небольшом наборе → проверьте логи.
- Переведите в режим Active и задайте мониторинг.
- Бэкапы: экспортируйте JSON в репозиторий, делайте dump базы.
- Документируйте: в 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), задавайте – будем разбирать подробно!