> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/docker/ustanovka-n8n-na-vps-servere.md](https://docs.f3cloud.com/ru/docker/ustanovka-n8n-na-vps-servere.md).

# Установка n8n на VPS в Docker с HTTPS через Caddy

Как установить n8n на VPS в Docker с автоматическим HTTPS через Caddy. Домен, ключ шифрования, docker-compose, первый вход, обновление и резервная копия. Проверено на n8n 2.44.4 и Debian 12.

**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**](https://f3cloud.com/ru/vps-ai-agents#cloud-vps) или мощнее. Если сервера ещё нет, закажите его по [инструкции](https://docs.f3cloud.com/ru/client-area/order-vps.md).
* **Домен или поддомен**, направленный на IP-адрес сервера. Если домена нет, для проверки подойдёт бесплатный адрес вида `203-0-113-10.sslip.io`, где вместо точек в IP-адресе сервера стоят дефисы. Такой адрес сам указывает на нужный IP.
* **Подключение по SSH**, например через [Termius](https://docs.f3cloud.com/ru/vps/termius-connection.md). Команды ниже выполняются от имени `root`.

***

## 1. Направьте домен на сервер

У регистратора домена создайте **A-запись** для нужного имени, например `n8n.example.com`, и укажите в ней IP-адрес сервера. Проверить, что запись заработала, можно на своём компьютере.

```bash
# Должен вывести IP-адрес вашего сервера
nslookup n8n.example.com
```

Пока запись не начала указывать на сервер, Caddy не сможет получить сертификат, поэтому дождитесь правильного ответа. Обычно это занимает от нескольких минут до часа.

***

## 2. Установите Docker

```bash
# Устанавливаем Docker официальным скриптом
curl -fsSL https://get.docker.com | sh

# Проверяем версии Docker и Compose
docker --version && docker compose version
```

***

## 3. Создайте папку и файл с настройками

```bash
# Папка для 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

```bash
cat > /opt/n8n/Caddyfile <<'EOF'
{$DOMAIN} {
    reverse_proxy n8n:5678
}
EOF
```

Это вся настройка Caddy. Он возьмёт домен из файла `.env`, получит для него сертификат и будет передавать запросы в контейнер `n8n`.

***

## 5. Создайте файл docker-compose.yml

```bash
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

```bash
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 символов**, с цифрой и заглавной буквой.

<figure><img src="https://docs.f3cloud.com/img/n8n-owner-setup.png" alt="Форма создания аккаунта владельца n8n" width="300"><figcaption><p>Первый вход в n8n</p></figcaption></figure>

> **Не откладывайте регистрацию.**
>
> Пока аккаунт владельца не создан, эту форму может заполнить кто угодно. На нашем тестовом сервере первые сканеры из интернета пришли на новый адрес уже через несколько секунд после выдачи сертификата. Создайте аккаунт сразу после запуска, а затем включите в настройках профиля двухфакторную аутентификацию.

***

## Как обновить n8n

```bash
cd /opt/n8n

# Скачиваем новые образы и перезапускаем контейнеры
docker compose pull && docker compose up -d
```

Данные, сценарии и ключ шифрования сохраняются, потому что лежат в томе `n8n_data` и в файле `.env`. Перед переходом на новую основную версию, например с 1.x на 2.x, прочитайте список изменений на сайте n8n и сделайте резервную копию.

***

## Как сделать резервную копию

Все данные n8n лежат в томе Docker. Эта команда упакует его в архив в папке `/root`.

```bash
# Архив тома с данными 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`.

***

## Если что-то не работает

<details>

<summary>Сайт отвечает ошибкой 502</summary>

Если n8n только что запущен, подождите минуту, он ещё загружается. Если ошибка не проходит, посмотрите журнал командой `docker compose logs --tail 50 n8n`. Частая причина на серверах с 1 ГБ памяти в том, что n8n не хватает памяти и он перезапускается.

</details>

<details>

<summary>Сертификат не выпускается, браузер ругается на HTTPS</summary>

Посмотрите журнал Caddy командой `docker compose logs --tail 50 caddy`. Чаще всего домен ещё не указывает на сервер или закрыт порт 80, через который Let's Encrypt проверяет домен. Проверьте A-запись и, если включён UFW, откройте порты командой `ufw allow 80/tcp && ufw allow 443/tcp`.

</details>

<details>

<summary>В вебхуках указан localhost</summary>

Значит, n8n не получил переменную `WEBHOOK_URL`. Проверьте, что она есть в файле `docker-compose.yml`, а домен в файле `.env` указан без опечаток, и перезапустите контейнеры командой `docker compose up -d`.

</details>

<details>

<summary>После переноса на другой сервер не работают подключения к сервисам</summary>

На новом сервере используется другой ключ шифрования. Скопируйте на новый сервер старый файл `.env` с прежним `N8N_ENCRYPTION_KEY` и перезапустите n8n.

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Официальный сайт:** [https://f3cloud.com](https://f3cloud.com/ru)
