Skip to content

Instantly share code, notes, and snippets.

@sashaaro
Last active August 28, 2025 21:20
Show Gist options
  • Select an option

  • Save sashaaro/2648264b1688526f1a98fa833b319703 to your computer and use it in GitHub Desktop.

Select an option

Save sashaaro/2648264b1688526f1a98fa833b319703 to your computer and use it in GitHub Desktop.

N8N + Traefik + Gluetun (VPN)

Этот docker-compose поднимает три сервиса:

🔹 Traefik

  • Обратный прокси и балансировщик.
  • Автоматически получает HTTPS-сертификаты через Let's Encrypt (TLS challenge).
  • Пробрасывает порты 80/443 наружу.
  • Управляет доступом к n8n по доменному имени ${SUBDOMAIN}.${DOMAIN_NAME}.

🔹 Gluetun (VPN-клиент)

  • Подключается к VPN-провайдеру (OpenVPN).
  • Обеспечивает, что весь трафик n8n идёт через VPN-туннель.
  • Пробрасывает порт 5678 наружу для доступа к n8n.
  • Метки Traefik навешаны на Gluetun, так как n8n использует его сетевой стек.

🔹 n8n (Automation tool)

  • Сам сервис n8n, работающий в production-режиме.
  • Сохраняет данные в volume n8n_data.
  • Использует network_mode: "service:gluetun", чтобы весь трафик шёл через VPN.
  • Доступен по HTTPS через Traefik на ${SUBDOMAIN}.${DOMAIN_NAME}.

🚀 Как использовать

  1. Положи VPN-конфиг в папку ./vpn/config.ovpn и укажи учётные данные.
  2. Создай файл .env с переменными:
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
[email protected]
GENERIC_TIMEZONE=Europe/Moscow
  1. Запусти:
docker compose up -d
  1. Зайди на https://n8n.example.com — сервис будет доступен через VPN-туннель с автоматическим SSL.
services:
traefik:
image: "traefik"
restart: always
command:
- "--api.insecure=true"
- "--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=${SSL_EMAIL}"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: docker.n8n.io/n8nio/n8n
network_mode: "service:gluetun"
depends_on:
- gluetun
environment:
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_RUNNERS_ENABLED=true
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
devices:
- /dev/net/tun
cap_add:
- NET_ADMIN
volumes:
- ./vpn:/vpn
ports:
- 5678:5678
environment:
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=openvpn
- OPENVPN_CUSTOM_CONFIG=/vpn/config.ovpn
- PORTS=5678
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
- traefik.http.routers.n8n.tls=true
- 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=${DOMAIN_NAME}
- traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.n8n.headers.STSPreload=true
- traefik.http.routers.n8n.middlewares=n8n@docker
volumes:
n8n_data:
traefik_data:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment