n8n на сервері VPS: встановлення з Docker Compose і HTTPS через Caddy
Щоб розгорнути n8n на сервері, запустіть його в 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.