Установка n8n на свой сервер: Docker, домен и SSL за час
n8n - это конструктор автоматизаций: связывает между собой сервисы, базы данных и API без написания кода. Аналог Zapier и Make, с одним принципиальным отличием - его можно поставить на собственный сервер.
Почему это важно: через автоматизации проходят рабочие данные. Заявки клиентов, содержимое CRM, письма, документы. В облачной версии всё это проходит через чужую инфраструктуру и тарифицируется по количеству операций. На своём сервере данные остаются у вас, а количество запусков не ограничено ничем, кроме мощности сервера.
Разберём установку через Docker: это самый предсказуемый способ, который переживает обновления без сюрпризов.
Облако или свой сервер
| n8n Cloud | Свой сервер | |
|---|---|---|
| Оплата | За количество исполнений | Фиксированная аренда сервера |
| Данные | На серверах вендора | Только у вас |
| Лимит запусков | По тарифу | Ограничен только железом |
| Обновления | Автоматически | Вручную, когда удобно |
| Свои npm-пакеты | Ограниченно | Без ограничений |
| Порог входа | Регистрация | Час на настройку |
Свой сервер выигрывает, когда автоматизаций много, данные чувствительные или нужны свои зависимости. Облако проще, если запусков десятки в месяц и разбираться с администрированием не хочется.
Требования к серверу
n8n нетребователен, пока рабочих процессов немного. Реальные ориентиры:
| Нагрузка | vCPU | RAM | Диск |
|---|---|---|---|
| Тест, до 10 сценариев | 1 | 2 ГБ | 20 ГБ NVMe |
| Рабочий контур, до 50 сценариев | 2 | 4 ГБ | 40 ГБ NVMe |
| Активная работа, обработка файлов | 4 | 8 ГБ | 80 ГБ NVMe |
Про память: 1 ГБ формально хватит для запуска, но при первом же тяжёлом сценарии контейнер упадёт по OOM. Берите от 2 ГБ.
Что ещё понадобится:
- сервер с Ubuntu 22.04 или 24.04;
- домен или поддомен (например,
n8n.вашдомен.ru); - 60 минут.
Сервер должен быть уже настроен по базовой безопасности: пользователь с sudo, ключи, файрвол. Если это ещё не сделано, начните с инструкции Настройка VPS с нуля.
Как это устроено
Схема сборки простая: reverse-proxy принимает HTTPS-трафик и передаёт его в n8n, а n8n хранит данные в PostgreSQL.
Зачем PostgreSQL, если n8n умеет в SQLite? SQLite подходит для теста, но при росте числа выполнений начинает подтормаживать и хуже переживает параллельную запись. Ставить БД сразу дешевле, чем мигрировать потом.
Шаг 1. Устанавливаем Docker
Официальный скрипт установки:
curl -fsSL https://get.docker.com | sudo shДобавляем себя в группу docker, чтобы не писать sudo перед каждой командой:
sudo usermod -aG docker $USERПереподключаемся по SSH, чтобы группа применилась, и проверяем:
docker --version
docker compose versionОбе команды должны вернуть версии.
Шаг 2. Домен и DNS
В панели вашего DNS-провайдера создайте A-запись:
| Тип | Имя | Значение |
|---|---|---|
| A | n8n | IP-адрес сервера |
Получится n8n.вашдомен.ru. Проверяем, что запись разошлась:
dig +short n8n.вашдомен.ruКоманда должна вернуть IP вашего сервера. Если пусто - подождите, DNS обновляется до 15 минут (иногда дольше).
⚠️ Не переходите к следующему шагу, пока dig не отдаёт правильный IP. Выпуск SSL-сертификата без работающего DNS не удастся.Шаг 3. Конфигурация
Создаём папку проекта:
mkdir -p ~/n8n && cd ~/n8nФайл с переменными:
nano .env# Домен
DOMAIN=n8n.вашдомен.ru
[email protected]
# База данных
POSTGRES_USER=n8n
POSTGRES_PASSWORD=замените_на_длинный_пароль
POSTGRES_DB=n8n
# Доступ в интерфейс
N8N_USER=admin
N8N_PASSWORD=замените_на_длинный_пароль
# Часовой пояс
TZ=Europe/Moscow⚠️ Пароли придумайте свои, длинные и разные. Сгенерировать можно так: openssl rand -base64 24Теперь docker-compose.yml:
nano docker-compose.ymlservices:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- n8n
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
environment:
- N8N_HOST=${DOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${DOMAIN}/
- N8N_EDITOR_BASE_URL=https://${DOMAIN}/
- GENERIC_TIMEZONE=${TZ}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
volumes:
n8n_data:
pg_data:
caddy_data:
caddy_config:Обратите внимание: наружу торчит только Caddy (порты 80 и 443). n8n и PostgreSQL доступны лишь внутри docker-сети - снаружи до них не достучаться.
И Caddyfile - он берёт SSL-сертификат автоматически:
nano Caddyfile{$DOMAIN} {
reverse_proxy n8n:5678
encode gzip
}Три строки. Caddy сам запросит сертификат Let's Encrypt и будет его продлевать - возиться с certbot не нужно.
Шаг 4. Запуск
docker compose up -dПервый запуск займёт пару минут: скачиваются образы, инициализируется база, выпускается сертификат.
Смотрим, что всё поднялось:
docker compose psВсе три контейнера должны быть в статусе Up:
NAME IMAGE STATUS PORTS
n8n-caddy-1 caddy:2-alpine Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
n8n-n8n-1 docker.n8n.io/n8nio/n8n:latest Up 2 minutes 5678/tcp
n8n-postgres-1 postgres:16-alpine Up 2 minutes 5432/tcpОбратите внимание на колонку PORTS: у Caddy порты проброшены наружу (0.0.0.0:443->443), а у n8n и PostgreSQL - нет. Они видны только внутри docker-сети, и это правильно.
Если какой-то контейнер в статусе Restarting или Exited - читаем логи:
docker compose logs -f n8n
docker compose logs -f caddyПроверим, что сертификат выпустился и сайт отвечает:
curl -I https://n8n.вашдомен.ruОжидаемый ответ - код 200 или 401 (второй означает, что базовая авторизация работает):
HTTP/2 401
server: Caddy
www-authenticate: Basic realm="n8n"Если видите HTTP/2 401 от Caddy - значит SSL получен и n8n отвечает. Теперь открывайте https://n8n.вашдомен.ru в браузере: он спросит логин и пароль из .env, а затем n8n предложит создать аккаунт владельца (форма Set up owner account). После неё откроется пустой рабочий стол с кнопкой Add first step - на этом установка закончена.
Шаг 5. Открываем порт
Если файрвол уже настроен, разрешите веб-трафик:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw statusПорт 5678 наружу открывать не нужно - n8n доступен только через Caddy.
Обновление
n8n развивается быстро, релизы выходят почти еженедельно. Обновление - три команды:
cd ~/n8n
docker compose pull
docker compose up -dДанные лежат в volume и переживают обновление контейнера.
⚠️ Перед обновлением сделайте бэкап. Мажорные версии иногда меняют формат данных, и откатиться назад без резервной копии не выйдет.
Чтобы не ловить неожиданные изменения, можно зафиксировать версию вместо latest:
image: docker.n8n.io/n8nio/n8n:1.70.0Резервное копирование
Ценность n8n - в сценариях и учётных данных. Всё это лежит в PostgreSQL.
Дамп базы:
cd ~/n8n
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backup-$(date +%F).sql.gzАвтоматизируем через cron - каждую ночь в 3:00:
crontab -e0 3 * * * cd /home/mike/n8n && docker compose exec -T postgres pg_dump -U n8n n8n | gzip > /home/mike/backups/n8n-$(date +\%F).sql.gz⚠️ Бэкап на том же сервере - это не бэкап. Если диск умрёт, вы потеряете и данные, и копии. Настройте выгрузку в объектное хранилище или на другой сервер.
Восстановление из дампа:
gunzip -c backup-2026-07-16.sql.gz | docker compose exec -T postgres psql -U n8n n8nЧастые проблемы
| Симптом | Причина | Решение |
|---|---|---|
| Сертификат не выпускается | DNS не разошёлся или закрыт 80-й порт | dig +short домен, откройте порт 80 |
| Вебхуки не приходят | Не задан WEBHOOK_URL | Проверьте переменную, перезапустите |
| Контейнер перезапускается | Мало памяти | docker stats, добавьте RAM |
| n8n не видит базу | Postgres ещё поднимается | Подождите, смотрите docker compose logs postgres |
| 502 от Caddy | n8n не стартовал | docker compose logs n8n |
Частые вопросы
Сколько стоит держать n8n на своём сервере? Столько же, сколько сервер: обычно от нескольких сотен рублей в месяц за конфигурацию 2 vCPU / 4 ГБ. Количество запусков сценариев при этом не тарифицируется.
Нужен ли обязательно домен? Для полноценной работы да. Без домена не выпустить SSL, а без HTTPS многие сервисы откажутся отправлять вебхуки на ваш n8n.
Можно ли обойтись без PostgreSQL? Можно, n8n по умолчанию использует SQLite. Но при росте нагрузки его придётся менять на Postgres с миграцией данных. Проще сразу поставить нужную БД.
Данные не потеряются при перезапуске контейнера? Нет. Сценарии и учётные данные лежат в PostgreSQL, настройки - в volume n8n_data. Контейнер можно удалять и пересоздавать.
Чем Caddy лучше Nginx в этой связке? Caddy сам получает и продлевает сертификаты Let's Encrypt, конфиг занимает три строки. С Nginx придётся отдельно настраивать certbot и следить за продлением.
Потянет ли n8n сценарии с обработкой файлов? Да, но памяти нужно больше: файл целиком попадает в оперативную память. Для регулярной работы с вложениями берите от 4 ГБ.
Нужен сервер под n8n? VPS на NVMe с активацией за 3 минуты - Docker ставится в одну команду, конфигурацию можно поднять до 4 ГБ RAM в пару кликов. Дата-центры Tier III в России и Европе, оплата в рублях.