n8n – это платформа для автоматизации, в которой сценарии собираются из блоков, как в Zapier или Make. На своём сервере n8n не ограничивает число запусков, а данные и ключи от сервисов остаются у вас. В этой статье мы установим n8n в Docker вместе с веб-сервером Caddy, который сам получит бесплатный сертификат HTTPS. Все команды мы проверили на тестовом сервере с Debian 12, версия n8n на момент проверки 2.44.4.
Как устроена установка
Установка состоит из двух контейнеров. В первом работает сам n8n, он слушает порт 5678 только внутри Docker и наружу не открывается. Во втором работает Caddy, он принимает соединения на портах 80 и 443, получает сертификат Let's Encrypt для вашего домена и передаёт запросы в n8n. Такая схема важна по двум причинам. Без HTTPS не работают вебхуки многих сервисов, например Telegram, а порты, опубликованные Docker напрямую, открываются в обход брандмауэра UFW, поэтому n8n безопаснее держать за Caddy.
Ещё одна деталь, о которой редко пишут, это ключ шифрования. n8n хранит пароли и токены подключённых сервисов в зашифрованном виде, и шифрует их своим ключом. Если ключ потерять, например при переносе на другой сервер, все сохранённые подключения придётся вводить заново. Поэтому мы зададим ключ сами и сохраним его рядом с остальными настройками.
Что понадобится
- Сервер с Debian 12 или Ubuntu 24.04 и не меньше 2 ГБ памяти. На тестовом сервере n8n сразу после запуска занял около 370 МБ, а у сервера с 1 ГБ свободной памяти почти не осталось, поэтому для работы со сценариями подойдёт тариф DE-RZ9-1 или мощнее. Если сервера ещё нет, закажите его по инструкции.
- Домен или поддомен, направленный на IP-адрес сервера. Если домена нет, для проверки подойдёт бесплатный адрес вида
203-0-113-10.sslip.io, где вместо точек в IP-адресе сервера стоят дефисы. Такой адрес сам указывает на нужный IP. - Подключение по SSH, например через Termius. Команды ниже выполняются от имени
root.
1. Направьте домен на сервер
У регистратора домена создайте A-запись для нужного имени, например n8n.example.com, и укажите в ней IP-адрес сервера. Проверить, что запись заработала, можно на своём компьютере.
# Должен вывести IP-адрес вашего сервера
nslookup n8n.example.comПока запись не начала указывать на сервер, Caddy не сможет получить сертификат, поэтому дождитесь правильного ответа. Обычно это занимает от нескольких минут до часа.
2. Установите Docker
# Устанавливаем Docker официальным скриптом
curl -fsSL https://get.docker.com | sh
# Проверяем версии Docker и Compose
docker --version && docker compose version3. Создайте папку и файл с настройками
# Папка для n8n
mkdir -p /opt/n8n && cd /opt/n8n
# Файл с настройками, ключ шифрования генерируется сразу
cat > .env <<EOF
DOMAIN=n8n.example.com
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
GENERIC_TIMEZONE=Europe/Moscow
EOF
# Файл доступен только root
chmod 600 .envВместо n8n.example.com укажите свой домен. Переменная GENERIC_TIMEZONE задаёт часовой пояс, по которому n8n запускает сценарии по расписанию.
Сохраните файл .env
В нём лежит ключ шифрования. Скопируйте содержимое файла командой cat /opt/n8n/.env и сохраните в менеджере паролей. Без этого ключа сохранённые в n8n пароли и токены не восстановить.
4. Создайте файл для Caddy
cat > /opt/n8n/Caddyfile <<'EOF'
{$DOMAIN} {
reverse_proxy n8n:5678
}
EOFЭто вся настройка Caddy. Он возьмёт домен из файла .env, получит для него сертификат и будет передавать запросы в контейнер n8n.
5. Создайте файл docker-compose.yml
cat > /opt/n8n/docker-compose.yml <<'EOF'
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=${DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
n8n:
image: docker.n8n.io/n8nio/n8n:stable
restart: unless-stopped
environment:
- N8N_HOST=${DOMAIN}
- N8N_PROTOCOL=https
- N8N_PORT=5678
- WEBHOOK_URL=https://${DOMAIN}/
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
- NODE_ENV=production
volumes:
- n8n_data:/home/node/.n8n
volumes:
caddy_data:
caddy_config:
n8n_data:
EOFОбратите внимание на несколько строк.
- Образ
n8n:stableуказывает на последнюю стабильную версию n8n, на момент проверки это была 2.44.4. WEBHOOK_URLнужен, чтобы n8n показывал в вебхуках адрес вашего домена, а неlocalhost.- У n8n нет строки
ports, поэтому снаружи он доступен только через Caddy. - Тома
n8n_dataиcaddy_dataхранят данные n8n и сертификаты, они не пропадут при обновлении контейнеров.
6. Запустите n8n
cd /opt/n8n
# Скачиваем образы и запускаем в фоне
docker compose up -d
# Смотрим журнал n8n, выход из просмотра по Ctrl+C
docker compose logs -f n8nЧерез 20–40 секунд в журнале появится строка Editor is now accessible via с адресом вашего домена. Это значит, что n8n готов. В первые секунды после запуска сайт может отвечать ошибкой 502, пока n8n ещё не начал принимать соединения, это нормально.
7. Сразу создайте аккаунт владельца
Откройте в браузере https://ваш-домен. n8n покажет форму Set up owner account, где нужно указать почту, имя, фамилию и пароль. Пароль должен быть не короче 8 символов, с цифрой и заглавной буквой.

Первый вход в n8n
Не откладывайте регистрацию
Пока аккаунт владельца не создан, эту форму может заполнить кто угодно. На нашем тестовом сервере первые сканеры из интернета пришли на новый адрес уже через несколько секунд после выдачи сертификата. Создайте аккаунт сразу после запуска, а затем включите в настройках профиля двухфакторную аутентификацию.
Как обновить n8n
cd /opt/n8n
# Скачиваем новые образы и перезапускаем контейнеры
docker compose pull && docker compose up -dДанные, сценарии и ключ шифрования сохраняются, потому что лежат в томе n8n_data и в файле .env. Перед переходом на новую основную версию, например с 1.x на 2.x, прочитайте список изменений на сайте n8n и сделайте резервную копию.
Как сделать резервную копию
Все данные n8n лежат в томе Docker. Эта команда упакует его в архив в папке /root.
# Архив тома с данными n8n
docker run --rm -v n8n_n8n_data:/data -v /root:/backup alpine \
tar czf /backup/n8n-backup.tar.gz -C /data .Скачайте архив /root/n8n-backup.tar.gz к себе вместе с файлом /opt/n8n/.env. Без файла .env архив восстановится, но сохранённые пароли сервисов расшифровать не получится. Если папка установки называется не n8n, имя тома будет другим, посмотреть его можно командой docker volume ls.
Если что-то не работает
Сайт отвечает ошибкой 502
Если n8n только что запущен, подождите минуту, он ещё загружается. Если ошибка не проходит, посмотрите журнал командой docker compose logs --tail 50 n8n. Частая причина на серверах с 1 ГБ памяти в том, что n8n не хватает памяти и он перезапускается.
Сертификат не выпускается, браузер ругается на HTTPS
Посмотрите журнал Caddy командой docker compose logs --tail 50 caddy. Чаще всего домен ещё не указывает на сервер или закрыт порт 80, через который Let's Encrypt проверяет домен. Проверьте A-запись и, если включён UFW, откройте порты командой ufw allow 80/tcp && ufw allow 443/tcp.
В вебхуках указан localhost
Значит, n8n не получил переменную WEBHOOK_URL. Проверьте, что она есть в файле docker-compose.yml, а домен в файле .env указан без опечаток, и перезапустите контейнеры командой docker compose up -d.
После переноса на другой сервер не работают подключения к сервисам
На новом сервере используется другой ключ шифрования. Скопируйте на новый сервер старый файл .env с прежним N8N_ENCRYPTION_KEY и перезапустите n8n.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Официальный сайт: https://f3cloud.com