Traefik • Dev Guide

Как «посадить» (deploy) нового бота за Traefik

0) Что уже есть на VM

  • Traefik слушает :80 и :443, автоматически выпускает сертификаты Let’s Encrypt.
  • Внутренняя docker-сеть web (reverse-proxy сеть).
  • Домены формата:
    • Бот: https://<IP>.nip.io
    • Админка: https://admin.<IP>.nip.io

Вам не нужно настраивать TLS, сертификаты, DNS или firewall. Ваша зона ответственности — лейблы в docker-compose и корректный порт/health приложения.


1) Как Traefik использует лейблы

Traefik читает лейблы контейнеров и строит цепочку:

router → service → container:port

Минимальный набор лейблов:

  • traefik.enable=true — включить проксирование для контейнера.
  • traefik.http.routers.<имя>.rule=Host(`FQDN`) — к какому хосту привязать.
  • traefik.http.routers.<имя>.entrypoints=websecure — использовать порт 443.
  • traefik.http.routers.<имя>.tls.certresolver=le-http01 — брать/обновлять сертификат через Let’s Encrypt.
  • traefik.http.services.<имя>.loadbalancer.server.port=<порт_внутри_контейнера> — внутренний порт приложения.

<имя> — произвольное, но лучше уникальное для сервиса (например bot1 или bot1-admin).

Важно: этот порт — это не host-port и не ports: "8080:8080". Это внутренний порт, на котором слушает ваш процесс внутри контейнера.


2) Предпосылки

  • Бот в Docker (образ приложения или свой Dockerfile).
  • Traefik уже подключён к сети web.
  • nip.io обеспечивает динамическое DNS по IP VM.

3) Структура на VM

/opt/stack/bots/
  ├─ <botname>/
  │  ├─ .env
  │  └─ docker-compose.yml
  └─ test/   ← примеры

4) Минимальный .env для нового бота

PUBLIC_IP=64.177.66.246
APP_HOST=<botname>.${PUBLIC_IP}.nip.io
TRAEFIK_NET=web
LE_RESOLVER=le-http01

5) Пример docker-compose.yml (app + admin)

version: "3.9"
services:
  app:
    image: yourorg/yourbot:latest
    restart: unless-stopped
    networks: [web]
    labels:
      - traefik.enable=true
      - traefik.http.routers.<bot>-app.entrypoints=websecure
      - traefik.http.routers.<bot>-app.rule=Host(`${APP_HOST}`)
      - traefik.http.routers.<bot>-app.tls.certresolver=${LE_RESOLVER}
      - traefik.http.routers.<bot>-app.service=<bot>-app-svc
      - traefik.http.services.<bot>-app-svc.loadbalancer.server.port=8080

  admin:
    image: yourorg/yourbot-admin:latest
    restart: unless-stopped
    networks: [web]
    labels:
      - traefik.enable=true
      - traefik.http.routers.<bot>-admin.entrypoints=websecure
      - traefik.http.routers.<bot>-admin.rule=Host(`admin.${APP_HOST}`)
      - traefik.http.routers.<bot>-admin.tls.certresolver=${LE_RESOLVER}
      - traefik.http.routers.<bot>-admin.service=<bot>-admin-svc
      - traefik.http.services.<bot>-admin-svc.loadbalancer.server.port=8080

networks:
  web:
    external: true
    name: ${TRAEFIK_NET}

6) Деплой

cd /opt/stack/bots/<botname>
docker compose up -d

7) Тестирование

  • Откройте: https://<botname>.64.177.66.246.nip.io
  • Проверьте сертификат (Let’s Encrypt) и ответ приложения
  • Быстрая диагностика: /whoami

8) Типовые фишки Traefik

  • StripPrefix для /admin: traefik.http.middlewares.X.stripprefix.prefixes=/admin
  • BasicAuth: traefik.http.middlewares.X.basicauth.users=user:$$apr1$$...
  • RateLimit для вебхуков: traefik.http.middlewares.X.ratelimit.average=10

Нужен шаблон под FastAPI/Node/Django/Go — напишите, добавим.