Как установить 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.