# 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/tcp` → `funk-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) : ```bash 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) ```bash 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) ```bash 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 : ```yaml 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://.funklab.online/...` (en plus des URLs internes si conservées).