Эта инструкция ставит n8n так, как мы делаем это для клиентов: с базой Postgres, автоматическим HTTPS и резервными копиями. Займёт 30–60 минут.
Что понадобится
- VPS с Ubuntu 24.04: 2 vCPU, 4 ГБ памяти, от 40 ГБ диска. Подойдут Timeweb Cloud, Selectel или Yandex Cloud.
- Домен или поддомен, например
n8n.example.ru, с A-записью на IP-адрес сервера. - Доступ к серверу по SSH.
Шаг 1. Установить Docker
Пакеты Docker есть в стандартном репозитории Ubuntu:
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER
После последней команды выйдите из SSH и зайдите снова, чтобы группа применилась.
Шаг 2. Подготовить папку и секреты
mkdir -p ~/n8n && cd ~/n8n
mkdir -p n8n_data postgres_data caddy_data backups
sudo chown -R 1000:1000 n8n_data
Создайте файл .env с настройками:
N8N_HOST=n8n.example.ru
POSTGRES_PASSWORD=длинный_случайный_пароль
N8N_ENCRYPTION_KEY=длинный_случайный_ключ
Случайные значения удобно получить командой openssl rand -hex 24.
Сохраните
N8N_ENCRYPTION_KEYв надёжном месте. Этим ключом шифруются доступы к вашим системам. Без него после восстановления из резервной копии подключения придётся настраивать заново.
Шаг 3. Описать сервисы
Файл docker-compose.yml:
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- ./postgres_data:/var/lib/postgresql/data
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: https
WEBHOOK_URL: https://${N8N_HOST}/
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: Europe/Moscow
TZ: Europe/Moscow
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgres
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
Вместо latest лучше указать конкретную версию n8n из списка релизов. Тогда обновления не будут приходить неожиданно.
В n8n 2.35 и новее адрес для вебхуков задаётся переменной N8N_WEBHOOK_URL. Старое имя WEBHOOK_URL пока работает, но n8n пишет в журнал предупреждение. Если ставите свежую версию, используйте новое имя.
Шаг 4. Настроить HTTPS
Caddy сам получит и будет продлевать сертификат. Файл Caddyfile:
n8n.example.ru {
reverse_proxy n8n:5678
}
Шаг 5. Запустить
docker compose up -d
docker compose logs -f n8n
Откройте https://n8n.example.ru, создайте учётную запись владельца и включите двухфакторную аутентификацию в настройках профиля.
Если образы не скачиваются
Docker Hub бывает недоступен с российских серверов. В этом случае пропишите зеркало реестра от вашего облачного провайдера в /etc/docker/daemon.json в параметре registry-mirrors и перезапустите Docker командой sudo systemctl restart docker. Адрес зеркала есть в документации провайдера.
Резервные копии
Ежедневная копия базы:
cd ~/n8n
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backups/n8n_$(date +%F).sql.gz
Добавьте команду в crontab и храните копии вне сервера, например в объектном хранилище того же провайдера. Вместе с базой сохраняйте файл .env.
Обновление
- Сделайте резервную копию.
- Поменяйте версию образа n8n в
docker-compose.yml. - Выполните
docker compose pull && docker compose up -d. - Проверьте, что сценарии запускаются без ошибок.
Базовая безопасность
- Откройте снаружи только порты 22, 80 и 443:
sudo ufw allow 22,80,443/tcp && sudo ufw enable. - Входите на сервер по SSH-ключу, вход по паролю отключите.
- Выпускайте ключи API к своим системам только на нужные разделы и, где можно, только на чтение.
Частые вопросы
Сколько стоит сервер для n8n?
Для небольшой компании хватает VPS с 2 vCPU и 4 ГБ памяти. В российских облаках это обычно 1–2 тыс ₽ в месяц.
Можно ли поставить n8n без Docker?
Можно, через npm. Но Docker проще обновлять и переносить на другой сервер, поэтому мы ставим его.
Почему не облачная версия n8n?
Облачная версия n8n хранит данные за рубежом, а оплатить её из России сложно. Собственный сервер в российском облаке решает обе проблемы.