sm2c-cloud-traefiksystem-traefik-bootstrap.yml/mnt/swarm/traefik_data — traefik.yml, acme.json, custom/net_forgain, net_portainer_agenttraefik:v3.6.1 (первый release с auto-negotiation Docker API — PR #12256; на v3.5 hardcoded API 1.24, что ломалось на Docker Engine 29+ с min-api 1.40)letsEncrypt (HTTP-01 challenge на 80/tcp) — для публично резолвящихся *.4gain.pro.letsEncryptDNS (DNS-01 через DigitalOcean провайдера) — для имён, не доступных по 80/tcp снаружи (*.vpn.4gain.pro, internal-only *.e1.4gain.pro). Storage: acme-dns.json. Token: DO_AUTH_TOKEN env (из digital_ocean_apikey group_vars).default TLS store в /custom/_vpn-wildcard-tls.yml имеет defaultGeneratedCert для vpn.4gain.pro + SAN *.vpn.4gain.pro через letsEncryptDNS resolver. Все маршруты VPN-only с tls: true (без явного certResolver) автоматически берут wildcard.entryPoints.http.http.redirections — устраняет 404 на http://* для маршрутов с tls: (которые слушают только на https-entrypoint). ACME HTTP-01 challenge traefik обрабатывает internal-handler'ом в обход редиректа автоматически.traefik.enable=true, .rule=Host(...))./mnt/swarm/traefik_data/custom/<name>.yml для compose-стеков и host-сервисов (zabbix, netbox, gitlab, mail, llama-swap, ...).*.4gain.pro A-записей).services.<x>.labels (контейнер), не deploy.labels — рабочая, но не каноническая для swarm-mode схема. Traefik docker-provider читает их через docker.sock.traefik.yml (static config) docker stack deploy --prune НЕ перезапускает контейнер если spec не поменялся. Нужен docker service update --force traefik_traefik чтобы перечитать static config.# Re-deploy
cd ansible/playbooks
ansible-playbook -c ssh system-traefik-bootstrap.yml
# Проверить custom file-provider:
ssh -p 21150 root@firefly.e1.4gain.pro 'ls /mnt/swarm/traefik_data/custom/'
Changelog
letsEncryptDNS (DigitalOcean DNS-01) + wildcard *.vpn.4gain.pro через default TLS store + глобальный HTTP→HTTPS редирект (claude/forGain)