
Автоматизация рутины часто сводится не к программированию, а к тому, чтобы вовремя передавать данные между сервисами. Платформа n8n связывает API, базы данных и внутренние скрипты в единый сценарий без отдельного приложения. Разберём, как устроен n8n, и развернем его на своём сервере из готового рецепта или вручную через Docker.
Что такое n8n
n8n — инструмент для автоматизации процессов, в котором строят workflow — цепочки автоматических действий. Вместо того чтобы писать код, вы собираете логику из узлов (nodes) в визуальном редакторе:
- один узел может сделать HTTP-запрос к API;
- другой — отправить письмо;
- третий — записать строку в базу данных или таблицу.
Узлы соединяются направленными связями, которые задают порядок передачи данных. Сценарий можно запустить целиком или пошагово.
Платформа n8n распространяется по лицензии Sustainable Use License (SUL) и использует модель fair-code: исходный код доступен, но лицензия содержит ограничения на коммерческое использование, поэтому n8n не считается классическим Open Source-проектом в смысле OSI. n8n разрешено бесплатно использовать для личных и внутренних бизнес-задач. Также разрешены консультационные услуги, установка и сопровождение n8n для клиентов. При этом нельзя превращать n8n в собственный SaaS-сервис, продавать доступ к своему экземпляру n8n или распространять его как white-label-продукт без соответствующей коммерческой лицензии.
Главное отличие от Zapier или Make — возможность развёртывания на собственном сервере (self-hosting):
- сценарии, учётные данные (credentials) и история запусков хранятся на вашем сервере, а не на стороне SaaS-сервиса, и доступом к ним управляете вы сами;
- если сценарий передает данные во внешний сервис по API (например, в CRM или мессенджер), дальше они обрабатываются по правилам этого сервиса;
- доступны узлы Code: любую нестандартную логику можно дописать на JavaScript или Python прямо в сценарии.
Важно! В продакшене код на JS и Python лучше выполнять не в основном процессе, а в изолированном task runner. Как это настроить, расскажем в разделе «Изоляция кода: task runners».
Как работает n8n
У workflow гибкая архитектура: сценарии могут ветвиться, зацикливаться и запускаться сразу несколькими триггерами. Узлы условно делятся на три типа:
- триггеры (trigger nodes) — события, которые запускают сценарий: вебхуки от внешних сервисов, расписание (cron), ручной запуск или сообщение в очереди;
- узлы обработки — HTTP-запросы, фильтрация, ветвление по условию, обращение к базе данных или вызов внешнего API;
- финальные узлы — отправка уведомлений, запись результата, ответ на вебхук.
Между узлами данные передаются в виде items — объектов с JSON-полями. Бинарные данные (файлы, изображения) передаются отдельно. На любом шаге наглядно видно, что поступило на вход и что получилось на выходе — это упрощает отладку по сравнению с кодом, где промежуточные состояния приходится логировать вручную. Если готового узла для нужного сервиса нет, подойдёт универсальный узел HTTP Request или узел Code, в котором логику можно написать самостоятельно.
Важно! Перед началом работы с проектом изучите, как выглядят разделы Workflows, Credentials и Executions и что происходит при первом запуске сценария.
Возможности n8n и кому он подойдёт
С помощью n8n можно автоматизировать как простые задачи, так и сложные инфраструктурные процессы. Например:
- получение данных из внешних API по расписанию и сохранение в базу или таблицу;
- обработка входящих вебхуков от CRM, платежных систем и мессенджеров;
- отправка уведомлений в Telegram, Slack или по email при наступлении событий;
- резервное копирование файлов и синхронизация данных между хранилищами;
- построение AI-workflow и AI-агентов с подключением языковых моделей (LLM) и внешних инструментов.
Инструмент подойдет разработчикам, которым нужно быстро собрать прототип интеграции без отдельного микросервиса, DevOps-инженерам и системным администраторам — для автоматизации рутинных процессов, а также небольшим командам без выделенного специалиста по интеграциям.
Как установить n8n
Есть разные способы инсталляции. Самые распространенные: заказать VDS с предустановленным n8n или установить его вручную через Docker.
Установка с помощью готового рецепта
Это самый быстрый способ: Docker, Nginx и сертификаты не придется настраивать вручную.
1. Выберите тарифный план.

2. Перейдите в Корзину для оформления заказа. В корзине нажмите Настроить тариф.

3. Пролистайте страницу вниз и в разделе Предустановленное ПО выберите рецепт n8n.

После оплаты сервер разворачивается автоматически. На нём уже работают: n8n, PostgreSQL, обратный прокси Nginx с TLS-сертификатом и firewall ufw.
Установка n8n вручную
В примере — Ubuntu 24.04 LTS, Docker Engine и Docker Compose v2. Для работы с сервером нужен SSH-доступ. Официальных минимальных требований к ресурсам у n8n нет: для теста хватит 1–2 Гб RAM, а для связки с PostgreSQL лучше выбрать конфигурацию от 4 Гб RAM и 2 vCPU.
Подготовка
Убедитесь, что на сервере запущен Docker и доступен плагин Compose:
docker --version && docker compose versionЕсли нет — установите (подробный разбор есть в статье «Как установить Docker на Ubuntu»):
sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER
sudo systemctl enable --now dockerПримечание: команда usermod добавляет пользователя в группу docker, чтобы запускать контейнеры без sudo. Изменения вступят в силу после повторного входа в систему.
Установка
Чтобы быстро проверить работу n8n, запустите один контейнер без домена. Создайте том для данных и запустите контейнер:
docker volume create n8n_data
docker run -d \
--name n8n \
-p 127.0.0.1:5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n Чтобы убедиться, что контейнер запущен (Status = Up), выполните:
docker psПорт опубликован только на локальном адресе сервера (127.0.0.1), поэтому по IP-адресу снаружи интерфейс не откроется. Чтобы зайти в него, пробросьте порт на свой компьютер через SSH-туннель. Выполните команду на ПК (не на сервере):
ssh -L 5678:127.0.0.1:5678 user@<IP-вашего-VDS> Здесь user нужно заменить на имя вашего пользователя на сервере. Пока соединение открыто, интерфейс доступен в браузере по адресу http://localhost:5678.
Важно! Не публикуйте порт 5678 наружу (-p 5678:5678): при доступе к интерфейсу по обычному HTTP трафик между браузером и n8n не шифруется. Кроме того, пока не создан первый пользователь, любой, кто получит доступ к интерфейсу, сможет пройти первоначальную регистрацию.
Если n8n запускается нормально, тестовый контейнер больше не нужен. Но сначала решите, нужны ли вам сценарии, которые вы успели создать в тесте: данные тестового запуска в новую установку не перенесутся, потому что Compose создаст собственный том. Нужные сценарии экспортируйте (в интерфейсе n8n это делается из меню сценария) и импортируйте после установки. Учётные данные (credentials) придётся создать заново: тестовый n8n сгенерировал собственный ключ шифрования, а в новой установке будет ключ из .env, поэтому старые credentials там не расшифруются. Если ничего нужного в тесте нет, остановите и удалите контейнер и том. Выполните:
docker rm -f n8n
docker volume rm n8n_dataНастройка домена и HTTPS
Для постоянной работы используйте связку из двух контейнеров: n8n и Traefik. Traefik принимает входящие HTTPS-запросы, перенаправляет их в n8n, а также автоматически получает и обновляет SSL-сертификаты Let's Encrypt. Перед настройкой убедитесь, что у вас есть домен, а его A-запись в DNS указывает на IPv4-адрес VDS.
Создайте директорию проекта и файл .env:
mkdir n8n-compose && cd n8n-compose
cat > .env <<'EOF'
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
GENERIC_TIMEZONE=Europe/Moscow
SSL_EMAIL=you@example.com
N8N_ENCRYPTION_KEY=замените-на-длинную-случайную-строку
EOFОписание переменных:
DOMAIN_NAMEиSUBDOMAIN— домен и поддомен, по которым будет доступен интерфейс, напримерhttps://n8n.example.com;GENERIC_TIMEZONE— часовой пояс для корректного запуска запланированных workflow;SSL_EMAIL— email для Let's Encrypt (уведомления о статусе сертификатов);N8N_ENCRYPTION_KEY— ключ шифрования credentials. Сгенерируйте длинную случайную строку (например, openssl rand -hex 32) и сохраните в надежном месте — менять его на работающей установке нельзя, иначе n8n не сможет расшифровать сохраненные учетные данные.
Создайте каталог для файлов, с которыми будут работать сценарии (mkdir local-files), и файл compose.yaml:
services:
traefik:
image: traefik:v3.6
restart: always
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: docker.n8n.io/n8nio/n8n
restart: always
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.tls=true"
- "traefik.http.routers.n8n.tls.certresolver=mytlschallenge"
environment:
- "N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}"
- "N8N_PROTOCOL=https"
- "N8N_PORT=5678"
- "NODE_ENV=production"
- "N8N_WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/"
- "N8N_PROXY_HOPS=1"
- "GENERIC_TIMEZONE=${GENERIC_TIMEZONE}"
- "TZ=${GENERIC_TIMEZONE}"
- "N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}"
- "N8N_RESTRICT_FILE_ACCESS_TO=/files"
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
volumes:
n8n_data:
traefik_data:В этой конфигурации n8n не публикует порты наружу: запросы принимает только Traefik и передает их n8n внутри Docker-сети. Запросы на порт 80 Traefik автоматически переводит на HTTPS. Чтобы Let's Encrypt мог выдать сертификат, Traefik должен быть доступен снаружи по порту 443. Порт 80 нужен для редиректа на HTTPS. Если на сервере включен фаервол ufw, откройте оба порта. Сначала разрешите SSH, чтобы не потерять доступ к серверу:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw statusЕсли SSH у вас на нестандартном порту, вместо первой команды выполните:
sudo ufw allow <порт>/tcpЕсли фаервол настроен на стороне хостера, откройте порты 80 и 443 в его панели. Порты, которые публикует Docker, ufw не блокирует. Поэтому команды выше нужны в первую очередь для остальных служб сервера.
Важно! Убедитесь, что у local-files корректные владелец, группа и права доступа. Пользователь внутри контейнера n8n должен иметь необходимые права на чтение и запись каталога, иначе при работе с файлами можно получить ошибку Permission denied.
Запустите проект:
docker compose up -dПроверьте статус контейнеров:
docker compose ps Если DNS обновился и порты открыты, интерфейс станет доступен по адресу https://n8n.example.com.
Настройка базы данных
По умолчанию n8n использует встроенную СУБД SQLite — этого достаточно для теста и небольших нагрузок, но когда параллельных запусков становится больше, лучше перейти на PostgreSQL. Добавьте в .env:
POSTGRES_USER=n8n
POSTGRES_PASSWORD=придумайте-надежный-пароль
POSTGRES_DB=n8nДобавьте сервис postgres в compose.yaml:
postgres:
image: postgres:18
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db_data:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10В environment сервиса n8n переключите тип базы:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}И добавьте зависимость от готовности базы:
depends_on:
postgres:
condition: service_healthyНе забудьте объявить db_data в volumes на верхнем уровне файла compose.yaml.
Важно! При первом запуске с DB_TYPE=postgresdb n8n создаёт в PostgreSQL пустую базу. Если вы уже работали на SQLite, сценарии и учетные данные автоматически не перенесутся — их придётся экспортировать и импортировать вручную. Поэтому базу лучше выбрать до того, как вы начнете создавать рабочие сценарии.
Изоляция кода: task runners
По умолчанию код из узла Code выполняется в режиме internal — в дочернем процессе основного сервиса, без полноценной изоляции. Если в сценарий попадёт вредоносный или ошибочный код, он может получить доступ к данным n8n и повлиять на работу всего сервиса. Начиная с версии 2.x режим internal не рекомендуется для продакшена — вместо него используют режим external с отдельным контейнером n8nio/runners той же версии, что и основной образ.
Добавьте в .env случайный токен для авторизации раннера:
N8N_RUNNERS_AUTH_TOKEN=придумайте-длинную-случайную-строкуДобавьте в compose.yaml сервис task-runners:
task-runners:
image: n8nio/runners
restart: always
environment:
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
- N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}
depends_on:
- n8nИ добавьте в environment сервиса n8n параметры для связи с брокером:
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
- N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}Это базовая настройка. Остальные параметры, например, список разрешённых модулей и лимиты ресурсов, описаны в документации n8n в разделе Task runners.
Резервное копирование
В томе n8n_data хранятся конфигурация и ключ шифрования, а в db_data (или SQLite) — сами сценарии и учетные данные; копировать их нужно строго вместе. Имя тома уточните командой
docker volume ls | grep n8n_dataВажно! Если вы используете SQLite, перед архивацией тома остановите контейнер (docker compose stop n8n), иначе файл базы может повредиться. После архивации запустите его снова:
docker compose start n8nЧтобы сделать дамп PostgreSQL, выполните в каталоге проекта:
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > n8n_db_$(date +%F).sql.gzЕсли вы меняли POSTGRES_USER и POSTGRES_DB, подставьте свои значения. Чтобы заархивировать том, выполните команду ниже, заменив n8n-compose_n8n_data на имя своего тома:
docker run --rm \
-v n8n-compose_n8n_data:/data \
-v "$(pwd)":/backup \
alpine tar czf /backup/n8n_data_$(date +%F).tar.gz -C / dataХраните архивы и .env отдельно от VDS и время от времени проверяйте бэкапы: восстанавливайте их на тестовом сервере. Особенно берегите N8N_ENCRYPTION_KEY — без него учётные данные из бэкапа не расшифровать.
Обновление через Docker
Выполните в папке проекта:
docker compose pull
docker compose up -d Первая команда скачивает новые образы, вторая пересоздает только изменившиеся контейнеры. Перед обновлением зафиксируйте версию в compose.yaml (например, docker.n8n.io/n8nio/n8n:2.39.8 вместо тега :latest).
Чек-лист перед запуском в продакшен
Что легко упустить при первой установке:
- порт 5678 нигде не опубликован наружу — доступ только через Traefik;
- PostgreSQL не публикует порт 5432 наружу, доступен только внутри Docker-сети;
- файл
.envдобавлен в.gitignore, а права доступа к нему ограничены (chmod 600 .env); - N8N_ENCRYPTION_KEY и токен task runner — длинные случайные строки, а не значения по умолчанию;
- у владельца — устойчивый пароль, у Docker socket в Traefik — режим :ro;
- версия образа зафиксирована, а не
latest;
Дополнительно проверьте, что бэкапы делаются регулярно и хотя бы раз проверены восстановлением.
Проверка установки: создаём первый workflow
При первом входе на https://n8n.example.com n8n предложит создать учетную запись владельца с правами администратора.

Чтобы убедиться, что триггеры, HTTP-запросы и отправка результата работают, соберите простой сценарий. Например, раз в день получать курсы валют из API и отправлять их в Telegram. Пошаговый разбор такого сценария есть в статье «Начало работы с self-hosted n8n».
Заключение
n8n закрывает пробел между готовыми no-code-сервисами и интеграциями, написанными с нуля: визуальный редактор ускоряет сборку типовых сценариев, а узлы Code не дают упереться в ограничения конструктора. Self-hosting позволяет хранить workflow, credentials и историю выполнений на собственном сервере и самостоятельно контролировать доступ к ним. При этом для продакшена важно не ограничиваться самой установкой: используйте HTTPS, PostgreSQL для рабочих нагрузок, резервное копирование и изоляцию выполнения кода через task runners.