Funk-lab/admin/k8s/public-domain.md
alkatrazz f34956f569 feat(infra): domaine public funklab.online + HTTPS Let's Encrypt (fondation)
- traefik : values.yaml versionné (réplique existant + certResolver ACME
  HTTP-01 + acme.json persistant) — appliqué par helm upgrade (hors ArgoCD).
  Redirect HTTP→HTTPS scopée funklab.online (ne casse pas *.lab.local).
- gateway : DNAT 80/443 → Traefik + rate-limit
- dnsmasq : split-horizon *.funklab.online → Traefik (var public_domain)
- doc : admin/k8s/public-domain.md (archi, OVH/Freebox, helm, ajout d'app)

Appliqué et vérifié : helm upgrade OK (services *.lab.local intacts),
resolver ACME chargé, DNAT/dnsmasq en place. En attente DNS OVH + Freebox
pour l'émission des certificats.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 13:17:02 +02:00

4.1 KiB

Domaine public + HTTPS — funklab.online

Exposition des applications du cluster sur Internet via un domaine public (funklab.online, OVH) avec routage par sous-domaine et TLS Let's Encrypt. Une seule redirection Freebox (80+443) pour toutes les apps.

Architecture

Internet ─▶ grafana.funklab.online ─┐  DNS OVH : *.funklab.online → 82.67.223.17
           chat.funklab.online      │
           auth.funklab.online      │
                                    ▼
                          [ Freebox ] 80 + 443 → funk-s01
                                    ▼
                    s01 (DNAT nftables + rate-limit) → Traefik (VIP .200)
                                    ▼
                 Traefik : route par Host + cert Let's Encrypt (HTTP-01) → l'app
  • Split-horizon : dnsmasq résout *.funklab.online → Traefik (192.168.10.200) en interne → le LAN utilise les mêmes URLs sans sortir sur Internet.
  • Ports historiques conservés : le hub reste aussi joignable en kaya.freeboxos.fr:9081/9080 (bascule non destructive).

Prérequis (une fois, côté fournisseurs)

  1. OVH — zone DNS funklab.online : enregistrement A, sous-domaine * (wildcard), cible 82.67.223.17. (Propagation quelques minutes à ~1 h.)
  2. Freebox : redirections 80/tcp et 443/tcpfunk-s01.

Vérifier la résolution : dig +short grafana.funklab.online → doit rendre 82.67.223.17.

Déploiement

1. Traefik — Let's Encrypt (hors ArgoCD, helm)

Config versionnée : k8s/infra/traefik/values.yaml. Toujours pinner la version du chart (sinon helm upgrade tire la dernière → risque de casse de l'ingress cluster) :

helm repo update traefik
helm upgrade traefik traefik/traefik -n infra --version 40.1.0 \
  -f k8s/infra/traefik/values.yaml
kubectl -n infra rollout status deploy/traefik

Rollback immédiat si l'ingress tombe : helm rollback traefik -n infra.

2. Redirection HTTP→HTTPS (scopée funklab.online)

kubectl apply -f k8s/infra/traefik/redirect.yaml

⚠️ Pas de redirection globale : les services internes *.lab.local resteraient cassés (Let's Encrypt ne certifie pas .lab.local).

3. Réseau (Ansible)

ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags gateway,dnsmasq
  • gateway : DNAT 80/443 → Traefik + rate-limit
  • dnsmasq : *.funklab.online → Traefik (variable public_domain)

4. Exposer une app en HTTPS

Ajouter/adapter une IngressRoute sur l'entrypoint websecure avec le certResolver :

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata: { name: grafana-public, namespace: monitoring }
spec:
  entryPoints: [websecure]
  routes:
    - match: Host(`grafana.funklab.online`)
      kind: Rule
      services:
        - name: kube-prometheus-stack-grafana
          port: 80
  tls:
    certResolver: letsencrypt     # ← émission auto du cert à la 1re visite

Le certificat est émis automatiquement au premier accès (challenge HTTP-01 sur le port 80).

Intégration auth par app

App Mode Note
Grafana, Open WebUI, ArgoCD OIDC natif redirect_uri sur l'URL publique *.funklab.online
Prometheus, Alertmanager, n8n, SearXNG Proxy Provider Authentik middleware forward-auth Traefik (app sans login propre)

Détail de l'ajout d'une app au hub : admin/k8s/auth-portal-admin.md.

Pièges

  1. Cert bloqué en « TRAEFIK DEFAULT CERT » : DNS pas encore propagé ou Freebox 80 non redirigé → le challenge HTTP-01 échoue. Vérifier dig + la redirection. Logs : kubectl -n infra logs deploy/traefik | grep -i acme.
  2. Rate-limit Let's Encrypt (5 certs identiques/semaine) : ne pas boucler les redéploiements ; acme.json est persistant (PVC nfs) pour éviter la ré-émission.
  3. helm upgrade sans --version → tire la dernière chart : toujours pinner.
  4. redirect_uri OIDC : chaque provider Authentik doit lister l'URL publique https://<app>.funklab.online/... (en plus des URLs internes si conservées).