Этот гайд закрывает R-recon R15 (LE wildcard vs step-ca). Используем Cloudflare как DNS-провайдер для Let's Encrypt DNS-01 challenge — TLS wildcard *.yourdomain.tld выдаётся бесплатно за 30 секунд, не требует выставлять сервер наружу.
- ✅ Купленный домен (любой публичный TLD:
.dev,.io,.app,.com, и т.д.) - ☐ Cloudflare account (free tier ОК)
- ☐ API token с правильными scopes
- ☐ NS records домена указывают на Cloudflare
- Зайди на https://dash.cloudflare.com → Add a site.
- Введи свой домен (например
agmind.example). - Выбери Free plan (~$0/мес, полностью покрывает наш use case).
- Cloudflare выдаст 2 nameservers (типа
bart.ns.cloudflare.com+lucy.ns.cloudflare.com). - У твоего регистратора домена (Namecheap, Porkbun, REG.RU, Reg.com, etc.) — заменить NS records на эти 2 от Cloudflare. Это самый главный шаг.
- Подожди 5-30 минут (DNS propagation). Cloudflare пришлёт email когда домен активирован.
Важно: Cloudflare должен быть authoritative DNS для всего домена. Иначе LE DNS-01 не сможет создавать TXT-записи.
- Зайди https://dash.cloudflare.com/profile/api-tokens
- Нажми Create Token → выбери шаблон "Edit zone DNS" (или Custom token).
- Настрой permissions:
- Zone →
DNS→Edit
- Zone →
- Zone Resources:
- Include → Specific zone → выбери свой домен.
- (Опционально) Client IP Address Filtering — ограничь по IP твоей home сети.
- (Опционально) TTL — даты валидности (без срока ОК для self-hosted).
- Continue to summary → Create Token.
- Cloudflare покажет токен только один раз — скопируй его (типа
ABCdef123-XYZ...).
# Безопасно: chmod 600, владельца проверь
sudo mkdir -p /var/lib/agmind/secrets
sudo chmod 700 /var/lib/agmind/secrets
echo 'ABCdef123-XYZ...' | sudo tee /var/lib/agmind/secrets/cf_dns_api_token > /dev/null
sudo chmod 600 /var/lib/agmind/secrets/cf_dns_api_tokenCompose файл Traefik (templates/services/traefik.yaml) уже мунтит:
- /var/lib/agmind/traefik/letsencrypt:/letsencrypt
env:
CF_DNS_API_TOKEN_FILE: /run/secrets/cf_dns_api_tokenToken читается через secret mount при старте Traefik.
В Phase H'.C я заполнил routing.host плейсхолдером agmind.dev для 8 сервисов. Заменить на твой домен — одна команда:
cd ~/AGmind64
# YOUR_DOMAIN — замени на свой (без https://, без trailing slash)
YOUR_DOMAIN='agmind.example'
# Sed-replace во всех service descriptors
find templates/services -name '*.yaml' -exec sed -i "s/agmind\.dev/${YOUR_DOMAIN}/g" {} \;
# Также в Traefik service (acme email)
sed -i "s/ops@agmind\.dev/ops@${YOUR_DOMAIN}/" templates/services/traefik.yaml
# Verify
grep -r "Host\(" templates/services/ | head -5После — регенерируй compose:
.venv/bin/agmind render compose --profile core,security --output /tmp/check.yml
grep "Host(" /tmp/check.yml | head -5
# Должно быть: Host(`llama.agmind.example`), Host(`grafana.agmind.example`), и т.д.После старта Traefik (Ansible deploy) — проверь acme.json:
sudo cat /var/lib/agmind/traefik/letsencrypt/acme.json | jq '.le.Certificates[].domain'Должен показать { main: "*.agmind.example" } через ~60 секунд после первого запроса.
Cloudflare authoritative ≠ публично доступен. Чтобы grafana.agmind.example резолвилось только в твоей LAN:
Добавь wildcard rewrite:
*.agmind.example → 192.168.1.X # IP твоего Strix Halo
Внешние резолверы (Google 8.8.8.8) увидят CF-managed NXDOMAIN или CF placeholder. Только в LAN через локальный DNS → твой Strix Halo.
192.168.1.X agmind.example
192.168.1.X llama.agmind.example grafana.agmind.example chat.agmind.example dify.agmind.example portainer.agmind.example
Минусы: ручная синхронизация на каждом устройстве.
Рекомендую A — AdGuard Home (UI-driven) + один wildcard rule.
- Домен зарегистрирован
- Cloudflare account + домен added
- NS records у регистратора → CF nameservers
- Подождал 5-30 мин, CF email "domain active"
- API token создан с Zone:DNS:Edit permissions
- Token →
/var/lib/agmind/secrets/cf_dns_api_token(chmod 600) -
agmind.devplaceholder заменён на твой домен в descriptors - Local DNS (AdGuard Home / dnsmasq) wildcard
*.yourdomain → <strix-halo-IP> -
agmind render composeдал валидный compose (visual check) - (После deploy)
traefik/letsencrypt/acme.jsonсодержит wildcard cert
Альтернатива: self-hosted CA через Smallstep step-ca.
Минусы (см. наш discussion в чате):
- Нужно установить root certificate на КАЖДОЕ устройство которое заходит на UI (ноут, телефон, ноут клиента, гостевой ноут)
- Разные процедуры на Linux/Mac/Windows/iOS/Android
- При смене root certificate — повторная установка везде
Гайд по step-ca см. https://smallstep.com/docs/step-ca/getting-started/. Это второй приоритет — если домен есть, используем CF, это проще.