Funk-lab/admin/k8s/public-domain.md
alkatrazz 8b31f9cd27 docs: hub SSO complet sur le domaine public funklab.online (HTTPS)
Met à jour toute la doc pour l'état final du 2026-07-07 :
- CLAUDE.md : état actuel (hub SSO + domaine/TLS), rôle Traefik versionné,
  secrets OIDC au vault, date
- README : section « Accès & authentification » réécrite (5 apps sur le
  domaine, chaîne DNS/Freebox/Traefik, lab-admins), roadmap, vault
- public-domain.md : tableau des apps déployées (URL, auth, redirect_uri)
  + modes d'intégration (OIDC / Proxy Provider / route seule)
- auth-portal.md : section « Accès externe » → domaine HTTPS (URLs à jour)
- auth-portal-admin.md : URL admin + pièges (slug/discovery 404 ArgoCD)
- guide utilisateur + index admin/ : URLs funklab.online

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

131 lines
5.9 KiB
Markdown

# 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).
## Apps exposées (état 2026-07-07)
Toutes en HTTPS (cert Let's Encrypt par sous-domaine), accessibles depuis le hub
Authentik (`https://auth.funklab.online`) et directement par leur URL.
| App | URL publique | Auth | Redirect URI OIDC (Authentik) |
|---|---|---|---|
| **Portail consoles** (Guacamole) | `portail.funklab.online` | SSO OIDC | `https://portail.funklab.online/` |
| **Grafana** | `grafana.funklab.online` | SSO OIDC (lab-admins→Admin, sinon Viewer) | `https://grafana.funklab.online/login/generic_oauth` |
| **Open WebUI** | `openwebui.funklab.online` | SSO OIDC | `https://openwebui.funklab.online/oauth/oidc/callback` |
| **Argo CD** | `argocd.funklab.online` | SSO OIDC (lab-admins→admin) | `https://argocd.funklab.online/auth/callback` |
| **n8n** | `n8n.funklab.online` | **login natif** (SSO = Enterprise, indispo en communautaire) | — |
- Chaque app OIDC : provider Authentik **Confidential**, client secret archivé au vault
(`vault_<app>_oauth_client_secret` / `vault_argocd_oidc_client_secret`) et dans un
secret k8s. `token_url`/discovery joignent Authentik **server-side via hairpin**
(vérifié : un pod atteint `auth.funklab.online`).
- **Non exposés** (volontaire) : Prometheus, Alertmanager, SearXNG — pas de login propre,
nécessiteraient un **Proxy Provider** (forward-auth) avant toute exposition Internet.
Manifests : `k8s/apps/*/ingress-public.yaml`, `k8s/infra/monitoring/ingressroute-public.yaml`,
`k8s/argocd-bootstrap/ingressroute-public.yaml`. Config OIDC : Grafana/ArgoCD dans leurs
`values.yaml` helm, Guacamole/Open WebUI dans leur `deployment.yaml`.
## Intégration auth — comment ajouter une app
| Type d'app | Mode | Étapes |
|---|---|---|
| App avec OIDC natif (Grafana, Open WebUI, ArgoCD…) | **OIDC** | provider Confidential + app (slug) dans Authentik, config OIDC côté app avec l'URL publique, IngressRoute websecure |
| App sans login (Prometheus…) | **Proxy Provider** | outpost Authentik + middleware forward-auth Traefik (non déployé à ce jour) |
| App avec login propre non-OIDC (n8n…) | **route seule** | IngressRoute websecure + tuile-lien Authentik (comptes gérés dans l'app) |
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).