Разбираю кейс с self‑hosted n8n за Traefik, где внезапно перестал работать Telegram Trigger, хотя ещё вчера всё было ок.
Симптомы
-
n8n крутится на VPS (Ubuntu 22.04) в Docker.
-
Перед ним стоит Traefik, который слушает 80/443 и отдаёт HTTPS.
-
При запуске workflow с Telegram Trigger в n8n ошибка:
Bad Request: bad webhook: Failed to resolve host: Temporary failure in name resolution
-
При прямом запросе к Telegram API:
https://api.telegram.org/bot<ТОКЕН>/setWebhook?url=https://СТАРЫЙ_ДОМЕН_ХОСТЕРА/
получаю тот же ответ: Telegram не может зарезолвить этот домен. То есть проблема не в n8n, а в DNS со стороны Telegram для конкретного служебного домена.
Что оказалось под капотом
Команда:
docker ps
показала:
... n8nio/n8n:latest 127.0.0.1:5678->5678/tcp ... traefik 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
В каталоге с конфигом нашёл compose‑файл:
bash cd ~/n8n-compose-file cat compose.yml
Ключевые куски выглядели так:
services: traefik: image: "traefik" 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=admin@example.com" - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" n8n: image: docker.n8n.io/n8nio/n8n:latest ports: - "127.0.0.1:5678:5678" labels: - traefik.enable=true - traefik.http.routers.n8n.rule=Host(`СТАРЫЙ_ДОМЕН_ХОСТЕРА`) - 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.SSLHost=СТАРЫЙ_ДОМЕН_ХОСТЕРА environment: - N8N_HOST=СТАРЫЙ_ДОМЕН_ХОСТЕРА - N8N_PORT=5678 - N8N_PROTOCOL=https - WEBHOOK_URL= https://СТАРЫЙ_ДОМЕН_ХОСТЕРА/
Вывод:
-
Traefik уже умеет выдавать HTTPS (Let’s Encrypt через tls‑challenge).
-
Везде жёстко прописан служебный домен хостинга.
-
Telegram именно этот домен не может резолвить — отсюда
Failed to resolve host.
Попытка повесить ещё один nginx+certbot сверху привела к ошибке:
bind() to 0.0.0.0:80 failed (98: Address already in use)
Потому что порт 80 занят Traefik.
Решение: свой домен + правка Traefik и n8n
1. Свой поддомен на DNS
На своём домене (пример: mydomain.pro) в панели DNS добавил:
-
тип: A
-
имя:
n8n -
значение: IP сервера
XXX.XXX.XXX.XXX
Через несколько минут n8n.mydomain.pro начал резолвиться на VPS.
2. Настроил Traefik и n8n на новый домен
В compose.yml в сервисе n8n заменил все вхождения старого домена на новый n8n.mydomain.pro:
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(`n8n.mydomain.pro`) - 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=n8n.mydomain.pro - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true - traefik.http.middlewares.n8n.headers.STSPreload=true - traefik.http.routers.n8n.middlewares=n8n@docker environment: - N8N_HOST=n8n.mydomain.pro - N8N_PORT=5678 - N8N_PROTOCOL=https - NODE_ENV=production - WEBHOOK_URL= https://n8n.mydomain.pro/ - GENERIC_TIMEZONE=Europe/Amsterdam
Важно:
-
В файле не должно остаться старого домена.
-
Traefik через
rule=Host(...)иSSLHost=...начинает обслуживать новый домен. -
n8n сам считает, что его публичный URL —
https://n8n.mydomain.pro/, и генерирует вебхуки от него.
После правки:
docker compose down docker compose up -d
Traefik и n8n поднялись заново, Traefik автоматически получил сертификат Let’s Encrypt для нового домена.
3. Проверка HTTPS и обновление вебхука Telegram
Дальше:
-
В браузере проверил:
https://n8n.mydomain.pro
— открывается интерфейс n8n по HTTPS, сертификат валидный.
-
Обновил webhook бота (токен не светим):
https://api.telegram.org/bot<ТОКЕН>/deleteWebhook https://api.telegram.org/bot<ТОКЕН>/setWebhook?url= https://n8n.mydomain.pro/
Ответ на setWebhook:
{"ok":true,"result":true,"description":"Webhook was set"}
-
В n8n по новому домену активировал Telegram Trigger — после этого сообщения боту начали прилетать в workflow без каких‑либо
Failed to resolve host.
Краткая инструкция, если у вас похожая проблема
-
Проверить, что n8n стоит за Traefik в Docker:
docker ps
-
Добавить свой домен/поддомен и направить его A‑записью на IP сервера.
-
Найти compose‑файл с Traefik+n8n (что‑то вроде
n8n-compose-file/compose.yml). -
В сервисе
n8nзаменить старый домен на свой во всех местах:
-
traefik.http.routers.n8n.rule=Host(\ВАШ_ДОМЕН`)` -
traefik.http.middlewares.n8n.headers.SSLHost=ВАШ_ДОМЕН -
N8N_HOST=ВАШ_ДОМЕН -
WEBHOOK_URL= https://ВАШ_ДОМЕН/
-
Перезапустить стек:
docker compose down docker compose up -d
-
Убедиться, что
https://ВАШ_ДОМЕНоткрывает n8n по HTTPS. -
Обновить webhook Telegram:
https://api.telegram.org/bot<ТОКЕН>/deleteWebhook https://api.telegram.org/bot<ТОКЕН>/setWebhook?url= https://ВАШ_ДОМЕН/
-
Активировать Telegram Trigger в n8n и проверить сообщения.
