"Быстрый
</p>
<ul>
<li>n8n — self-hosted альтернатива Zapier/Make: визуальный редактор workflow, 400+ нод, AI-агенты, бесплатно</li>
<li>Установка за минуту: docker run -p 5678:5678 docker.n8n.io/n8nio/n8n → открываешь localhost:5678</li>
<li>Данные между нодами передаются как JSON, обращаешься через {{$json["field"]}}</li>
<li>AI-агент = LLM + Tools: агент сам выбирает какой инструмент вызвать под задачу</li>
<li>Все API-ключи — в переменные окружения, не в workflow. Всегда.</li>
</ul>
<p>
<h2>Зачем n8n и почему это работает</h2>
<p>Есть три способа автоматизировать рутину. Написать <a class="wpil_keyword_link" href="https://it-apteka.com/category/scripts/" target="_blank" rel="noopener" title="Скрипты" data-wpil-keyword-link="linked" data-wpil-monitor-id="2358">скрипт</a> на Python — три дня кода, два дня отладки OAuth, через месяц API поменялся и скрипт сломался. Пойти в Zapier <a href="https://it-apteka.com/freepbx-ustanovka-i-nastrojka-na-debian-s-nulja/" title="FreePBX: установка и настройка на Debian с нуля — полное руководство" target="_blank" rel="noopener" data-wpil-monitor-id="2363">— полчаса настройки</a>, потом получаешь счёт на $500/месяц и объясняешь руководству что такое «подписка за автоматизацию». Делать руками — 5 минут на заявку, умножаешь на 100 заявок, получаешь рабочий день потраченный на копипасту.</p>
<p><a class="wpil_keyword_link" href="https://it-apteka.com/tag/n8n/" target="_blank" rel="noopener" title="n8n" data-wpil-keyword-link="linked" data-wpil-monitor-id="2355">n8n</a> — четвёртый вариант. Полчаса настройки один раз, потом работает само, бесплатно, данные только у тебя.</p>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Python скрипт</th>
<th>Zapier</th>
<th>n8n self-hosted</th>
</tr>
</thead>
<tbody>
<tr>
<td>Стоимость</td>
<td>$0</td>
<td>от $19.99/мес, 50k задач — $599</td>
<td>$0 навсегда</td>
</tr>
<tr>
<td>Время запуска</td>
<td>3-7 дней</td>
<td>30 минут</td>
<td>30 минут</td>
</tr>
<tr>
<td>Поддержка</td>
<td>Ты сам</td>
<td>Они сами</td>
<td>Ты + комьюнити</td>
</tr>
<tr>
<td>Свой код</td>
<td>Полностью</td>
<td>Ограниченно</td>
<td>JavaScript в ноде</td>
</tr>
<tr>
<td>Ваши данные</td>
<td>У тебя</td>
<td>На серверах Zapier</td>
<td>Только у тебя</td>
</tr>
<tr>
<td>AI-агенты</td>
<td>Пишешь сам</td>
<td>Базово</td>
<td>Нативная поддержка</td>
</tr>
<tr>
<td>GDPR/compliance</td>
<td>Полный контроль</td>
<td>Проблемно</td>
<td>Полный контроль</td>
</tr>
</tbody>
</table>
<p>n8n проигрывает по одному пункту: нужен свой сервер. VPS за $5-10 в месяц решает вопрос полностью.</p>
<h2>Архитектура: как n8n устроен</h2>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
INET["Интернет / внешние сервисы"]
NGINX["Nginx (reverse proxy + SSL)"]
N8N["n8n (порт 5678)"]
PG["PostgreSQL (workflow и executions)"]
VOL["<a class="wpil_keyword_link" href="https://it-apteka.com/tag/docker/" target="_blank" rel="noopener" title="Docker" data-wpil-keyword-link="linked" data-wpil-monitor-id="2360">Docker</a> volume (файлы)"]
TRIG["Trigger Nodes: Webhook, Schedule, Telegram, Email"]
ACTION["Action Nodes: HTTP, DB, Slack, OpenAI"]
LOGIC["Logic Nodes: IF, Switch, Loop, Merge"]
INET -->|"HTTPS 443"| NGINX
NGINX -->|"HTTP 5678"| N8N
N8N --> PG
N8N --> VOL
TRIG -->|"запускает"| ACTION
ACTION --> LOGIC
LOGIC -->|"результат"| INET
style N8N fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style NGINX fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style PG fill:#f8fafc,stroke:#3b82f6,stroke-width:1px,color:#1e293b
style TRIG fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style ACTION fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style LOGIC fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style INET fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style VOL fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
</pre>
<p>Workflow — это цепочка нод. Trigger запускает процесс. Action делает что-то с данными или вызывает внешний API. Logic управляет потоком: ветвит, циклит, объединяет. Данные между нодами — JSON.</p>
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>Рекомендуется</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU</td>
<td>1 vCPU</td>
<td>2+ vCPU</td>
<td>При параллельных workflow нужно больше</td>
</tr>
<tr>
<td>RAM</td>
<td>512 MB</td>
<td>2 GB</td>
<td>PostgreSQL + n8n + Nginx суммарно ~600 MB</td>
</tr>
<tr>
<td>Диск</td>
<td>5 GB</td>
<td>20 GB</td>
<td>Логи и бэкапы растут</td>
</tr>
<tr>
<td>ОС</td>
<td>Ubuntu 20.04+</td>
<td><a href="https://it-apteka.com/linux-v-aprele-2026-jadro-7-0-ubuntu-26-04-lts-i-francija-brosaet-windows/" title="Linux в апреле 2026: ядро 7.0, Ubuntu 26.04 LTS и Франция бросает Windows" target="_blank" rel="noopener" data-wpil-monitor-id="2372">Ubuntu 22.04 LTS</a></td>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2356">Debian</a>, CentOS — тоже работают</td>
</tr>
<tr>
<td>Docker</td>
<td>20.10+</td>
<td>24.x</td>
<td>docker-compose v2</td>
</tr>
<tr>
<td>Node.js</td>
<td>18.x</td>
<td>20.x LTS</td>
<td>Только для npm-установки, не для Docker</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна n8n 1.x. Перед установкой проверь свежую версию на <a href="https://github.com/n8n-io/n8n/releases" target="_blank" rel="nofollow noopener">github.com/n8n-io/n8n/releases</a>.</p>
<h2>Установка n8n</h2>
<h3>Быстрый старт: Docker одной командой</h3>
<p>Для теста и знакомства. Данные в SQLite, хватит для первых шагов.</p>
<pre><code class="language-bash">
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
# Открываешь: http://localhost:5678
</code></pre>
<h3>Production: Docker Compose + PostgreSQL</h3>
<p>Для <a href="https://it-apteka.com/rukovodstvo-po-optimizacii-postgresql-i-mysql-5-realnyh-primerov-s-gotovymi-skriptami/" title="Руководство по оптимизации PostgreSQL и MySQL: 5 реальных примеров с готовыми скриптами" target="_blank" rel="noopener" data-wpil-monitor-id="2364">реальной работы нужна PostgreSQL</a> — SQLite теряет данные при некоторых обновлениях и не справляется с нагрузкой.</p>
<pre><code class="language-bash">
mkdir n8n && cd n8n
nano docker-compose.yml
</code></pre>
<pre><code class="language-text">
version: '3.8'
services:
postgres:
image: postgres:15
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_secure_password
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U n8n']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
depends_on:
postgres:
condition: service_healthy
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_secure_password
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=SecurePassword123!
- N8N_HOST=n8n.example.com
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.example.com/
- GENERIC_TIMEZONE=Europe/Moscow
- N8N_METRICS=true
- N8N_ENCRYPTION_KEY=generate_random_32char_key_here
volumes:
- ./n8n_data:/home/node/.n8n
- ./local_files:/files
volumes:
postgres_data:
</code></pre>
"N8N_ENCRYPTION_KEY
<br />
Сгенерируй один раз и запиши в безопасное место. Если потеряешь — все Credentials в базе станут нечитаемы. Мигрировать на другой сервер без него тоже не получится.<br />
<pre><code class="language-bash">
# Генерируем ключ
openssl rand -hex 16
# Запускаем
docker-compose up -d
# Следим за запуском
docker-compose logs -f n8n
# Обновление в будущем
docker-compose pull && docker-compose up -d
</code></pre>
<h3>Установка через npm (только для разработки)</h3>
<pre><code class="language-bash">
# Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
# n8n глобально
npm install n8n -g
# Запуск
n8n start
# http://localhost:5678
</code></pre>
<p>Для продакшна не подходит: нет изоляции, нет автозапуска, зависимости конфликтуют.</p>
<h3>HTTPS через Nginx</h3>
<pre><code class="language-bash">
sudo apt install nginx certbot python3-certbot-nginx -y
sudo nano /etc/nginx/sites-available/n8n
</code></pre>
<pre><code class="language-text">
server {
listen 80;
server_name n8n.example.com;
location / {
proxy_pass http://localhost:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket - обязателен для n8n
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Долгие workflow не должны таймаутиться
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
}
}
</code></pre>
<pre><code class="language-bash">
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
# SSL
sudo certbot --nginx -d n8n.example.com
sudo certbot renew --dry-run
</code></pre>
<h3>n8n Cloud — если сервера нет</h3>
<p>Идёшь на <a href="https://n8n.io" target="_blank" rel="noopener">n8n.io</a>, регистрируешься, получаешь готовый инстанс.</p>
<table>
<thead>
<tr>
<th>План</th>
<th>Цена</th>
<th>Лимиты</th>
</tr>
</thead>
<tbody>
<tr>
<td>Free (trial)</td>
<td>$0</td>
<td>20 workflow, 2 500 executions/мес</td>
</tr>
<tr>
<td>Starter</td>
<td>$20/мес</td>
<td>Неограниченно workflow, 10 000 executions</td>
</tr>
<tr>
<td>Pro</td>
<td>$50/мес</td>
<td>50 000 executions + расширенные функции</td>
</tr>
</tbody>
</table>
<p>Минус: данные не у тебя. Для GDPR и работы с клиентскими данными — self-hosted предпочтительнее.</p>
<h2>Основы workflow: как это работает</h2>
<h3>Структура любого workflow</h3>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
T["Trigger Node (запуск)"]
A1["Action Node 1"]
L["Logic Node (IF/Switch)"]
A2["Action: true ветка"]
A3["Action: false ветка"]
T -->|"JSON"| A1
A1 -->|"JSON"| L
L -->|"true"| A2
L -->|"false"| A3
style T fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style A1 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style A2 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style A3 fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style L fill:#f8fafc,stroke:#3b82f6,stroke-width:1px,color:#1e40af
</pre>
<p>Trigger запускает процесс — по расписанию, по вебхуку, по событию в мессенджере. Данные передаются как JSON между нодами. Каждая нода видит выход предыдущей.</p>
<h3>Первый workflow за 5 минут: погода в Slack</h3>
<p>Открой n8n, нажми New Workflow. Добавляй ноды через кнопку «+».</p>
<pre><code class="language-text">
Schedule Trigger
Rule: Every day at 08:00
|
HTTP Request
Method: GET
URL: https://wttr.in/Moscow?format=3
|
Slack (Post Message)
Channel: #general
Text: {{$json["data"]}}
</code></pre>
<p>Нажми «Execute Workflow» — проверь что данные прошли через каждую ноду. Активируй. Каждый день в 8:00 погода в Slack.</p>
<h2>Шпаргалка по expressions</h2>
<p>Expressions — двойные фигурные скобки с JavaScript внутри. Доступны в любом текстовом поле любой ноды.</p>
<pre><code class="language-javascript">
// --- Базовый доступ к данным ---
// Поле из предыдущей ноды
{{$json["field_name"]}}
// Вложенные поля
{{$json["user"]["email"]}}
// Массив по индексу
{{$json["items"][0]["name"]}}
// Данные из конкретной ноды (по имени в UI)
{{$node["HTTP Request"].json["result"]}}
// --- Переменные и окружение ---
// Переменная окружения
{{$env["API_KEY"]}}
// Параметры workflow
{{$workflow.name}}
// Индекс текущего элемента в Loop
{{$itemIndex}}
// --- Дата и время ---
// Текущая дата+время (Luxon объект)
{{$now}}
// Форматирование
{{$now.format("YYYY-MM-DD")}}
{{$now.format("DD.MM.YYYY HH:mm")}}
// Сегодня + 7 дней
{{$now.plus({days: 7}).toISODate()}}
// Unix timestamp
{{$now.toUnixInteger()}}
// --- JavaScript в выражениях ---
// Тернарный оператор
{{$json["status"] === "active" ? "Активен" : "Неактивен"}}
// Конкатенация
{{"Привет, " + $json["user"]["name"] + "!"}}
// Число → строка с форматированием
{{$json["price"].toFixed(2) + " ₽"}}
// Текущий год
{{new Date().getFullYear()}}
// Проверка наличия поля
{{$json["email"] !== undefined ? $json["email"] : "не указан"}}
// --- Работа со строками ---
// Верхний регистр
{{$json["name"].toUpperCase()}}
// Обрезать пробелы
{{$json["input"].trim()}}
// Заменить подстроку
{{$json["text"].replace("старое", "новое")}}
// Разбить строку
{{$json["tags"].split(",")[0]}}
// --- Работа с массивами ---
// Длина массива
{{$json["items"].length}}
// Первый элемент
{{$json["items"][0]}}
// Последний элемент
{{$json["items"][$json["items"].length - 1]}}
// Join массива в строку
{{$json["tags"].join(", ")}}
</code></pre>
<h2>Шпаргалка по нодам</h2>
<h3>Trigger Nodes — запуск workflow</h3>
<table>
<thead>
<tr>
<th>Нода</th>
<th>Когда срабатывает</th>
<th>Типичное применение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Webhook</td>
<td>HTTP POST/GET на URL n8n</td>
<td>Интеграция с любым сервисом через HTTP</td>
</tr>
<tr>
<td>Schedule Trigger</td>
<td>По расписанию (cron)</td>
<td>Ежедневные отчёты, <a class="wpil_keyword_link" href="https://it-apteka.com/category/monitoring/" target="_blank" rel="noopener" title="Мониторинг" data-wpil-keyword-link="linked" data-wpil-monitor-id="2361">мониторинг</a>, бэкапы</td>
</tr>
<tr>
<td>Email Trigger (IMAP)</td>
<td>Новое письмо в ящике</td>
<td>Автоматическая обработка входящих писем</td>
</tr>
<tr>
<td><a class="wpil_keyword_link" href="https://t.me/it_apteka_com/34" target="_blank" rel="noopener" title="Telegram" data-wpil-keyword-link="linked" data-wpil-monitor-id="2359">Telegram</a> Trigger</td>
<td>Сообщение боту в Telegram</td>
<td>Telegram боты любой сложности</td>
</tr>
<tr>
<td>Manual Trigger</td>
<td>Ручной запуск из UI</td>
<td>Тестирование, одноразовые задачи</td>
</tr>
<tr>
<td>Chat Trigger</td>
<td>Сообщение во встроенный чат n8n</td>
<td>Тестирование AI-агентов</td>
</tr>
</tbody>
</table>
<h3>Action Nodes — выполняют действия</h3>
<table>
<thead>
<tr>
<th>Нода</th>
<th>Что делает</th>
<th>Ключевые параметры</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP Request</td>
<td>Запрос к любому API</td>
<td>Method, URL, Headers, Body, Auth</td>
</tr>
<tr>
<td>Code</td>
<td>JavaScript или Python код</td>
<td>Полный доступ к данным потока, npm-модули</td>
</tr>
<tr>
<td>Set</td>
<td>Установка и изменение полей JSON</td>
<td>Режимы: Set, Add, Keep Only</td>
</tr>
<tr>
<td>Slack</td>
<td>Сообщения, каналы, пользователи</td>
<td>Operation, Channel, Text, Attachments</td>
</tr>
<tr>
<td>Telegram</td>
<td>Отправка сообщений, файлов, кнопок</td>
<td>Chat ID, Text, Reply Markup</td>
</tr>
<tr>
<td>Gmail / SMTP</td>
<td>Отправка и чтение email</td>
<td>To, Subject, HTML Body</td>
</tr>
<tr>
<td>Google Sheets</td>
<td>Чтение и запись таблиц</td>
<td>Spreadsheet ID, Sheet, Range, Operation</td>
</tr>
<tr>
<td>PostgreSQL / <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mysql/" target="_blank" rel="noopener" title="MySQL" data-wpil-keyword-link="linked" data-wpil-monitor-id="2362">MySQL</a></td>
<td>SQL запросы к базе</td>
<td>Query, Parameters</td>
</tr>
<tr>
<td>OpenAI</td>
<td>ChatGPT, DALL-E, Embeddings</td>
<td>Model, Messages, Temperature</td>
</tr>
<tr>
<td>Execute Workflow</td>
<td>Вызов другого workflow</td>
<td>Workflow ID, Input Data</td>
</tr>
</tbody>
</table>
<h3>Logic Nodes — управление потоком</h3>
<table>
<thead>
<tr>
<th>Нода</th>
<th>Что делает</th>
<th>Когда использовать</th>
</tr>
</thead>
<tbody>
<tr>
<td>IF</td>
<td>Ветвление: true/false</td>
<td>Проверить одно условие</td>
</tr>
<tr>
<td>Switch</td>
<td>Множественное ветвление</td>
<td>Разные действия по значению поля</td>
</tr>
<tr>
<td>Merge</td>
<td>Объединение данных из веток</td>
<td>Собрать результаты параллельных веток</td>
</tr>
<tr>
<td>Loop Over Items</td>
<td>Цикл по каждому элементу массива</td>
<td>Обработать список записей</td>
</tr>
<tr>
<td>Split In Batches</td>
<td>Разбивка массива на батчи</td>
<td>Обработка больших объёмов без OOM</td>
</tr>
<tr>
<td>Wait</td>
<td>Пауза на заданное время</td>
<td>Rate limiting API, отложенные действия</td>
</tr>
<tr>
<td>Stop And Error</td>
<td>Принудительная остановка с ошибкой</td>
<td>Валидация входных данных</td>
</tr>
</tbody>
</table>
<h2>AI-агенты в n8n</h2>
<h3>Разница: чат-бот vs AI-агент</h3>
<p>Чат-бот отвечает из контекста. <a href="https://it-apteka.com/qwen3-coder-next-besplatnyj-ii-dlja-kodinga-lokalno-ustanovka-cli-i-sravnenie-agentov-2026/" title="Qwen3 Coder Next: бесплатный ИИ для кодинга локально — установка, CLI и сравнение агентов 2026" target="_blank" rel="noopener" data-wpil-monitor-id="2365">Агент использует Tools —</a> реально что-то делает: проверяет базу, отправляет письмо, создаёт тикет. Сам выбирает что вызвать под конкретную задачу.</p>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
USER["Вопрос: статус заказа 12345?"]
AGENT["AI Agent (GPT-4 / Claude)"]
T1["Tool: Check Order API"]
T2["Tool: Create Jira Ticket"]
T3["Tool: Send Email"]
RESP["Ответ: заказ отправлен, трек ABC123"]
USER --> AGENT
AGENT -->|"выбирает нужный Tool"| T1
T1 -->|"данные заказа"| AGENT
AGENT --> RESP
AGENT -.->|"при необходимости"| T2
AGENT -.->|"при необходимости"| T3
style AGENT fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style USER fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style T1 fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style T2 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style T3 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style RESP fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h3>Создание AI-агента: пошагово</h3>
<pre><code class="language-text">
Chat Trigger (тестирование в UI)
|
AI Agent
Model: OpenAI GPT-4 или Claude
System Message: "Ты помощник поддержки. Используй tools."
Tools:
- HTTP Request Tool (статус заказа через API)
- PostgreSQL Tool (поиск клиента в БД)
- Email Tool (отправить письмо)
- HTTP Request Tool (создать тикет в Jira)
|
Telegram / Slack (отправить ответ)
</code></pre>
<h3>Подключение OpenAI</h3>
<pre><code class="language-bash">
# Settings -> Credentials -> Add Credential -> OpenAI API
# Вставляешь: sk-xxxxxxxxxxxxxxxx
</code></pre>
<p>Использование в OpenAI Chat ноде:</p>
<pre><code class="language-text">
Operation: Chat
Model: gpt-4-turbo
Messages:
role: system | content: You are a helpful assistant
role: user | content: {{$json["user_message"]}}
</code></pre>
<h3>Подключение Anthropic Claude</h3>
<pre><code class="language-bash">
# Credentials -> Add -> HTTP Header Auth
# Header Name: x-api-key
# Header Value: sk-ant-xxxxxxxxxxxx
</code></pre>
<pre><code class="language-javascript">
// HTTP Request нода -> Claude API
Method: POST
URL: https://api.anthropic.com/v1/messages
Headers:
x-api-key: {{$env["ANTHROPIC_API_KEY"]}}
anthropic-version: 2023-06-01
content-type: application/json
Body:
{
"model": "claude-opus-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "{{$json['question']}}"}
]
}
</code></pre>
<h3>RAG: агент с базой знаний</h3>
<pre><code class="language-text">
Вопрос пользователя
|
Vector Store Tool (поиск в Pinecone / Qdrant / Weaviate)
|
AI Agent (отвечает с контекстом из найденных документов)
|
Ответ (без галлюцинаций, основан на реальных данных)
</code></pre>
<p>Загружаешь документы, создаёшь embeddings, сохраняешь в Vector DB. Агент при каждом вопросе ищет релевантные фрагменты и отвечает опираясь на них.</p>
<h2>Telegram боты в n8n</h2>
<h3>Быстрый старт: эхо-бот</h3>
<p>Создай бота через @BotFather, получи токен. В n8n: Settings — Credentials — Telegram API — вставь токен.</p>
<pre><code class="language-text">
Telegram Trigger (On Message)
|
Set
chat_id: {{$json["message"]["chat"]["id"]}}
text: {{$json["message"]["text"]}}
|
Telegram (Send Message)
Chat ID: {{$json["chat_id"]}}
Text: Ты написал: {{$json["text"]}}
</code></pre>
<h3>Бот с ChatGPT</h3>
<pre><code class="language-text">
Telegram Trigger
|
OpenAI (Chat)
User Message: {{$json["message"]["text"]}}
|
Telegram (Send Message)
Chat ID: {{$json["message"]["chat"]["id"]}}
Text: {{$json["choices"][0]["message"]["content"]}}
</code></pre>
<h3>Бот с командами</h3>
<pre><code class="language-text">
Telegram Trigger
|
Switch (по тексту сообщения)
/start -> Set (текст приветствия)
/help -> Set (текст справки)
/price -> HTTP Request (цена из API)
default -> OpenAI (AI-ответ на произвольный вопрос)
|
Telegram (Send Message)
</code></pre>
<h3>Бот с кнопками (Inline Keyboard)</h3>
<pre><code class="language-javascript">
// В Telegram ноде, поле Reply Markup
{
"inline_keyboard": [
[
{"text": "Статус заказа", "callback_data": "check_order"},
{"text": "Связаться с оператором", "callback_data": "human"}
],
[
{"text": "Часто задаваемые вопросы", "callback_data": "faq"}
]
]
}
</code></pre>
<p>Обработка нажатий на кнопки:</p>
<pre><code class="language-text">
Telegram Trigger (On Callback Query)
|
Switch (по callback_data)
"check_order" -> HTTP Request (API статуса заказа)
"human" -> Slack (уведомить оператора)
"faq" -> Set (текст FAQ)
|
Telegram (Answer Callback Query)
Telegram (Send Message с результатом)
</code></pre>
<h2>Готовые шаблоны</h2>
<p>Библиотека: <a href="https://n8n.io/workflows/" target="_blank" rel="noopener">n8n.io/workflows</a> — тысячи workflow. Скачиваешь JSON, импортируешь через «…» <a href="https://it-apteka.com/dhcp-snooping-chto-jeto-takoe-i-kak-zashhitit-set-ot-rogue-dhcp-servera/" title="DHCP Snooping — What It Is and How to Protect Your Network from a Rogue" target="_blank" rel="noopener" data-wpil-monitor-id="2366">— Import from</a> File, настраиваешь credentials.</p>
<h3>RSS в Telegram/Slack</h3>
<pre><code class="language-text">
RSS Feed Trigger
|
Set (форматирование: заголовок + ссылка)
|
Telegram / Slack (отправка)
</code></pre>
<h3>Email в задачу Jira</h3>
<pre><code class="language-text">
Gmail Trigger (UNSEEN письма)
|
OpenAI (извлечь суть: тема, приоритет, описание)
|
Jira (создать задачу)
|
Gmail (ответить клиенту с номером тикета)
</code></pre>
<h3>Мониторинг сайта</h3>
<pre><code class="language-text">
Schedule Trigger (каждые 5 минут)
|
HTTP Request (GET https://example.com)
|
IF (statusCode != 200)
true -> Slack (алерт: код ошибки + время)
false -> (ничего, продолжаем жить)
</code></pre>
<h3>Ночной бэкап в Google Drive</h3>
<pre><code class="language-text">
Schedule Trigger (03:00)
|
Execute Command (pg_dump | gzip)
|
Google Drive (Upload)
|
Slack (Backup complete: имя файла, размер)
</code></pre>
<h3>AI Content Generator</h3>
<pre><code class="language-text">
Schedule Trigger (раз в неделю)
|
Google Sheets (получить список тем статей)
|
Loop Over Items
|
OpenAI (сгенерировать статью по теме)
|
WordPress (опубликовать)
|
Telegram (анонс в канал)
</code></pre>
<h2>Продвинутые техники</h2>
<h3>Обработка ошибок</h3>
<p>По умолчанию workflow падает при первой ошибке и молчит. В продакшне это неприемлемо <a href="https://it-apteka.com/vpn-na-mikrotik-polnyj-gajd-2026-wireguard-l2tp-ipsec-ikev2-nastrojka-servera-i-klienta/" title="VPN на MikroTik: полный гайд 2026 — WireGuard, L2TP/IPsec, IKEv2, настройка сервера и клиента" target="_blank" rel="noopener" data-wpil-monitor-id="2367">— узнаёшь о проблеме когда клиент</a> уже жалуется.</p>
<p><strong>Глобальный Error Workflow.</strong> Создай отдельный workflow. В Settings — Error Workflow — выбери его. Теперь любая ошибка в любом workflow запускает этот обработчик.</p>
<pre><code class="language-text">
Error Trigger
|
Set
workflow_name: {{$json["workflow"]["name"]}}
error_message: {{$json["execution"]["error"]["message"]}}
execution_id: {{$json["execution"]["id"]}}
|
Slack (алерт в #alerts)
Text: ОШИБКА в {{$json["workflow_name"]}}: {{$json["error_message"]}}
|
Google Sheets (логировать: время, workflow, ошибка)
</code></pre>
<p><strong>Continue On Fail.</strong> В <a href="https://it-apteka.com/mikrotik-routeros-7-nastrojka-ospf-wifi-i-chr-poshagovyj-recept-bez-soplej/" title="MikroTik RouterOS 7: Настройка OSPF, WiFi и CHR — пошаговый рецепт без соплей" target="_blank" rel="noopener" data-wpil-monitor-id="2368">настройках ноды включи «Continue On Fail» —</a> нода не уронит workflow при ошибке, а передаст информацию об ошибке в следующую ноду.</p>
<pre><code class="language-text">
HTTP Request (Continue On Fail: yes)
|
IF ($json["error"] !== undefined)
true -> Slack (алерт) -> Google Sheets (лог)
false -> Обычная обработка данных
</code></pre>
<h3>Переменные окружения</h3>
<p>API-ключи прямо в workflow — это плохо. Кто-то получит доступ к n8n — получит все ключи сразу.</p>
<pre><code class="language-text">
# docker-compose.yml
environment:
- OPENAI_API_KEY=sk-xxxxxxxxxxxx
- ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
- TELEGRAM_BOT_TOKEN=12345:xxxxxxxxxxxx
- SLACK_WEBHOOK=https://hooks.slack.com/...
- DB_URL=postgresql://user:pass@host/db
</code></pre>
<p>Используешь в любой ноде:</p>
<pre><code class="language-javascript">
{{$env["OPENAI_API_KEY"]}}
{{$env["TELEGRAM_BOT_TOKEN"]}}
</code></pre>
<h3>Sub-workflows: переиспользование логики</h3>
<p>Одна и та же логика уведомлений в двадцати workflow — это боль при изменениях. Выноси в отдельный workflow.</p>
<pre><code class="language-text">
// Sub-workflow "Send Notification"
Execute Workflow Trigger (получает: channel, message, severity)
|
IF (severity == "critical")
true -> Slack + Email + Telegram
false -> Только Slack
// Основной workflow вызывает его:
Execute Workflow
Workflow: "Send Notification"
Data: {channel: "#alerts", message: "...", severity: "critical"}
</code></pre>
<h3>Батчинг больших объёмов</h3>
<p>Капля никотина убивает лошадь. Одна нода с 50 000 записей без батчинга убивает n8n.</p>
<pre><code class="language-text">
PostgreSQL (SELECT 50000 records)
|
Split In Batches (по 100 записей)
|
Loop
HTTP Request (обработать батч)
Wait (100ms - rate limiting)
PostgreSQL (UPDATE status)
|
Return to Split (следующий батч)
</code></pre>
<h3>Вебхуки с аутентификацией</h3>
"Открытый
<br />
Без аутентификации любой знающий URL может запустить твой workflow. Всегда защищай вебхуки.<br />
<pre><code class="language-text">
// Webhook нода - настройки Authentication
Authentication: Header Auth
Header Name: X-Webhook-Token
Header Value: (твой секрет из env)
</code></pre>
<p>Проверка в workflow:</p>
<pre><code class="language-text">
Webhook Trigger
|
IF ($headers["x-webhook-token"] === $env["WEBHOOK_SECRET"])
false -> Respond to Webhook (401) + Stop
true -> Основная логика
</code></pre>
<h2>Интеграции: шпаргалка настройки</h2>
<h3>Google Sheets</h3>
<pre><code class="language-text">
// Чтение
Google Sheets (Read)
Spreadsheet ID: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms
Sheet: Sheet1
Range: A1:D100
// Запись новой строки
Google Sheets (Append)
Spreadsheet ID: xxxxx
Sheet: Sheet1
Values: {Name: {{$json["name"]}}, Email: {{$json["email"]}}}
</code></pre>
<h3>Slack</h3>
<pre><code class="language-javascript">
// Простое сообщение
Operation: Post Message
Channel: #alerts
Text: Привет из n8n!
// С вложением (цветная карточка)
Attachments:
[{
"color": "#36a64f",
"title": "Deployment Success",
"text": "Version 2.0 deployed",
"footer": "n8n automation"
}]
</code></pre>
<h3>Email (Gmail / SMTP)</h3>
<pre><code class="language-bash">
# Credentials: SMTP
Host: smtp.gmail.com
Port: 587
User: your@gmail.com
Password: app_password # НЕ основной пароль, app password из настроек Google
</code></pre>
<pre><code class="language-text">
// Email Send нода
To: {{$json["client_email"]}}
Subject: Заказ #{{$json["order_id"]}} принят
HTML: <h1>Спасибо за заказ!</h1><p>{{$json["details"]}}</p>
</code></pre>
<h3>PostgreSQL</h3>
<pre><code class="language-text">
// Параметризованный запрос (защита от SQL injection)
Query: SELECT * FROM orders WHERE status = $1 AND user_id = $2
Parameters: ["pending", {{$json["user_id"]}}]
// Update
Query: UPDATE orders SET status = $1 WHERE id = $2
Parameters: ["processed", {{$json["order_id"]}}]
</code></pre>
<h3>Telegram: отправка файлов и медиа</h3>
<pre><code class="language-text">
// Отправить фото по URL
Telegram (Send Photo)
Chat ID: {{$json["chat_id"]}}
Photo: https://example.com/image.jpg
Caption: Ваш отчёт за {{$now.format("DD.MM.YYYY")}}
// Отправить документ
Telegram (Send Document)
Chat ID: {{$json["chat_id"]}}
Document: {{$binary["report"]}}
</code></pre>
<h2>Безопасность n8n в продакшне</h2>
<table>
<thead>
<tr>
<th>Что защитить</th>
<th>Как защитить</th>
<th>Настройка</th>
</tr>
</thead>
<tbody>
<tr>
<td>Доступ к n8n UI</td>
<td>Basic Auth или OAuth2</td>
<td>N8N_BASIC_AUTH_ACTIVE=true</td>
</tr>
<tr>
<td>Трафик</td>
<td>HTTPS через Nginx</td>
<td>Certbot + конфиг Nginx</td>
</tr>
<tr>
<td>API-ключи</td>
<td>Переменные окружения</td>
<td>$env[«KEY»] в выражениях</td>
</tr>
<tr>
<td>Webhooks</td>
<td>Header Auth</td>
<td>Настройки Webhook ноды</td>
</tr>
<tr>
<td>Encryption Key</td>
<td>Сохранить в KeePass/Vault</td>
<td>N8N_ENCRYPTION_KEY в env</td>
</tr>
<tr>
<td>Порт 5678</td>
<td>Закрыть в firewall</td>
<td>ufw deny 5678</td>
</tr>
<tr>
<td>PostgreSQL</td>
<td>Только внутри Docker <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="2354">network</a></td>
<td>Не пробрасывать порт 5432</td>
</tr>
</tbody>
</table>
<pre><code class="language-bash">
# Закрываем прямой доступ к n8n, оставляем только Nginx
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 22
sudo ufw deny 5678
sudo ufw enable
</code></pre>
<h2>Бэкапы и восстановление</h2>
<h3>Экспорт workflow</h3>
<pre><code class="language-bash">
# Через UI: Settings -> Workflows -> Export All
# Через API
curl -X GET https://n8n.example.com/api/v1/workflows \
-u admin:password \
-H "Accept: application/json" > workflows_backup.json
</code></pre>
<h3>Автоматический бэкап PostgreSQL</h3>
<pre><code class="language-bash">
#!/bin/bash
# /usr/local/bin/backup-n8n.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups/n8n
mkdir -p $BACKUP_DIR
docker exec n8n-postgres pg_dump -U n8n n8n > $BACKUP_DIR/n8n_$DATE.sql
gzip $BACKUP_DIR/n8n_$DATE.sql
# Удаляем старше 30 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "Backup: n8n_$DATE.sql.gz"
</code></pre>
<pre><code class="language-bash">
chmod +x /usr/local/bin/backup-n8n.sh
# Cron: каждую ночь в 3:00
echo "0 3 * * * /usr/local/bin/backup-n8n.sh >> /var/log/n8n-backup.log 2>&1" | crontab -
</code></pre>
<h3>Восстановление</h3>
<pre><code class="language-bash">
docker-compose stop n8n
gunzip -c /backups/n8n/n8n_20260504.sql.gz | \
docker exec -i n8n-postgres psql -U n8n n8n
docker-compose start n8n
</code></pre>
<h3>Миграция на новый сервер</h3>
"Encryption
<br />
Без него Credentials на новом <a href="https://it-apteka.com/dhcp-snooping-chto-jeto-takoe-i-kak-zashhitit-set-ot-rogue-dhcp-servera-2/" title="DHCP Snooping — что это такое и как защитить сеть от Rogue DHCP сервера" target="_blank" rel="noopener" data-wpil-monitor-id="2369">сервере будут нечитаемы —</a> все API-ключи придётся вводить заново. Сначала забираешь ключ, потом переезжаешь.<br />
<pre><code class="language-bash">
# Старый сервер: берём ключ
docker exec n8n env | grep N8N_ENCRYPTION_KEY
# Новый сервер: docker-compose.yml
environment:
- N8N_ENCRYPTION_KEY=тот_же_ключ
</code></pre>
<h2>Troubleshooting: 8 частых проблем с n8n</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Симптом</th>
<th>Решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Webhook не срабатывает</td>
<td>Внешний сервис отправляет POST, workflow молчит</td>
<td>WEBHOOK_URL в env должен быть публичный HTTPS. localhost снаружи недоступен — используй ngrok для разработки</td>
</tr>
<tr>
<td>2</td>
<td>Workflow не активируется</td>
<td>Active не включается или сразу возвращается</td>
<td>Нет Trigger ноды или credentials не настроены. Смотри: docker-compose logs -f n8n</td>
</tr>
<tr>
<td>3</td>
<td>OAuth Unauthorized</td>
<td>Google/GitHub возвращают 401 при авторизации</td>
<td>Redirect URL в OAuth приложении: https://n8n.example.com/rest/oauth2-credential/callback</td>
</tr>
<tr>
<td>4</td>
<td>Данные теряются после рестарта</td>
<td>После docker-compose restart пропадают workflow и executions</td>
<td>SQLite без постоянного volume или PostgreSQL не подключена. Проверь volumes в docker-compose.yml</td>
</tr>
<tr>
<td>5</td>
<td>n8n не стартует после обновления</td>
<td>Контейнер поднимается и сразу останавливается</td>
<td>docker-compose logs n8n — читаешь ошибку. Помогает: docker-compose down && up -d. Крайний случай: откат на конкретную версию image: docker.n8n.io/n8nio/n8n:1.20.0</td>
</tr>
<tr>
<td>6</td>
<td>Workflow тормозит</td>
<td>Execution занимает минуты вместо секунд</td>
<td>Большой массив без Split In Batches. Медленный внешний API. Добавь Wait ноду для rate limiting</td>
</tr>
<tr>
<td>7</td>
<td>Expression error в ноде</td>
<td>Нода падает с ошибкой в {{$json[…]}}</td>
<td>Предыдущая нода вернула другую структуру. Запусти Execute Workflow и кликни ноду — увидишь реальные данные. Добавь IF для проверки наличия поля</td>
</tr>
<tr>
<td>8</td>
<td>WebSocket ошибки в UI</td>
<td>Статус execution не обновляется в реальном времени</td>
<td>В Nginx нет WebSocket заголовков. Добавь proxy_set_header Upgrade $http_upgrade и Connection «upgrade»</td>
</tr>
</tbody>
</table>
<h3>Алгоритм диагностики любой проблемы</h3>
<pre><code class="language-bash">
# 1. Логи n8n
docker-compose logs -f n8n
# 2. Логи PostgreSQL
docker-compose logs -f postgres
# 3. Статус контейнеров
docker-compose ps
# 4. Переменные окружения внутри контейнера
docker exec n8n env | grep N8N
# 5. Ручной запуск workflow в UI
# Execute Workflow -> кликаешь каждую ноду -> видишь входящие и исходящие данные
# 6. Перезапуск
docker-compose restart n8n
</code></pre>
<h2>Чеклист: production-ready n8n</h2>
<table>
<thead>
<tr>
<th>Категория</th>
<th>Пункт</th>
</tr>
</thead>
<tbody>
<tr>
<td>Установка</td>
<td>n8n запущен через docker-compose с PostgreSQL</td>
</tr>
<tr>
<td>Установка</td>
<td>HTTPS настроен через Nginx + Certbot</td>
</tr>
<tr>
<td>Установка</td>
<td>WEBHOOK_URL указывает на публичный домен</td>
</tr>
<tr>
<td>Безопасность</td>
<td>Basic Auth или OAuth2 включены</td>
</tr>
<tr>
<td>Безопасность</td>
<td>API-ключи в переменных окружения, не в workflow</td>
</tr>
<tr>
<td>Безопасность</td>
<td>N8N_ENCRYPTION_KEY сохранён в безопасном месте</td>
</tr>
<tr>
<td>Безопасность</td>
<td>Порт 5678 закрыт в firewall</td>
</tr>
<tr>
<td>Безопасность</td>
<td>Webhooks защищены Header Auth</td>
</tr>
<tr>
<td>Бэкапы</td>
<td>Ночной cron-бэкап PostgreSQL настроен</td>
</tr>
<tr>
<td>Бэкапы</td>
<td>Workflow экспортированы в <a class="wpil_keyword_link" href="https://it-apteka.com/tag/git/" target="_blank" rel="noopener" title="Git" data-wpil-keyword-link="linked" data-wpil-monitor-id="2357">Git</a> или S3</td>
</tr>
<tr>
<td>Мониторинг</td>
<td>Error Workflow настроен — алерты при ошибках</td>
</tr>
<tr>
<td>Мониторинг</td>
<td>Логи периодически просматриваются</td>
</tr>
<tr>
<td>Workflow</td>
<td>Continue On Fail включён для нестабильных нод</td>
</tr>
<tr>
<td>Workflow</td>
<td>Credentials настроены в Settings, не захардкожены</td>
</tr>
<tr>
<td>Workflow</td>
<td>Sub-workflows созданы для повторяющейся логики</td>
</tr>
<tr>
<td>Workflow</td>
<td>Split In Batches используется при обработке массивов 1000+ записей</td>
</tr>
</tbody>
</table>
<h2>FAQ: что спрашивают чаще всего</h2>
<h3>Почему n8n а не Zapier — если у меня уже оплачен Zapier?</h3>
<p>Если у тебя мало задач и бюджет есть — Zapier нормальное решение. n8n выигрывает когда: данные нельзя передавать на внешние серверы (банки, медицина, юриспруденция), объём задач растёт и Zapier становится дорогим, нужна нестандартная логика которую в Zapier не реализовать. Переходить ради перехода смысла нет.</p>
<h3>Как защитить webhook от несанкционированного запуска?</h3>
<p>Включи Header Auth в настройках Webhook ноды. Укажи имя заголовка (например X-Webhook-Token) и значение из переменной окружения. В первой ноде workflow проверяй заголовок через IF — при несовпадении отвечай 401 и останавливай выполнение. Без этого любой знающий URL может запустить твой workflow.</p>
<h3>Где хранить API-ключи безопасно?</h3>
<p>Два варианта. Первый — переменные окружения в docker-compose.yml, используешь через $env[«KEY»] в выражениях. Второй — Credentials в n8n (Settings — Credentials): шифруются AES-256 с N8N_ENCRYPTION_KEY, хранятся в PostgreSQL. Credentials предпочтительнее для OAuth и сложных схем аутентификации. Переменные окружения проще для простых API-ключей.</p>
<h3>Что делать если потерял N8N_ENCRYPTION_KEY?</h3>
<p>Credentials в базе станут нечитаемы — восстановить их из зашифрованного blob невозможно без ключа. Придётся удалить все Credentials и ввести заново. Workflow сохранятся, но все ноды со ссылками на Credentials потребуют переназначения. Мораль: ключ генерируется один раз, хранится в KeePass или Vault, записывается в двух местах.</p>
<h3>Как работают AI-агенты и чем отличаются от обычного вызова OpenAI?</h3>
<p>Обычный вызов OpenAI — отправил вопрос, получил текст. AI-агент — это LLM с доступом к Tools: HTTP Request, SQL запрос, отправка email. Агент сам решает какой Tool вызвать на основе вопроса, вызывает его, получает результат, формирует ответ. Результат: AI который не просто болтает, а реально проверяет статус заказа или создаёт тикет.</p>
<h3>Как настроить n8n для работы с несколькими командами?</h3>
<p>В Enterprise <a href="https://it-apteka.com/windows-12-data-vyhoda-versii-64-bit-i-chto-izvestno-v-2026-godu/" title="Windows 12 — дата выхода, версии, 64 bit и что известно в 2026 году" target="_blank" rel="noopener" data-wpil-monitor-id="2370">версии есть Projects —</a> изоляция workflow и credentials между командами. В Community версии — только один общий инстанс. Для разделения: запусти несколько инстансов n8n на разных портах или используй разные docker-compose стеки с разными доменами. Каждый инстанс — своя PostgreSQL, свой N8N_ENCRYPTION_KEY, свои Credentials.</p>
<h2>Итог</h2>
<p>n8n — это инструмент который превращает «трачу 2 часа в день на рутину» в «настроил один раз за полчаса, всё работает само». Шпаргалка выше покрывает 90% того что нужно в реальной работе: от первого <a href="https://it-apteka.com/n8n-ustanovka-i-nastrojka-docker-telegram-ai-agenty/" title="n8n установка и настройка: Docker, Telegram, AI-агенты" target="_blank" rel="noopener" data-wpil-monitor-id="2371">docker run до AI-агентов</a> с базой знаний.</p>
<p>Три вещи которые ломают всё чаще всего: запускают webhook на localhost и не понимают почему внешний сервис не достучится, хардкодят API-ключи прямо в workflow, забывают про Error Workflow и узнают о проблемах от пользователей. Все три решаются за 10 минут если знать куда смотреть.</p>
"Сохрани
<br />
Проблемы с настройкой или непонятно как реализовать конкретный workflow — пиши в комментарии. Опиши что настраиваешь, что получается, версию n8n и вывод из docker-compose logs. Разберёмся.<br />
Быстрый ответ
- n8n — self-hosted альтернатива Zapier/Make: визуальный редактор workflow, 400+ нод, AI-агенты, бесплатно
- Установка за минуту: docker run -p 5678:5678 docker.n8n.io/n8nio/n8n → открываешь localhost:5678
- Данные между нодами передаются как JSON, обращаешься через {{$json[«field»]}}
- AI-агент = LLM + Tools: агент сам выбирает какой инструмент вызвать под задачу
- Все API-ключи — в переменные окружения, не в workflow. Всегда.
Зачем n8n и почему это работает
Есть три способа автоматизировать рутину. Написать скрипт на Python — три дня кода, два дня отладки OAuth, через месяц API поменялся и скрипт сломался. Пойти в Zapier — полчаса настройки, потом получаешь счёт на $500/месяц и объясняешь руководству что такое «подписка за автоматизацию». Делать руками — 5 минут на заявку, умножаешь на 100 заявок, получаешь рабочий день потраченный на копипасту.
n8n — четвёртый вариант. Полчаса настройки один раз, потом работает само, бесплатно, данные только у тебя.
| Параметр |
Python скрипт |
Zapier |
n8n self-hosted |
| Стоимость |
$0 |
от $19.99/мес, 50k задач — $599 |
$0 навсегда |
| Время запуска |
3-7 дней |
30 минут |
30 минут |
| Поддержка |
Ты сам |
Они сами |
Ты + комьюнити |
| Свой код |
Полностью |
Ограниченно |
JavaScript в ноде |
| Ваши данные |
У тебя |
На серверах Zapier |
Только у тебя |
| AI-агенты |
Пишешь сам |
Базово |
Нативная поддержка |
| GDPR/compliance |
Полный контроль |
Проблемно |
Полный контроль |
n8n проигрывает по одному пункту: нужен свой сервер. VPS за $5-10 в месяц решает вопрос полностью.
Архитектура: как n8n устроен
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
INET["Интернет / внешние сервисы"]
NGINX["Nginx (reverse proxy + SSL)"]
N8N["n8n (порт 5678)"]
PG["PostgreSQL (workflow и executions)"]
VOL["Docker volume (файлы)"]
TRIG["Trigger Nodes: Webhook, Schedule, Telegram, Email"]
ACTION["Action Nodes: HTTP, DB, Slack, OpenAI"]
LOGIC["Logic Nodes: IF, Switch, Loop, Merge"]
INET -->|"HTTPS 443"| NGINX
NGINX -->|"HTTP 5678"| N8N
N8N --> PG
N8N --> VOL
TRIG -->|"запускает"| ACTION
ACTION --> LOGIC
LOGIC -->|"результат"| INET
style N8N fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style NGINX fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style PG fill:#f8fafc,stroke:#3b82f6,stroke-width:1px,color:#1e293b
style TRIG fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style ACTION fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style LOGIC fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style INET fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style VOL fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
Workflow — это цепочка нод. Trigger запускает процесс. Action делает что-то с данными или вызывает внешний API. Logic управляет потоком: ветвит, циклит, объединяет. Данные между нодами — JSON.
Системные требования
| Компонент |
Минимум |
Рекомендуется |
Примечание |
| CPU |
1 vCPU |
2+ vCPU |
При параллельных workflow нужно больше |
| RAM |
512 MB |
2 GB |
PostgreSQL + n8n + Nginx суммарно ~600 MB |
| Диск |
5 GB |
20 GB |
Логи и бэкапы растут |
| ОС |
Ubuntu 20.04+ |
Ubuntu 22.04 LTS |
Debian, CentOS — тоже работают |
| Docker |
20.10+ |
24.x |
docker-compose v2 |
| Node.js |
18.x |
20.x LTS |
Только для npm-установки, не для Docker |
На момент публикации актуальна n8n 1.x. Перед установкой проверь свежую версию на github.com/n8n-io/n8n/releases.
Установка n8n
Быстрый старт: Docker одной командой
Для теста и знакомства. Данные в SQLite, хватит для первых шагов.
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
# Открываешь: http://localhost:5678
Production: Docker Compose + PostgreSQL
Для реальной работы нужна PostgreSQL — SQLite теряет данные при некоторых обновлениях и не справляется с нагрузкой.
mkdir n8n && cd n8n
nano docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:15
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_secure_password
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U n8n']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
depends_on:
postgres:
condition: service_healthy
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_secure_password
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=SecurePassword123!
- N8N_HOST=n8n.example.com
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.example.com/
- GENERIC_TIMEZONE=Europe/Moscow
- N8N_METRICS=true
- N8N_ENCRYPTION_KEY=generate_random_32char_key_here
volumes:
- ./n8n_data:/home/node/.n8n
- ./local_files:/files
volumes:
postgres_data:
N8N_ENCRYPTION_KEY — сохрани до запуска
Сгенерируй один раз и запиши в безопасное место. Если потеряешь — все Credentials в базе станут нечитаемы. Мигрировать на другой сервер без него тоже не получится.
# Генерируем ключ
openssl rand -hex 16
# Запускаем
docker-compose up -d
# Следим за запуском
docker-compose logs -f n8n
# Обновление в будущем
docker-compose pull && docker-compose up -d
Установка через npm (только для разработки)
# Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
# n8n глобально
npm install n8n -g
# Запуск
n8n start
# http://localhost:5678
Для продакшна не подходит: нет изоляции, нет автозапуска, зависимости конфликтуют.
HTTPS через Nginx
sudo apt install nginx certbot python3-certbot-nginx -y
sudo nano /etc/nginx/sites-available/n8n
server {
listen 80;
server_name n8n.example.com;
location / {
proxy_pass http://localhost:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket - обязателен для n8n
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Долгие workflow не должны таймаутиться
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
}
}
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
# SSL
sudo certbot --nginx -d n8n.example.com
sudo certbot renew --dry-run
n8n Cloud — если сервера нет
Идёшь на n8n.io, регистрируешься, получаешь готовый инстанс.
| План |
Цена |
Лимиты |
| Free (trial) |
$0 |
20 workflow, 2 500 executions/мес |
| Starter |
$20/мес |
Неограниченно workflow, 10 000 executions |
| Pro |
$50/мес |
50 000 executions + расширенные функции |
Минус: данные не у тебя. Для GDPR и работы с клиентскими данными — self-hosted предпочтительнее.
Основы workflow: как это работает
Структура любого workflow
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
T["Trigger Node (запуск)"]
A1["Action Node 1"]
L["Logic Node (IF/Switch)"]
A2["Action: true ветка"]
A3["Action: false ветка"]
T -->|"JSON"| A1
A1 -->|"JSON"| L
L -->|"true"| A2
L -->|"false"| A3
style T fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style A1 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style A2 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style A3 fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style L fill:#f8fafc,stroke:#3b82f6,stroke-width:1px,color:#1e40af
Trigger запускает процесс — по расписанию, по вебхуку, по событию в мессенджере. Данные передаются как JSON между нодами. Каждая нода видит выход предыдущей.
Первый workflow за 5 минут: погода в Slack
Открой n8n, нажми New Workflow. Добавляй ноды через кнопку «+».
Schedule Trigger
Rule: Every day at 08:00
|
HTTP Request
Method: GET
URL: https://wttr.in/Moscow?format=3
|
Slack (Post Message)
Channel: #general
Text: {{$json["data"]}}
Нажми «Execute Workflow» — проверь что данные прошли через каждую ноду. Активируй. Каждый день в 8:00 погода в Slack.
Шпаргалка по expressions
Expressions — двойные фигурные скобки с JavaScript внутри. Доступны в любом текстовом поле любой ноды.
// --- Базовый доступ к данным ---
// Поле из предыдущей ноды
{{$json["field_name"]}}
// Вложенные поля
{{$json["user"]["email"]}}
// Массив по индексу
{{$json["items"][0]["name"]}}
// Данные из конкретной ноды (по имени в UI)
{{$node["HTTP Request"].json["result"]}}
// --- Переменные и окружение ---
// Переменная окружения
{{$env["API_KEY"]}}
// Параметры workflow
{{$workflow.name}}
// Индекс текущего элемента в Loop
{{$itemIndex}}
// --- Дата и время ---
// Текущая дата+время (Luxon объект)
{{$now}}
// Форматирование
{{$now.format("YYYY-MM-DD")}}
{{$now.format("DD.MM.YYYY HH:mm")}}
// Сегодня + 7 дней
{{$now.plus({days: 7}).toISODate()}}
// Unix timestamp
{{$now.toUnixInteger()}}
// --- JavaScript в выражениях ---
// Тернарный оператор
{{$json["status"] === "active" ? "Активен" : "Неактивен"}}
// Конкатенация
{{"Привет, " + $json["user"]["name"] + "!"}}
// Число → строка с форматированием
{{$json["price"].toFixed(2) + " ₽"}}
// Текущий год
{{new Date().getFullYear()}}
// Проверка наличия поля
{{$json["email"] !== undefined ? $json["email"] : "не указан"}}
// --- Работа со строками ---
// Верхний регистр
{{$json["name"].toUpperCase()}}
// Обрезать пробелы
{{$json["input"].trim()}}
// Заменить подстроку
{{$json["text"].replace("старое", "новое")}}
// Разбить строку
{{$json["tags"].split(",")[0]}}
// --- Работа с массивами ---
// Длина массива
{{$json["items"].length}}
// Первый элемент
{{$json["items"][0]}}
// Последний элемент
{{$json["items"][$json["items"].length - 1]}}
// Join массива в строку
{{$json["tags"].join(", ")}}
Шпаргалка по нодам
Trigger Nodes — запуск workflow
| Нода |
Когда срабатывает |
Типичное применение |
| Webhook |
HTTP POST/GET на URL n8n |
Интеграция с любым сервисом через HTTP |
| Schedule Trigger |
По расписанию (cron) |
Ежедневные отчёты, мониторинг, бэкапы |
| Email Trigger (IMAP) |
Новое письмо в ящике |
Автоматическая обработка входящих писем |
| Telegram Trigger |
Сообщение боту в Telegram |
Telegram боты любой сложности |
| Manual Trigger |
Ручной запуск из UI |
Тестирование, одноразовые задачи |
| Chat Trigger |
Сообщение во встроенный чат n8n |
Тестирование AI-агентов |
Action Nodes — выполняют действия
| Нода |
Что делает |
Ключевые параметры |
| HTTP Request |
Запрос к любому API |
Method, URL, Headers, Body, Auth |
| Code |
JavaScript или Python код |
Полный доступ к данным потока, npm-модули |
| Set |
Установка и изменение полей JSON |
Режимы: Set, Add, Keep Only |
| Slack |
Сообщения, каналы, пользователи |
Operation, Channel, Text, Attachments |
| Telegram |
Отправка сообщений, файлов, кнопок |
Chat ID, Text, Reply Markup |
| Gmail / SMTP |
Отправка и чтение email |
To, Subject, HTML Body |
| Google Sheets |
Чтение и запись таблиц |
Spreadsheet ID, Sheet, Range, Operation |
| PostgreSQL / MySQL |
SQL запросы к базе |
Query, Parameters |
| OpenAI |
ChatGPT, DALL-E, Embeddings |
Model, Messages, Temperature |
| Execute Workflow |
Вызов другого workflow |
Workflow ID, Input Data |
Logic Nodes — управление потоком
| Нода |
Что делает |
Когда использовать |
| IF |
Ветвление: true/false |
Проверить одно условие |
| Switch |
Множественное ветвление |
Разные действия по значению поля |
| Merge |
Объединение данных из веток |
Собрать результаты параллельных веток |
| Loop Over Items |
Цикл по каждому элементу массива |
Обработать список записей |
| Split In Batches |
Разбивка массива на батчи |
Обработка больших объёмов без OOM |
| Wait |
Пауза на заданное время |
Rate limiting API, отложенные действия |
| Stop And Error |
Принудительная остановка с ошибкой |
Валидация входных данных |
AI-агенты в n8n
Разница: чат-бот vs AI-агент
Чат-бот отвечает из контекста. Агент использует Tools — реально что-то делает: проверяет базу, отправляет письмо, создаёт тикет. Сам выбирает что вызвать под конкретную задачу.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
USER["Вопрос: статус заказа 12345?"]
AGENT["AI Agent (GPT-4 / Claude)"]
T1["Tool: Check Order API"]
T2["Tool: Create Jira Ticket"]
T3["Tool: Send Email"]
RESP["Ответ: заказ отправлен, трек ABC123"]
USER --> AGENT
AGENT -->|"выбирает нужный Tool"| T1
T1 -->|"данные заказа"| AGENT
AGENT --> RESP
AGENT -.->|"при необходимости"| T2
AGENT -.->|"при необходимости"| T3
style AGENT fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style USER fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style T1 fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style T2 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style T3 fill:#f8fafc,stroke:#22c55e,stroke-width:1px,color:#15803d
style RESP fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Создание AI-агента: пошагово
Chat Trigger (тестирование в UI)
|
AI Agent
Model: OpenAI GPT-4 или Claude
System Message: "Ты помощник поддержки. Используй tools."
Tools:
- HTTP Request Tool (статус заказа через API)
- PostgreSQL Tool (поиск клиента в БД)
- Email Tool (отправить письмо)
- HTTP Request Tool (создать тикет в Jira)
|
Telegram / Slack (отправить ответ)
Подключение OpenAI
# Settings -> Credentials -> Add Credential -> OpenAI API
# Вставляешь: sk-xxxxxxxxxxxxxxxx
Использование в OpenAI Chat ноде:
Operation: Chat
Model: gpt-4-turbo
Messages:
role: system | content: You are a helpful assistant
role: user | content: {{$json["user_message"]}}
Подключение Anthropic Claude
# Credentials -> Add -> HTTP Header Auth
# Header Name: x-api-key
# Header Value: sk-ant-xxxxxxxxxxxx
// HTTP Request нода -> Claude API
Method: POST
URL: https://api.anthropic.com/v1/messages
Headers:
x-api-key: {{$env["ANTHROPIC_API_KEY"]}}
anthropic-version: 2023-06-01
content-type: application/json
Body:
{
"model": "claude-opus-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "{{$json['question']}}"}
]
}
RAG: агент с базой знаний
Вопрос пользователя
|
Vector Store Tool (поиск в Pinecone / Qdrant / Weaviate)
|
AI Agent (отвечает с контекстом из найденных документов)
|
Ответ (без галлюцинаций, основан на реальных данных)
Загружаешь документы, создаёшь embeddings, сохраняешь в Vector DB. Агент при каждом вопросе ищет релевантные фрагменты и отвечает опираясь на них.
Telegram боты в n8n
Быстрый старт: эхо-бот
Создай бота через @BotFather, получи токен. В n8n: Settings — Credentials — Telegram API — вставь токен.
Telegram Trigger (On Message)
|
Set
chat_id: {{$json["message"]["chat"]["id"]}}
text: {{$json["message"]["text"]}}
|
Telegram (Send Message)
Chat ID: {{$json["chat_id"]}}
Text: Ты написал: {{$json["text"]}}
Бот с ChatGPT
Telegram Trigger
|
OpenAI (Chat)
User Message: {{$json["message"]["text"]}}
|
Telegram (Send Message)
Chat ID: {{$json["message"]["chat"]["id"]}}
Text: {{$json["choices"][0]["message"]["content"]}}
Бот с командами
Telegram Trigger
|
Switch (по тексту сообщения)
/start -> Set (текст приветствия)
/help -> Set (текст справки)
/price -> HTTP Request (цена из API)
default -> OpenAI (AI-ответ на произвольный вопрос)
|
Telegram (Send Message)
Бот с кнопками (Inline Keyboard)
// В Telegram ноде, поле Reply Markup
{
"inline_keyboard": [
[
{"text": "Статус заказа", "callback_data": "check_order"},
{"text": "Связаться с оператором", "callback_data": "human"}
],
[
{"text": "Часто задаваемые вопросы", "callback_data": "faq"}
]
]
}
Обработка нажатий на кнопки:
Telegram Trigger (On Callback Query)
|
Switch (по callback_data)
"check_order" -> HTTP Request (API статуса заказа)
"human" -> Slack (уведомить оператора)
"faq" -> Set (текст FAQ)
|
Telegram (Answer Callback Query)
Telegram (Send Message с результатом)
Готовые шаблоны
Библиотека: n8n.io/workflows — тысячи workflow. Скачиваешь JSON, импортируешь через «…» — Import from File, настраиваешь credentials.
RSS в Telegram/Slack
RSS Feed Trigger
|
Set (форматирование: заголовок + ссылка)
|
Telegram / Slack (отправка)
Email в задачу Jira
Gmail Trigger (UNSEEN письма)
|
OpenAI (извлечь суть: тема, приоритет, описание)
|
Jira (создать задачу)
|
Gmail (ответить клиенту с номером тикета)
Мониторинг сайта
Schedule Trigger (каждые 5 минут)
|
HTTP Request (GET https://example.com)
|
IF (statusCode != 200)
true -> Slack (алерт: код ошибки + время)
false -> (ничего, продолжаем жить)
Ночной бэкап в Google Drive
Schedule Trigger (03:00)
|
Execute Command (pg_dump | gzip)
|
Google Drive (Upload)
|
Slack (Backup complete: имя файла, размер)
AI Content Generator
Schedule Trigger (раз в неделю)
|
Google Sheets (получить список тем статей)
|
Loop Over Items
|
OpenAI (сгенерировать статью по теме)
|
WordPress (опубликовать)
|
Telegram (анонс в канал)
Продвинутые техники
Обработка ошибок
По умолчанию workflow падает при первой ошибке и молчит. В продакшне это неприемлемо — узнаёшь о проблеме когда клиент уже жалуется.
Глобальный Error Workflow. Создай отдельный workflow. В Settings — Error Workflow — выбери его. Теперь любая ошибка в любом workflow запускает этот обработчик.
Error Trigger
|
Set
workflow_name: {{$json["workflow"]["name"]}}
error_message: {{$json["execution"]["error"]["message"]}}
execution_id: {{$json["execution"]["id"]}}
|
Slack (алерт в #alerts)
Text: ОШИБКА в {{$json["workflow_name"]}}: {{$json["error_message"]}}
|
Google Sheets (логировать: время, workflow, ошибка)
Continue On Fail. В настройках ноды включи «Continue On Fail» — нода не уронит workflow при ошибке, а передаст информацию об ошибке в следующую ноду.
HTTP Request (Continue On Fail: yes)
|
IF ($json["error"] !== undefined)
true -> Slack (алерт) -> Google Sheets (лог)
false -> Обычная обработка данных
Переменные окружения
API-ключи прямо в workflow — это плохо. Кто-то получит доступ к n8n — получит все ключи сразу.
# docker-compose.yml
environment:
- OPENAI_API_KEY=sk-xxxxxxxxxxxx
- ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
- TELEGRAM_BOT_TOKEN=12345:xxxxxxxxxxxx
- SLACK_WEBHOOK=https://hooks.slack.com/...
- DB_URL=postgresql://user:pass@host/db
Используешь в любой ноде:
{{$env["OPENAI_API_KEY"]}}
{{$env["TELEGRAM_BOT_TOKEN"]}}
Sub-workflows: переиспользование логики
Одна и та же логика уведомлений в двадцати workflow — это боль при изменениях. Выноси в отдельный workflow.
// Sub-workflow "Send Notification"
Execute Workflow Trigger (получает: channel, message, severity)
|
IF (severity == "critical")
true -> Slack + Email + Telegram
false -> Только Slack
// Основной workflow вызывает его:
Execute Workflow
Workflow: "Send Notification"
Data: {channel: "#alerts", message: "...", severity: "critical"}
Батчинг больших объёмов
Капля никотина убивает лошадь. Одна нода с 50 000 записей без батчинга убивает n8n.
PostgreSQL (SELECT 50000 records)
|
Split In Batches (по 100 записей)
|
Loop
HTTP Request (обработать батч)
Wait (100ms - rate limiting)
PostgreSQL (UPDATE status)
|
Return to Split (следующий батч)
Вебхуки с аутентификацией
Открытый webhook — вектор атаки
Без аутентификации любой знающий URL может запустить твой workflow. Всегда защищай вебхуки.
// Webhook нода - настройки Authentication
Authentication: Header Auth
Header Name: X-Webhook-Token
Header Value: (твой секрет из env)
Проверка в workflow:
Webhook Trigger
|
IF ($headers["x-webhook-token"] === $env["WEBHOOK_SECRET"])
false -> Respond to Webhook (401) + Stop
true -> Основная логика
Интеграции: шпаргалка настройки
Google Sheets
// Чтение
Google Sheets (Read)
Spreadsheet ID: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms
Sheet: Sheet1
Range: A1:D100
// Запись новой строки
Google Sheets (Append)
Spreadsheet ID: xxxxx
Sheet: Sheet1
Values: {Name: {{$json["name"]}}, Email: {{$json["email"]}}}
Slack
// Простое сообщение
Operation: Post Message
Channel: #alerts
Text: Привет из n8n!
// С вложением (цветная карточка)
Attachments:
[{
"color": "#36a64f",
"title": "Deployment Success",
"text": "Version 2.0 deployed",
"footer": "n8n automation"
}]
Email (Gmail / SMTP)
# Credentials: SMTP
Host: smtp.gmail.com
Port: 587
User: your@gmail.com
Password: app_password # НЕ основной пароль, app password из настроек Google
// Email Send нода
To: {{$json["client_email"]}}
Subject: Заказ #{{$json["order_id"]}} принят
HTML: Спасибо за заказ!
{{$json["details"]}}
PostgreSQL
// Параметризованный запрос (защита от SQL injection)
Query: SELECT * FROM orders WHERE status = $1 AND user_id = $2
Parameters: ["pending", {{$json["user_id"]}}]
// Update
Query: UPDATE orders SET status = $1 WHERE id = $2
Parameters: ["processed", {{$json["order_id"]}}]
Telegram: отправка файлов и медиа
// Отправить фото по URL
Telegram (Send Photo)
Chat ID: {{$json["chat_id"]}}
Photo: https://example.com/image.jpg
Caption: Ваш отчёт за {{$now.format("DD.MM.YYYY")}}
// Отправить документ
Telegram (Send Document)
Chat ID: {{$json["chat_id"]}}
Document: {{$binary["report"]}}
Безопасность n8n в продакшне
| Что защитить |
Как защитить |
Настройка |
| Доступ к n8n UI |
Basic Auth или OAuth2 |
N8N_BASIC_AUTH_ACTIVE=true |
| Трафик |
HTTPS через Nginx |
Certbot + конфиг Nginx |
| API-ключи |
Переменные окружения |
$env[«KEY»] в выражениях |
| Webhooks |
Header Auth |
Настройки Webhook ноды |
| Encryption Key |
Сохранить в KeePass/Vault |
N8N_ENCRYPTION_KEY в env |
| Порт 5678 |
Закрыть в firewall |
ufw deny 5678 |
| PostgreSQL |
Только внутри Docker network |
Не пробрасывать порт 5432 |
# Закрываем прямой доступ к n8n, оставляем только Nginx
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 22
sudo ufw deny 5678
sudo ufw enable
Бэкапы и восстановление
Экспорт workflow
# Через UI: Settings -> Workflows -> Export All
# Через API
curl -X GET https://n8n.example.com/api/v1/workflows \
-u admin:password \
-H "Accept: application/json" > workflows_backup.json
Автоматический бэкап PostgreSQL
#!/bin/bash
# /usr/local/bin/backup-n8n.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups/n8n
mkdir -p $BACKUP_DIR
docker exec n8n-postgres pg_dump -U n8n n8n > $BACKUP_DIR/n8n_$DATE.sql
gzip $BACKUP_DIR/n8n_$DATE.sql
# Удаляем старше 30 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "Backup: n8n_$DATE.sql.gz"
chmod +x /usr/local/bin/backup-n8n.sh
# Cron: каждую ночь в 3:00
echo "0 3 * * * /usr/local/bin/backup-n8n.sh >> /var/log/n8n-backup.log 2>&1" | crontab -
Восстановление
docker-compose stop n8n
gunzip -c /backups/n8n/n8n_20260504.sql.gz | \
docker exec -i n8n-postgres psql -U n8n n8n
docker-compose start n8n
Миграция на новый сервер
Encryption Key — взять со старого сервера до удаления
Без него Credentials на новом
сервере будут нечитаемы — все API-ключи придётся вводить заново. Сначала забираешь ключ, потом переезжаешь.
# Старый сервер: берём ключ
docker exec n8n env | grep N8N_ENCRYPTION_KEY
# Новый сервер: docker-compose.yml
environment:
- N8N_ENCRYPTION_KEY=тот_же_ключ
Troubleshooting: 8 частых проблем с n8n
| # |
Проблема |
Симптом |
Решение |
| 1 |
Webhook не срабатывает |
Внешний сервис отправляет POST, workflow молчит |
WEBHOOK_URL в env должен быть публичный HTTPS. localhost снаружи недоступен — используй ngrok для разработки |
| 2 |
Workflow не активируется |
Active не включается или сразу возвращается |
Нет Trigger ноды или credentials не настроены. Смотри: docker-compose logs -f n8n |
| 3 |
OAuth Unauthorized |
Google/GitHub возвращают 401 при авторизации |
Redirect URL в OAuth приложении: https://n8n.example.com/rest/oauth2-credential/callback |
| 4 |
Данные теряются после рестарта |
После docker-compose restart пропадают workflow и executions |
SQLite без постоянного volume или PostgreSQL не подключена. Проверь volumes в docker-compose.yml |
| 5 |
n8n не стартует после обновления |
Контейнер поднимается и сразу останавливается |
docker-compose logs n8n — читаешь ошибку. Помогает: docker-compose down && up -d. Крайний случай: откат на конкретную версию image: docker.n8n.io/n8nio/n8n:1.20.0 |
| 6 |
Workflow тормозит |
Execution занимает минуты вместо секунд |
Большой массив без Split In Batches. Медленный внешний API. Добавь Wait ноду для rate limiting |
| 7 |
Expression error в ноде |
Нода падает с ошибкой в {{$json[…]}} |
Предыдущая нода вернула другую структуру. Запусти Execute Workflow и кликни ноду — увидишь реальные данные. Добавь IF для проверки наличия поля |
| 8 |
WebSocket ошибки в UI |
Статус execution не обновляется в реальном времени |
В Nginx нет WebSocket заголовков. Добавь proxy_set_header Upgrade $http_upgrade и Connection «upgrade» |
Алгоритм диагностики любой проблемы
# 1. Логи n8n
docker-compose logs -f n8n
# 2. Логи PostgreSQL
docker-compose logs -f postgres
# 3. Статус контейнеров
docker-compose ps
# 4. Переменные окружения внутри контейнера
docker exec n8n env | grep N8N
# 5. Ручной запуск workflow в UI
# Execute Workflow -> кликаешь каждую ноду -> видишь входящие и исходящие данные
# 6. Перезапуск
docker-compose restart n8n
Чеклист: production-ready n8n
| Категория |
Пункт |
| Установка |
n8n запущен через docker-compose с PostgreSQL |
| Установка |
HTTPS настроен через Nginx + Certbot |
| Установка |
WEBHOOK_URL указывает на публичный домен |
| Безопасность |
Basic Auth или OAuth2 включены |
| Безопасность |
API-ключи в переменных окружения, не в workflow |
| Безопасность |
N8N_ENCRYPTION_KEY сохранён в безопасном месте |
| Безопасность |
Порт 5678 закрыт в firewall |
| Безопасность |
Webhooks защищены Header Auth |
| Бэкапы |
Ночной cron-бэкап PostgreSQL настроен |
| Бэкапы |
Workflow экспортированы в Git или S3 |
| Мониторинг |
Error Workflow настроен — алерты при ошибках |
| Мониторинг |
Логи периодически просматриваются |
| Workflow |
Continue On Fail включён для нестабильных нод |
| Workflow |
Credentials настроены в Settings, не захардкожены |
| Workflow |
Sub-workflows созданы для повторяющейся логики |
| Workflow |
Split In Batches используется при обработке массивов 1000+ записей |
FAQ: что спрашивают чаще всего
Почему n8n а не Zapier — если у меня уже оплачен Zapier?
Если у тебя мало задач и бюджет есть — Zapier нормальное решение. n8n выигрывает когда: данные нельзя передавать на внешние серверы (банки, медицина, юриспруденция), объём задач растёт и Zapier становится дорогим, нужна нестандартная логика которую в Zapier не реализовать. Переходить ради перехода смысла нет.
Как защитить webhook от несанкционированного запуска?
Включи Header Auth в настройках Webhook ноды. Укажи имя заголовка (например X-Webhook-Token) и значение из переменной окружения. В первой ноде workflow проверяй заголовок через IF — при несовпадении отвечай 401 и останавливай выполнение. Без этого любой знающий URL может запустить твой workflow.
Где хранить API-ключи безопасно?
Два варианта. Первый — переменные окружения в docker-compose.yml, используешь через $env[«KEY»] в выражениях. Второй — Credentials в n8n (Settings — Credentials): шифруются AES-256 с N8N_ENCRYPTION_KEY, хранятся в PostgreSQL. Credentials предпочтительнее для OAuth и сложных схем аутентификации. Переменные окружения проще для простых API-ключей.
Что делать если потерял N8N_ENCRYPTION_KEY?
Credentials в базе станут нечитаемы — восстановить их из зашифрованного blob невозможно без ключа. Придётся удалить все Credentials и ввести заново. Workflow сохранятся, но все ноды со ссылками на Credentials потребуют переназначения. Мораль: ключ генерируется один раз, хранится в KeePass или Vault, записывается в двух местах.
Как работают AI-агенты и чем отличаются от обычного вызова OpenAI?
Обычный вызов OpenAI — отправил вопрос, получил текст. AI-агент — это LLM с доступом к Tools: HTTP Request, SQL запрос, отправка email. Агент сам решает какой Tool вызвать на основе вопроса, вызывает его, получает результат, формирует ответ. Результат: AI который не просто болтает, а реально проверяет статус заказа или создаёт тикет.
Как настроить n8n для работы с несколькими командами?
В Enterprise версии есть Projects — изоляция workflow и credentials между командами. В Community версии — только один общий инстанс. Для разделения: запусти несколько инстансов n8n на разных портах или используй разные docker-compose стеки с разными доменами. Каждый инстанс — своя PostgreSQL, свой N8N_ENCRYPTION_KEY, свои Credentials.
Итог
n8n — это инструмент который превращает «трачу 2 часа в день на рутину» в «настроил один раз за полчаса, всё работает само». Шпаргалка выше покрывает 90% того что нужно в реальной работе: от первого docker run до AI-агентов с базой знаний.
Три вещи которые ломают всё чаще всего: запускают webhook на localhost и не понимают почему внешний сервис не достучится, хардкодят API-ключи прямо в workflow, забывают про Error Workflow и узнают о проблемах от пользователей. Все три решаются за 10 минут если знать куда смотреть.
Сохрани шпаргалку — пригодится
Проблемы с настройкой или непонятно как реализовать конкретный workflow — пиши в комментарии. Опиши что настраиваешь, что получается, версию n8n и вывод из docker-compose logs. Разберёмся.
неплохая шпаргалка по n8n и автоматизации workflow с AI-агентами. Сейчас, когда бизнесу и техническим специалистам всё чаще требуется автоматизация процессов без привязки к SaaS-лимитам, n8n становится одним из самых востребованных инструментов. Особенно ценно, что в статье показан не абстрактный обзор, а практический подход к использованию n8n для реальных задач.
Для новичков важно понимать, что n8n — это платформа визуальной автоматизации, которая позволяет создавать сложные workflow без написания большого количества кода. В отличие от Zapier или Make, n8n можно развернуть на своём сервере (self-hosted), что критично для проектов с требованиями к безопасности, приватности данных и контролю инфраструктуры. Именно это делает n8n популярным среди DevOps-инженеров, системных администраторов и разработчиков.
Отдельного внимания заслуживает блок про AI-агентов в n8n. Сегодня автоматизация — это уже не просто «если-то», а полноценные интеллектуальные сценарии, где агент анализирует данные, принимает решения и сам выбирает дальнейшие действия. Связка n8n + OpenAI (или других LLM) позволяет строить workflow для:
обработки входящих писем и заявок,
классификации и анализа текстов,
автоматического ответа клиентам,
генерации контента,
работы с API и внешними сервисами.
Такие AI-workflow особенно полезны в маркетинге, поддержке, аналитике и внутренней автоматизации компаний. При этом n8n остаётся гибким инструментом: можно комбинировать AI-ноды с классическими HTTP-запросами, Webhook-триггерами, базами данных и очередями.
Плюс статьи — чёткая структура и формат шпаргалки, который действительно экономит время. Когда работаешь с десятками workflow, важно иметь под рукой краткое описание нод, логики выполнения, условий и особенностей интеграций. Это особенно актуально для тех, кто использует n8n в продакшене и поддерживает несколько автоматизированных цепочек одновременно.
Также стоит отметить, что n8n отлично подходит не только для разработчиков, но и для технически продвинутых специалистов без глубокого знания кода. Визуальный редактор, логика узлов и возможность быстро тестировать сценарии делают его удобным инструментом для быстрого прототипирования автоматизации.
В целом, статья хорошо закрывает поисковые запросы вроде:
«что такое n8n», «автоматизация workflow», «n8n AI агенты», «n8n примеры использования», «self-hosted автоматизация» — и будет полезна как тем, кто только выбирает инструмент, так и тем, кто уже внедряет n8n в рабочие процессы.