Перейти к содержимому
VPS и серверы · 7 мин

Как установить n8n на VPS: Docker Compose и HTTPS через Caddy

Чтобы установить n8n на VPS, запустите его в Docker Compose вместе с PostgreSQL, а перед ним поставьте Caddy: он сам получает сертификат Let's Encrypt, поэтому редактор и вебхуки работают по HTTPS с первого запуска. На Ubuntu 24.04 или Debian 12 всё занимает около 15 минут.

Что понадобится

  • VPS. Pulse (2 vCPU, 2 ГБ RAM, 15 ГБ NVMe, $10 в месяц) — комфортный минимум для n8n с PostgreSQL. Если планируете тяжёлые сценарии с большими JSON или файлами, берите Drive.
  • Домен или поддомен (например, n8n.example.com) с A-записью на IP сервера. Без неё Caddy не выпустит сертификат.
  • Root-доступ по SSH (см. Подключение по SSH) и установленный Docker (см. Docker на VPS).

1. Файрвол и Docker

apt update && apt install -y ufw
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 443/udp
ufw enable
curl -fsSL https://get.docker.com | sh

Порты публикует только Caddy. n8n и PostgreSQL остаются внутри сети Docker: опубликованные порты Docker обходят ufw.

2. Секреты

mkdir -p /opt/n8n && cd /opt/n8n
cat > .env <<EOF
DOMAIN=n8n.example.com
DB_PASSWORD=$(openssl rand -hex 16)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
EOF
chmod 600 .env

Сохранённые учётные данные n8n шифрует ключом N8N_ENCRYPTION_KEY. Потеряете его — все сохранённые credentials станут нечитаемыми, поэтому бэкапьте .env вместе с базой.

3. docker-compose.yml

/opt/n8n/docker-compose.yml:

services:
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - db:/var/lib/postgresql/data

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: unless-stopped
    depends_on: [db]
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: db
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${DB_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${DOMAIN}
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://${DOMAIN}/
      N8N_PROXY_HOPS: 1
      GENERIC_TIMEZONE: Europe/Berlin
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 168
    volumes:
      - n8n:/home/node/.n8n

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data

volumes:
  db:
  n8n:
  caddy_data:

В GENERIC_TIMEZONE укажите свой часовой пояс: по нему работают узлы Cron и Schedule.

4. Caddyfile

/opt/n8n/Caddyfile (замените домен):

n8n.example.com {
    reverse_proxy n8n:5678
}

WebSocket Caddy проксирует из коробки, так что живые обновления в редакторе работают без дополнительных настроек.

5. Запуск

cd /opt/n8n
docker compose up -d
docker compose logs -f caddy n8n

Откройте https://n8n.example.com и сразу создайте учётную запись владельца. Пока вы этого не сделали, экземпляр достанется тому, кто первым откроет страницу.

Частые ошибки

  • В адресах вебхуков localhost:5678. Не задан или неверен WEBHOOK_URL. Исправьте его в compose-файле и выполните docker compose up -d.
  • Нет сертификата. A-запись ещё не указывает на сервер или закрыты порты 80/443. Точную причину покажет docker compose logs caddy.
  • Заканчивается диск. История выполнений хранится в PostgreSQL. При 15 ГБ держите очистку включённой (как выше) и не сохраняйте бинарные файлы в выполнениях.
  • Обновления. docker compose pull && docker compose up -d. Перед мажорными версиями читайте release notes n8n.
  • Бэкапы — ваша задача. docker compose exec -T db pg_dump -U n8n n8n > n8n.sql плюс файл .env, по расписанию и за пределы сервера.

Хотите на такой же схеме файлы и календари? Смотрите Nextcloud на VPS.

Заказать Pulse

Как установить n8n на VPS: Docker Compose и HTTPS через Caddy · dedisrv