Установка n8n на свой сервер: Docker, домен и SSL за час

n8n - это конструктор автоматизаций: связывает между собой сервисы, базы данных и API без написания кода. Аналог Zapier и Make, с одним принципиальным отличием - его можно поставить на собственный сервер.

Почему это важно: через автоматизации проходят рабочие данные. Заявки клиентов, содержимое CRM, письма, документы. В облачной версии всё это проходит через чужую инфраструктуру и тарифицируется по количеству операций. На своём сервере данные остаются у вас, а количество запусков не ограничено ничем, кроме мощности сервера.

Разберём установку через Docker: это самый предсказуемый способ, который переживает обновления без сюрпризов.

Облако или свой сервер

n8n CloudСвой сервер
ОплатаЗа количество исполненийФиксированная аренда сервера
ДанныеНа серверах вендораТолько у вас
Лимит запусковПо тарифуОграничен только железом
ОбновленияАвтоматическиВручную, когда удобно
Свои npm-пакетыОграниченноБез ограничений
Порог входаРегистрацияЧас на настройку

Свой сервер выигрывает, когда автоматизаций много, данные чувствительные или нужны свои зависимости. Облако проще, если запусков десятки в месяц и разбираться с администрированием не хочется.

Требования к серверу

n8n нетребователен, пока рабочих процессов немного. Реальные ориентиры:

НагрузкаvCPURAMДиск
Тест, до 10 сценариев12 ГБ20 ГБ NVMe
Рабочий контур, до 50 сценариев24 ГБ40 ГБ NVMe
Активная работа, обработка файлов48 ГБ80 ГБ NVMe

Про память: 1 ГБ формально хватит для запуска, но при первом же тяжёлом сценарии контейнер упадёт по OOM. Берите от 2 ГБ.

Что ещё понадобится:

  • сервер с Ubuntu 22.04 или 24.04;
  • домен или поддомен (например, n8n.вашдомен.ru);
  • 60 минут.
Сервер должен быть уже настроен по базовой безопасности: пользователь с sudo, ключи, файрвол. Если это ещё не сделано, начните с инструкции Настройка VPS с нуля.

Как это устроено

Схема сборки простая: reverse-proxy принимает HTTPS-трафик и передаёт его в n8n, а n8n хранит данные в PostgreSQL.

Интернет → Caddy (SSL) → n8n → PostgreSQL, всё внутри Docker.
Интернет → Caddy (SSL) → n8n → PostgreSQL, всё внутри Docker.

Зачем 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-запись:

ТипИмяЗначение
An8nIP-адрес сервера

Получится 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.yml
services:
  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 -e
0 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 от Caddyn8n не стартовал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 в России и Европе, оплата в рублях.