EN EN

Устанавливаем n8n в Docker с HAProxy: Понятное руководство для начинающих

Опубликовано 02.07.2025

Привет, друзья! Сегодня мы погрузимся в мир автоматизации и развернем n8n — мощный инструмент для создания рабочих процессов. Мы установим его в Docker, а в качестве «ворот» в интернет будем использовать надежный реверс-прокси HAProxy.

Это руководство создано специально для новичков. Мы пойдем по шагам, объясняя каждую команду, чтобы вы не только сделали, но и поняли, как всё работает.

Зачем вообще нужен HAProxy?

Можно было бы просто открыть порты n8n в интернет, так? Да, но это небезопасно и неудобно. HAProxy выступит в роли охранника и диспетчера:

  1. Безопасность (SSL/TLS): Он будет обрабатывать HTTPS-запросы, шифруя трафик между пользователем и вашим сервером.
  2. Единая точка входа: Все запросы на ваш домен будут приходить на HAProxy, а он уже будет решать, какому приложению их передать. Это удобно, если вы захотите добавить на этот же сервер другие сервисы.
  3. Гибкость: HAProxy — невероятно мощный инструмент, и освоив его сейчас, вы сможете в будущем настраивать сложные правила и балансировку нагрузки.

Что нам понадобится? ✅

  • Сервер с Ubuntu/Debian: Подойдет любой виртуальный или выделенный сервер.
  • Установленные Docker и Docker Compose: Это наша основная рабочая среда.
  • Доменное имя: Оно должно быть привязано к IP-адресу вашего сервера (через A-запись в настройках DNS).
  • SSH-доступ к серверу с правами sudo.

Шаг 1: Подготовка сервера и структуры проекта

Сначала убедимся, что система обновлена, и создадим папки для нашего проекта.

  1. Обновите пакеты:

    sudo apt update && sudo apt upgrade -y
    
  2. Проверьте версии Docker:

    docker --version
    docker compose version
    

    Если команды вернули версии, всё отлично. Если нет — их нужно установить по официальной документации.

  3. Создайте каталог для проекта: Мы будем хранить все файлы в одном месте.

    mkdir ~/n8n-project
    cd ~/n8n-project
    
  4. Создайте подкаталоги: Один для данных n8n, другой для конфигурации HAProxy.

    mkdir -p ./n8n-data
    mkdir -p ./haproxy
    

Шаг 2: Создание файла docker-compose.yml

Это главный файл, который описывает, как Docker должен запускать наши приложения (сервисы). Создайте файл docker-compose.yml в папке ~/n8n-project и добавьте в него этот код.

⚠️ Важно: Замените n8n.ВАШ_ДОМЕН.com, ВАШ_ЛОГИН и ВАШ_СУПЕР_ПАРОЛЬ на ваши реальные данные.

version: '3.8'

services:
  n8n:
    image: n8nio/n8n
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678" # Открываем порт только для HAProxy внутри сервера
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=ВАШ_ЛОГИН # 👈 Замените
      - N8N_BASIC_AUTH_PASSWORD=ВАШ_СУПЕР_ПАРОЛЬ # 👈 Замените
      - WEBHOOK_URL=https://n8n.ВАШ_[ДОМЕН.com/](https://ДОМЕН.com/)
      - N8N_HOST=n8n.ВАШ_ДОМЕН.com # 👈 Замените
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
    volumes:
      - ./n8n-data:/home/node/.n8n # Привязываем папку для хранения данных n8n
    networks:
      - n8n_network

  haproxy:
    image: haproxy:2.8 # Используем официальный образ
    container_name: haproxy
    restart: unless-stopped
    ports:
      - "80:80"   # Для HTTP и получения сертификата
      - "443:443" # Для HTTPS
    volumes:
      - ./haproxy:/usr/local/etc/haproxy:ro # :ro означает "только для чтения"
    networks:
      - n8n_network
    depends_on: # Запускаем HAProxy только после n8n
      - n8n

networks:
  n8n_network:
    driver: bridge

💡 Ключевые моменты:

  • ports: - "127.0.0.1:5678:5678": Мы сделали порт n8n доступным только внутри сервера. Никто извне не сможет подключиться к нему напрямую, только через HAProxy.
  • volumes: - ./n8n-data:/home/node/.n8n: Мы «пробрасываем» папку n8n-data с нашего сервера внутрь контейнера. Так все ваши рабочие процессы и настройки сохранятся, даже если контейнер будет удален или обновлен.

Шаг 3: Настройка HAProxy

Теперь настроим нашего «охранника». Создайте файл haproxy.cfg в папке ~/n8n-project/haproxy/ и добавьте в него эту базовую конфигурацию.

⚠️ Важно: Пока мы не будем включать SSL/HTTPS. Наша цель — сначала запустить всё по HTTP, получить сертификат, и только потом включить шифрование.

global
    daemon
    log stdout local0

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5s
    timeout client  50s
    timeout server  50s

frontend http_front
    bind *:80
    acl host_n8n hdr(host) -i n8n.ВАШ_ДОМЕН.com # 👈 Замените
    use_backend n8n_backend if host_n8n

backend n8n_backend
    server n8n n8n:5678 check

Как это работает?

  • frontend http_front: Это «лицо» нашего прокси. Он принимает входящие подключения на *:80 (80-й порт).
  • acl host_n8n...: Создается правило (ACL) с именем host_n8n. Оно сработает, если кто-то зайдет на сайт n8n.ВАШ_ДОМЕН.com.
  • use_backend n8n_backend...: Если правило сработало, HAProxy отправляет запрос в n8n_backend.
  • backend n8n_backend: Это описание нашего приложения. server n8n n8n:5678 check говорит HAProxy: «Отправляй трафик на контейнер с именем n8n на его порт 5678». Имя n8n здесь — это имя сервиса из docker-compose.yml.

Шаг 4: Первый запуск и получение SSL-сертификата

Теперь, когда база готова, запустим контейнеры и получим заветный SSL-сертификат от Let’s Encrypt с помощью утилиты acme.sh. Мы используем самый простой метод верификации — через HTTP.

  1. Запустите Docker Compose:

    cd ~/n8n-project
    docker compose up -d
    

    Команда -d запускает контейнеры в фоновом режиме. Проверьте, что все работает:

    docker compose ps
    

    Вы должны увидеть два запущенных контейнера: n8n и haproxy.

  2. Установите acme.sh:

    curl [https://get.acme.sh](https://get.acme.sh) | sh
    source ~/.bashrc
    
  3. Выпустите сертификат: Эта команда скажет Let’s Encrypt проверить ваш домен. acme.sh создаст временный файл, а Let’s Encrypt попробует его прочитать по HTTP. Так как наш HAProxy уже работает на 80-м порту, всё пройдет успешно.

    # Указываем acme.sh, куда складывать файлы для проверки
    sudo mkdir -p /var/www/acme-challenge 
    sudo chown $USER:$USER /var/www/acme-challenge
    
    # Запрашиваем сертификат
    ~/.acme.sh/acme.sh --issue -d n8n.ВАШ_ДОМЕН.com --webroot /var/www/acme-challenge/
    
  4. Установите сертификат для HAProxy: HAProxy требует, чтобы ключ и сертификат были в одном файле. acme.sh может сделать это автоматически и настроить автообновление.

    # Создаем папку для сертификатов внутри папки проекта
    mkdir -p ~/n8n-project/haproxy/certs
    
    # Устанавливаем сертификат с командой автообновления
    ~/.acme.sh/acme.sh --install-cert -d n8n.ВАШ_ДОМЕН.com \
        --key-file       ~/n8n-project/haproxy/certs/privkey.pem \
        --fullchain-file ~/n8n-project/haproxy/certs/fullchain.pem \
        --reloadcmd      "cat ~/n8n-project/haproxy/certs/fullchain.pem ~/n8n-project/haproxy/certs/privkey.pem > ~/n8n-project/haproxy/certs/custom.pem && docker compose -f ~/n8n-project/docker-compose.yml restart haproxy"
    

    Это самая важная команда! Она не только копирует сертификаты, но и настраивает reloadcmd — команду, которая будет выполняться каждые 60 дней для автоматического обновления сертификата. Она объединяет ключ и сертификат в один файл custom.pem и плавно перезапускает HAProxy.


Шаг 5: Включаем HTTPS в HAProxy

Сертификат получен! Осталось только научить HAProxy его использовать.

  1. Откройте ~/n8n-project/haproxy/haproxy.cfg и приведите его к такому виду:

    global
        daemon
        log stdout local0
        # Добавляем настройки для SSL
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
    
    defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5s
        timeout client  50s
        timeout server  50s
    
    frontend http_https_front
        # Принимаем подключения на 80 и 443 порты
        bind *:80
        bind *:443 ssl crt /usr/local/etc/haproxy/certs/custom.pem
    
        # Автоматически перенаправляем всех с HTTP на HTTPS
        http-request redirect scheme https unless { ssl_fc }
    
        # Проверяем домен, как и раньше
        acl host_n8n hdr(host) -i n8n.ВАШ_ДОМЕН.com # 👈 Замените
        use_backend n8n_backend if host_n8n
    
    backend n8n_backend
        # Добавляем заголовок, чтобы n8n знал, что работа идет через HTTPS
        http-request set-header X-Forwarded-Proto https if { ssl_fc }
        server n8n n8n:5678 check
    
  2. Перезапустите HAProxy, чтобы он применил новую конфигурацию:

    cd ~/n8n-project
    docker compose restart haproxy
    

Шаг 6: Финальная проверка

Откройте ваш домен в браузере: https://n8n.ВАШ_ДОМЕН.com.

Вы должны увидеть:

  1. Замочек в адресной строке — это значит, что ваше SSL-соединение работает.
  2. Окно авторизации n8n. Введите логин и пароль, которые вы указали в docker-compose.yml.

Если все так, то поздравляю! Вы успешно развернули n8n с безопасным доступом по HTTPS! 🎉

Что дальше? (Обслуживание)

  • Обновление n8n: Чтобы обновить n8n до последней версии, достаточно выполнить две команды в папке ~/n8n-project:
    docker compose pull n8n # Скачивает новую версию образа
    docker compose up -d    # Пересоздает контейнер с новой версией
    
  • Резервное копирование: Самое ценное — это ваши рабочие процессы. Они хранятся в папке ~/n8n-project/n8n-data. Регулярно делайте ее резервную копию.
  • Автообновление сертификата: acme.sh автоматически добавил задачу в cron. Сертификат будет обновляться без вашего участия.

Надеюсь, это руководство было для вас полезным. Теперь вы готовы автоматизировать мир с помощью n8n!

Похожие посты

Свяжитесь со мной

Обсудим ваш проект и найдём подходящее решение