EUR
european

EUR

usa

USD

Ex. VAT Ex. VAT 0%

Установка n8n с Docker и PostgreSQL

n8n это платформа для автоматизации рабочих процессов, которую можно запустить на собственном сервере. В self-hosted установке workflows, учётные данные и история выполнений остаются под вашим контролем, а число workflows и запусков ограничено только ресурсами сервера.

В этой инструкции мы развернём n8n на выделенном сервере с PostgreSQL, HTTPS и резервным копированием. Используются три контейнера под управлением Docker Compose:

  • n8n, сама платформа автоматизации;
  • PostgreSQL, база данных для workflows, учётных данных и истории выполнений;
  • Caddy, обратный прокси, который сам получает и продлевает HTTPS-сертификат.

По умолчанию n8n хранит данные в SQLite. В этой инструкции вместо неё используется PostgreSQL: её можно бэкапить без остановки n8n, и именно её n8n рекомендует для self-hosted установок.

Шаги проверены на Ubuntu 24.04 LTS с n8n 2.46.7, PostgreSQL 17, Docker 29 и Docker Compose v5.

Что понадобится

Вам понадобится:

  • сервер с Ubuntu 24.04 LTS и root-доступом по SSH;
  • домен или поддомен для n8n, например n8n.example.com;
  • запись A для этого имени, указывающая на IPv4-адрес сервера.

Если у домена есть ещё и запись AAAA, сервер должен быть доступен по этому IPv6-адресу. Иначе Let's Encrypt может сначала попробовать IPv6 и не выпустить сертификат.

Перед тем как продолжить, проверьте, что запись указывает на ваш сервер:

dig +short n8n.example.com

Команда должна вернуть IP-адрес сервера. От этого зависит выпуск сертификата в Caddy, поэтому дождитесь, пока DNS обновится.

Все команды ниже выполняются от root. Если вы работаете под обычным пользователем с правами sudo, добавляйте sudo перед каждой командой.

Установка Docker

Установите Docker Engine и плагин Compose из официального репозитория Docker. Пакет docker.io из репозитория Ubuntu старее и не включает Compose v2.

apt update && apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc

Добавьте репозиторий:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list

Установите пакеты:

apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверьте, что обе утилиты доступны:

docker --version docker compose version

Каталог проекта и секреты

Все файлы n8n будут лежать в /opt/n8n:

mkdir -p /opt/n8n && cd /opt/n8n

Создайте файл .env с доменом, часовым поясом и сгенерированными секретами. Замените n8n.example.com и часовой пояс на свои значения:

cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env

GENERIC_TIMEZONE задаёт часовой пояс для Schedule Trigger и других нод, работающих по времени. Без него n8n использует America/New_York.

N8N_ENCRYPTION_KEY это ключ, которым n8n шифрует сохранённые в нём учётные данные: API-токены, пароли, OAuth-секреты. Если ключ потерян, учётные данные в восстановленной базе расшифровать не получится, и каждый из них придётся вводить заново.

Warning

Сразу скопируйте файл .env в надёжное место вне сервера, например в менеджер паролей. Бэкап базы без N8N_ENCRYPTION_KEY восстановит workflows, но не учётные данные.

Файл Docker Compose

Создайте файл /opt/n8n/compose.yaml:

services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped depends_on: postgres: condition: service_healthy environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_DATABASE: ${POSTGRES_DB} DB_POSTGRESDB_USER: ${POSTGRES_USER} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:

Несколько деталей этого файла важны для безопасности и стабильной работы.

У PostgreSQL нет раздела ports. База доступна только другим контейнерам проекта и никогда не видна из интернета.

Порт n8n опубликован как 127.0.0.1:5678. Пользователи попадают в n8n только через Caddy по HTTPS, а вы при этом можете проверить n8n локально на сервере.

Warning

Не сокращайте строку с портом n8n до 5678:5678. Для опубликованных портов Docker добавляет собственные правила файрвола, и они обходят UFW. Без префикса 127.0.0.1 n8n станет доступен по обычному HTTP откуда угодно, даже если UFW блокирует порт 5678.

Условие depends_on с healthcheck заставляет n8n ждать, пока PostgreSQL будет готов принимать подключения. Без него после перезагрузки сервера n8n может стартовать раньше базы и не подключиться к ней.

N8N_PROXY_HOPS сообщает n8n, что он работает за одним обратным прокси, поэтому реальный адрес клиента берётся из заголовков прокси. N8N_WEBHOOK_URL задаёт публичный адрес, который n8n показывает в URL вебхуков. В версиях n8n до 2.30 эта переменная называется WEBHOOK_URL.

Настройка HTTPS через Caddy

Создайте файл /opt/n8n/Caddyfile со своим доменом:

n8n.example.com { reverse_proxy n8n:5678 }

Это вся конфигурация. При первом запуске Caddy запросит сертификат Let's Encrypt для домена, настроит перенаправление с HTTP на HTTPS и будет продлевать сертификат до истечения срока. Для этого порты 80 и 443 должны быть открыты.

Настройка файрвола

Сначала разрешите SSH, затем HTTP и HTTPS, и включите UFW:

ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status

Info

Если UFW уже был включён с вашими правилами, перед изменениями выполните ufw status и сохраните нужные правила. Разрешение OpenSSH до включения UFW не даст оборвать текущую SSH-сессию.

Запуск n8n

Запустите контейнеры в фоне:

cd /opt/n8n docker compose up -d

Первый запуск скачивает образы и занимает минуту-две. Проверьте, что все три контейнера работают, а PostgreSQL в состоянии healthy:

docker compose ps

Посмотрите лог n8n:

docker compose logs n8n --tail 50

Лог должен заканчиваться строкой вида:

Editor is now accessible via: https://n8n.example.com

Проверьте, что n8n отвечает локально и через Caddy:

curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz

Обе команды должны вернуть {"status":"ok"}.

Если вторая команда не проходит, посмотрите лог Caddy командой docker compose logs caddy. Чаще всего причина в том, что запись DNS ещё не указывает на этот сервер или закрыты порты 80 и 443.

Создание аккаунта владельца

Откройте https://n8n.example.com в браузере. При первом входе n8n предложит создать аккаунт владельца. У него полные права на экземпляр n8n, он управляет всеми остальными пользователями.

Укажите email, имя, фамилию и пароль, затем нажмите Next. Пароль должен быть не короче 8 символов и содержать хотя бы одну цифру и одну заглавную букву. Выберите надёжный пароль: редактор n8n открыт в интернет, и тот, кто в него попадёт, сможет выполнять команды на сервере через ваши workflows.

После первого входа n8n покажет короткий опрос: Customize n8n to you. Отвечать на вопросы не обязательно. Нажмите Get started, чтобы закрыть его, с ответами или без.

Затем n8n предложит бесплатный лицензионный ключ на несколько функций Community Edition: расширенную отладку, поиск и теги для выполнений, папки для workflows. Ключ приходит на указанный email. Нажмите Send me a free license key, чтобы получить его, или Skip, если эти функции не нужны.

Откроется главная страница. Установка завершена, можно создавать первый workflow.

Резервное копирование n8n

Бэкап n8n состоит из двух частей: дампа PostgreSQL с workflows, учётными данными, пользователями и историей выполнений, и файла .env с N8N_ENCRYPTION_KEY. Одна часть без другой бесполезна.

В этой конфигурации n8n хранит всё своё состояние в PostgreSQL. Том n8n_data бэкапить не нужно: полное восстановление работает только из дампа базы и файла .env.

Создайте каталог для бэкапов и сделайте дамп базы:

mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/

Дамп снимается на работающем n8n, останавливать сервис не нужно.

Бэкап, который остаётся на том же сервере, не поможет при отказе диска. Регулярно копируйте /opt/n8n-backup во внешнее хранилище. Для этого подойдёт INTROSERV Cloud Storage, как описано в руководстве Подключение облачного хранилища Introserv к серверу.

Восстановление из бэкапа

Чтобы восстановить n8n на новом сервере, установите Docker, как описано выше, и скопируйте каталог бэкапа в /opt/n8n-backup на этом сервере. Затем разложите файлы конфигурации:

mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env

Если у нового сервера другой IP-адрес, сначала обновите запись A домена.

Запустите только базу данных:

cd /opt/n8n docker compose up -d postgres

Дождитесь, пока docker compose ps покажет PostgreSQL в состоянии healthy, и восстановите дамп:

docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump

Запустите остальные контейнеры:

docker compose up -d

Войдите под тем же аккаунтом владельца и проверьте, что workflows и учётные данные на месте. Сохранённые учётные данные расшифровываются ключом N8N_ENCRYPTION_KEY из восстановленного файла .env, поэтому вводить их заново не нужно.

Обновление n8n

Обновления n8n выходят часто. Чтобы обновиться до последней версии, скачайте новые образы и пересоздайте контейнеры:

cd /opt/n8n docker compose pull docker compose up -d docker image prune -f

Последняя команда удаляет старые образы, которые больше не используются.

Проверьте новую версию:

docker compose exec n8n n8n --version

Tip

Делайте бэкап перед каждым обновлением. При запуске новая версия n8n может изменить схему базы данных, поэтому надёжный способ вернуться на прежнюю версию это восстановить дамп, сделанный до обновления.

Образ PostgreSQL закреплён на мажорной версии 17, поэтому docker compose pull устанавливает только минорные обновления PostgreSQL. Переход на новую мажорную версию требует дампа и восстановления и автоматически не выполняется.

Что дальше

Экземпляр n8n готов к работе. Дальше можно:

  1. Пригласить других пользователей;
  2. Настроить SMTP, чтобы n8n мог отправлять приглашения и письма для сброса пароля;
  3. Подключить свои сервисы и собрать первые workflows.

Если вы планируете запускать AI-workflows с локальными языковыми моделями, смотрите руководство Установка n8n AI Starter Kit с Ollama .

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Русский
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA