Обзор развертывания n8n на сервере¶
Предпосылки и предварительные требования¶
- Сервер на Ubuntu 22.04 (Jammy Jellyfish) с правами суперпользователя.
- Открытые порты 80 и 443 для внешнего доступа.
- Доступ к имени домена, которое будет использоваться в переменной
final_domain. - Установлен Docker CE v28.5.2 (поставляемый в конфигурации) и Docker Compose.
Структура файлов и каталогов¶
/data # каталог для хранения данных, созданный при установке
/root/n8n-compose-file/ # место хранения файла docker‑compose
│ └─ compose.yml # основной конфиг для Traefik и n8n
/root/letsencrypt/ # каталог для сертификатов Let's Encrypt
/root/.n8n # папка, в которой n8n хранит базу SQLite и конфиги
/root/local-files # место для файлов, загружаемых через n8n
root:root. Права доступа и безопасность¶
- Каталоги
/data,/root/n8n-compose-file,/root/letsencrypt,/root/.n8nи/root/local-filesимеют режим 0750 (чтение, запись и исполнение только для владельца). - Файл
compose.ymlсоздаётся с правами 0644 (чтение/запись для владельца, только чтение для остальных). - Внутри контейнера n8n выполняется от пользователя
root, но сам сервис доступен наружу только через Traefik, а локальный порт 5678 привязан к127.0.0.1, что ограничивает прямой доступ к приложению.
Базы данных¶
Для хранения рабочих процессов и настроек n8n используется SQLite, который сохраняется в каталоге /root/.n8n. Никаких внешних СУБД не требуется.
Контейнеры Docker и их запуск¶
Traefik¶
- Изображение:
traefik(последняя версия). - Команда: включён провайдер Docker, отключено автоматическое открытие сервисов, заданы два entrypoint:
web(80 п) иwebsecure(443 п). - TLS‑разрешатель:
mytlschallenge– используется автоматический TLS‑challenge Let's Encrypt. - Порты:
80:80и443:443. - Волюмы:
/root/letsencrypt:/letsencrypt– место хранения файлов сертификатов./var/run/docker.sock:/var/run/docker.sock:ro– доступ к Docker‑демону.
n8n¶
- Изображение:
docker.n8n.io/n8nio/n8n:latest. - Порты:
127.0.0.1:5678:5678– внутренний порт, доступный только локально. - Лейблы (Traefik‑реквизиты):
- Маршрутизатор с правилом
Host(final_domain), при наличииtemp_domainдобавляется второе правило. - Включён TLS, сертификаты берутся от
mytlschallenge. - Перенаправление HTTPS, HTTP‑заголовки безопасности (STS, X‑SSRF, X‑Content‑Type‑Nosniff).
- Переменные окружения:
- Волюмы:
/root/.n8n:/root/.n8n– данные и база./root/local-files:/files– каталог для загружаемых файлов.
Файл docker‑compose¶
version: "3"
services:
traefik:
image: "traefik"
restart: always
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.email=hkadm@hostkey.com"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- /root/letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: always
user: root
ports:
- "127.0.0.1:5678:5678"
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`{{ final_domain }}`){% if temp_domain is defined and (temp_domain | default('') | length > 0) %} || Host(`{{ temp_domain }}`){% endif %}
- traefik.http.routers.n8n.tls=true
- traefik.http.services.n8n.loadbalancer.server.port=5678
- traefik.http.routers.n8n.entrypoints=web,websecure
- traefik.http.routers.n8n.tls.certresolver=mytlschallenge
- traefik.http.middlewares.n8n.headers.SSLRedirect=true
- traefik.http.middlewares.n8n.headers.STSSeconds=315360000
- traefik.http.middlewares.n8n.headers.browserXSSFilter=true
- traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
- traefik.http.middlewares.n8n.headers.forceSTSHeader=true
- traefik.http.middlewares.n8n.headers.SSLHost={{ final_domain }}
- traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.n8n.headers.STSPreload=true
- traefik.http.routers.n8n.middlewares=n8n@docker
environment:
- N8N_HOST={{ final_domain }}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://{{ final_domain }}/
- GENERIC_TIMEZONE=Europe/Amsterdam
volumes:
- /root/.n8n:/root/.n8n
- /root/local-files:/files
Прокси серверы¶
Traefik выступает в роли обратного прокси, автоматически выдавая сертификаты Let’s Encrypt через TLS‑challenge.
- Указанный адрес электронной почты hkadm@hostkey.com используется для регистрации Let’s Encrypt.
- Сертификаты сохраняются в /root/letsencrypt/acme.json.
- Служба доступна по домену final_domain (и, при необходимости, temp_domain).
Настройки прав, запуск, остановка и обновление¶
| Действие | Команда | Описание |
|---|---|---|
| Запуск | docker compose up -d | Запускает оба контейнера в фоне. |
| Остановка | docker compose down | Останавливает и удаляет контейнеры, но сохраняет тома. |
| Перезапуск | docker compose restart | Перезапускает все сервисы без скачивания новых образов. |
| Обновление | docker compose pull && docker compose up -d | Загружает последние версии образов и обновляет контейнеры. |
Перед первым запуском docker compose up -d рекомендуется дождаться окончания процесса в течение 10 секунд (см. паузу в шаблоне).
Порт 5678 открывается только для локального интерфейса, что защищает прямой доступ к приложению.
Все внешние запросы проходят через Traefik, где реализуется HTTPS‑шифрование, перенаправление HTTP → HTTPS и защита заголовками.
Таким образом, после выполнения указанных шагов на клиентской машине будет полностью функционирующий сервис n8n, доступный по HTTPS через заданный домен, с автоматическим управлением сертификатами и безопасным хранением данных.