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 — напишите, добавим.