docs: hub SSO complet sur le domaine public funklab.online (HTTPS) (#94)

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>
This commit is contained in:
ALI YESILKAYA 2026-07-07 17:53:22 +02:00 committed by GitHub
parent 502403d0f9
commit a13b5a70cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 92 additions and 55 deletions

View file

@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
**Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. **Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD.
**État actuel (2026-06-23)** : **État actuel (2026-07-07)** :
- ✅ Hermes Agent opérationnel — multi-profils (funk-ai/system/monitor/brain) - ✅ Hermes Agent opérationnel — multi-profils (funk-ai/system/monitor/brain)
- ✅ Qdrant réparé (2026-06-17) — fin du crash-loop (segment `funk-docs` corrompu, voir `admin/incidents.md`). La collection RAG `funk-docs` a depuis été **reconstruite** (436 chunks, 🟢 green, embeddings nomic-embed-text dim 768) — `rag-query` opérationnel - ✅ Qdrant réparé (2026-06-17) — fin du crash-loop (segment `funk-docs` corrompu, voir `admin/incidents.md`). La collection RAG `funk-docs` a depuis été **reconstruite** (436 chunks, 🟢 green, embeddings nomic-embed-text dim 768) — `rag-query` opérationnel
- ✅ Monitoring complet — Prometheus + Grafana + AlertManager → webhook Hermes + n8n - ✅ Monitoring complet — Prometheus + Grafana + AlertManager → webhook Hermes + n8n
@ -21,8 +21,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- ✅ SearXNG opérationnel — `searxng.lab.local`, namespace `ai`, **méta-moteur de recherche web self-host** (privé, in-cluster) consommé par l'outil `web_search` d'Asa (API JSON). Manifests `k8s/apps/searxng/` - ✅ SearXNG opérationnel — `searxng.lab.local`, namespace `ai`, **méta-moteur de recherche web self-host** (privé, in-cluster) consommé par l'outil `web_search` d'Asa (API JSON). Manifests `k8s/apps/searxng/`
- ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster) - ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster)
- ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work` - ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work`
- 🆕 Annuaire + portail consoles (2026-07-06) — **Authentik** (`auth.lab.local`, IdP OIDC) + **Guacamole** (`portail.lab.local`, consoles SSH web vers s01/g01 via user `console` sans sudo), namespace `auth`. Config initiale (admin Authentik, provider OIDC, connexions) : voir `admin/k8s/auth-portal.md`. **Accès Internet** : Authentik = hub utilisateur (`kaya.freeboxos.fr:9081`, page « My applications ») → SSO vers Guacamole (`:9080`) — VIPs MetalLB `.201`/`.202`, rate-limit nftables, URL canonique publique pour tous (hairpin LAN). Admin quotidienne : `admin/k8s/auth-portal-admin.md` ; guide utilisateur : `docs/portail-guide-utilisateur.md` - **Hub SSO Authentik + domaine public `funklab.online` (HTTPS)** (2026-07-07) — **Authentik** (`auth.funklab.online`, IdP OIDC, ns `auth`) est le hub : page « My applications » → tuiles → **SSO**. Apps exposées en HTTPS (cert Let's Encrypt par sous-domaine, `*.funklab.online`) : **Guacamole** (`portail.`, consoles SSH s01/g01 via user `console` sans sudo), **Grafana** (`grafana.`, lab-admins→Admin), **Open WebUI** (`openwebui.`), **Argo CD** (`argocd.`, lab-admins→admin) — tous OIDC ; **n8n** (`n8n.`, login natif). Groupe transverse **`lab-admins`** = admin partout. Chaîne : DNS OVH `*.funklab.online → 82.67.223.17` → Freebox `80/443` → s01 (DNAT nftables + rate-limit) → **Traefik** (Let's Encrypt HTTP-01, helm hors ArgoCD) ; dnsmasq split-horizon interne. Les ports historiques `kaya.freeboxos.fr:9080/9081` restent un chemin réseau. Docs : `admin/k8s/public-domain.md` (domaine/TLS), `admin/k8s/auth-portal.md` (archi/pièges), `admin/k8s/auth-portal-admin.md` (admin : users, apps, `lab-admins`), `docs/portail-guide-utilisateur.md` (guide users)
- 🆕 WireGuard (2026-07-06) — serveur VPN prêt sur s01 (pairs `full`/`portal`, filtrage nftables) mais **dormant** : pas de redirection Freebox `51820/udp` (choix simplicité 2026-07-07, accès portail via `:9080` direct). Voir `admin/infra/wireguard.md` - 🆕 WireGuard (2026-07-06) — serveur VPN prêt sur s01 (pairs `full`/`portal`, filtrage nftables) mais **dormant** : pas de redirection Freebox `51820/udp` (l'accès distant passe par le domaine public HTTPS). Voir `admin/infra/wireguard.md`
- ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis - ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis
Journal de progression : `PROGRESS.md``progress/YYYY-MM-DD.md` Journal de progression : `PROGRESS.md``progress/YYYY-MM-DD.md`
@ -126,6 +126,7 @@ Variables chiffrées dans `ansible/group_vars/all/vault.yml` :
- `vault_console_ssh_private_key` — clé privée SSH des connexions Guacamole (user `console` sur s01/g01) - `vault_console_ssh_private_key` — clé privée SSH des connexions Guacamole (user `console` sur s01/g01)
- `vault_authentik_secret_key`, `vault_authentik_redis_password` — copies de sûreté des valeurs du secret k8s `auth/authentik-secret` - `vault_authentik_secret_key`, `vault_authentik_redis_password` — copies de sûreté des valeurs du secret k8s `auth/authentik-secret`
- `vault_wireguard_server_private_key`, `vault_wireguard_peer_private_keys` — clés WireGuard (serveur + dict par pair) - `vault_wireguard_server_private_key`, `vault_wireguard_peer_private_keys` — clés WireGuard (serveur + dict par pair)
- `vault_grafana_oauth_client_secret`, `vault_openwebui_oauth_client_secret`, `vault_argocd_oidc_client_secret` — secrets clients OIDC des apps du hub (= secrets k8s `monitoring/grafana-oauth-secret`, `ai/open-webui-oauth`, `argocd/argocd-oidc`)
--- ---
@ -186,10 +187,13 @@ k8s/
│ ├── guacamole/ # namespace: auth — portail consoles SSH web s01/g01 (portail.lab.local) │ ├── guacamole/ # namespace: auth — portail consoles SSH web s01/g01 (portail.lab.local)
│ └── {external-services}/ # ExternalName/Endpoints pointant vers storage-01 ou gpu-01 │ └── {external-services}/ # ExternalName/Endpoints pointant vers storage-01 ou gpu-01
└── infra/ # Helm releases (HelmRelease + values.yaml) └── infra/ # Helm releases (HelmRelease + values.yaml)
├── monitoring/ # kube-prometheus-stack 85.0.2 ├── monitoring/ # kube-prometheus-stack 85.0.2 (+ ingressroute-public.yaml grafana)
├── traefik/ # values.yaml (Let's Encrypt) + redirect.yaml — appliqué par helm upgrade
└── nfs-provisioner/ └── nfs-provisioner/
# ⚠️ Traefik + MetalLB ne sont PAS dans k8s/infra/ : ils sont installés via `helm install` # ⚠️ Traefik + MetalLB ne sont PAS gérés par ArgoCD : installés via `helm install/upgrade`
# lors du bootstrap Talos (voir admin/k8s/talos.md), hors pattern App-of-Apps ArgoCD. # (Traefik : values versionnées dans k8s/infra/traefik/, cert Let's Encrypt HTTP-01 ;
# MetalLB : bootstrap Talos). Idem ArgoCD lui-même (k8s/argocd-bootstrap/values.yaml).
# Voir admin/k8s/talos.md et admin/k8s/public-domain.md.
``` ```
### Ajouter un nouveau workload k8s ### Ajouter un nouveau workload k8s

View file

@ -133,25 +133,32 @@ calling) pour répondre à partir de données réelles.
L'identité est centralisée dans **Authentik** (IdP OIDC, namespace k8s `auth`) : chaque L'identité est centralisée dans **Authentik** (IdP OIDC, namespace k8s `auth`) : chaque
personne a **un seul compte**, et sa page « **My applications** » sert de portail — une personne a **un seul compte**, et sa page « **My applications** » sert de portail — une
tuile par application autorisée, SSO automatique au clic. tuile par application autorisée, **SSO** automatique au clic. Tout est exposé sur le
domaine public **`funklab.online`** en **HTTPS** (certificats Let's Encrypt).
``` ```
Utilisateur ──▶ Authentik (hub + login unique) ──SSO──▶ Guacamole ──SSH──▶ s01 / g01 Utilisateur ──▶ auth.funklab.online (hub + login unique) ──SSO──▶ app.funklab.online
(LAN ou Internet) (console dans le navigateur) (LAN ou Internet) (Guacamole, Grafana…)
``` ```
| Service | LAN | Internet | | Application | URL publique (HTTPS) | Auth |
|---|---|---| |---|---|---|
| **Authentik** — hub + annuaire | `http://auth.lab.local` | `http://kaya.freeboxos.fr:9081` | | **Authentik** — hub + annuaire | `auth.funklab.online` | — |
| **Guacamole** — consoles SSH web | via la tuile du hub | `http://kaya.freeboxos.fr:9080` (via la tuile) | | **Guacamole** — consoles SSH s01/g01 | `portail.funklab.online` | SSO |
| **Grafana** — dashboards | `grafana.funklab.online` | SSO (`lab-admins`→Admin, sinon Viewer) |
| **Open WebUI** — chat IA | `openwebui.funklab.online` | SSO |
| **Argo CD** — GitOps | `argocd.funklab.online` | SSO (`lab-admins`) |
| **n8n** — automatisation | `n8n.funklab.online` | login natif |
- **Chaîne réseau** : DNS OVH `*.funklab.online → 82.67.223.17` → Freebox `80/443` → s01
(DNAT nftables + rate-limit) → **Traefik** (Let's Encrypt HTTP-01) → l'app. En interne,
dnsmasq résout `*.funklab.online → Traefik` (mêmes URLs sur le LAN, split-horizon).
- **Groupe `lab-admins`** : admin dans toutes les apps ; les autres comptes = accès simple.
- **Accès aux machines** : Guacamole ouvre un terminal SSH **dans le navigateur** vers - **Accès aux machines** : Guacamole ouvre un terminal SSH **dans le navigateur** vers
storage-01 / gpu-01, sous l'utilisateur **`console`** (sans sudo, clé dédiée — rôle storage-01 / gpu-01, sous l'utilisateur **`console`** (sans sudo, clé dédiée — rôle
Ansible `console_user`). Les accès sont assignés par utilisateur et journalisés. Ansible `console_user`). Accès assignés par utilisateur et journalisés.
- **Exposition Internet** : redirections Freebox `9081`/`9080` → s01 → DNAT nftables - **Alternative VPN** : un serveur **WireGuard** est prêt sur s01 (profils admin/invité)
(rate-limité) → VIPs MetalLB dédiées. Authentification obligatoire dès la porte. mais **dormant** — l'accès distant passe par le domaine public.
- **Alternative VPN** : un serveur **WireGuard** est prêt sur s01 (profils admin/invité,
filtrage nftables par pair) mais **dormant** — aucune redirection Freebox active.
### En images ### En images
@ -163,6 +170,7 @@ Le parcours utilisateur, du login à la console :
| Login unique. | Une tuile par app autorisée → clic = SSO. | Clic sur une machine → terminal SSH dans le navigateur. | | Login unique. | Une tuile par app autorisée → clic = SSO. | Clic sur une machine → terminal SSH dans le navigateur. |
📖 [Architecture & pièges](admin/k8s/auth-portal.md) · 📖 [Architecture & pièges](admin/k8s/auth-portal.md) ·
🌐 [Domaine public + HTTPS](admin/k8s/public-domain.md) ·
🛠️ [Administration (utilisateurs, apps du hub)](admin/k8s/auth-portal-admin.md) · 🛠️ [Administration (utilisateurs, apps du hub)](admin/k8s/auth-portal-admin.md) ·
👤 [Guide utilisateur à distribuer](docs/portail-guide-utilisateur.md) · 👤 [Guide utilisateur à distribuer](docs/portail-guide-utilisateur.md) ·
🔐 [WireGuard](admin/infra/wireguard.md) 🔐 [WireGuard](admin/infra/wireguard.md)
@ -301,7 +309,7 @@ ansible-vault encrypt ansible/group_vars/all/vault.yml
ansible-vault edit ansible/group_vars/all/vault.yml ansible-vault edit ansible/group_vars/all/vault.yml
``` ```
Variables stockées dans le vault : clé API Anthropic, mots de passe PostgreSQL (hermes, litellm, n8n, openwebui, ghostfolio, authentik, guacamole), App Password Gmail, clé API n8n, jeton hermes-exec, clé SSH du user `console`, secrets Authentik (copies des secrets k8s) et clés WireGuard. Liste exhaustive : `CLAUDE.md` § Secrets Ansible Vault. Variables stockées dans le vault : clé API Anthropic, mots de passe PostgreSQL (hermes, litellm, n8n, openwebui, ghostfolio, authentik, guacamole), App Password Gmail, clé API n8n, jeton hermes-exec, clé SSH du user `console`, secrets Authentik (copies des secrets k8s), **secrets clients OIDC des apps du hub** (grafana, openwebui, argocd) et clés WireGuard. Liste exhaustive : `CLAUDE.md` § Secrets Ansible Vault.
--- ---
@ -338,8 +346,10 @@ Elle est gérée automatiquement par le rôle Ansible `llama_server`.
- [x] Réparer Qdrant — crash-loop résolu 2026-06-17 ; collection `funk-docs` **reconstruite** depuis (436 chunks) - [x] Réparer Qdrant — crash-loop résolu 2026-06-17 ; collection `funk-docs` **reconstruite** depuis (436 chunks)
- [x] Re-ingérer le RAG (`rag-ingest`) **basculé sur l'embedding dédié `:1238`** (dim 768) - [x] Re-ingérer le RAG (`rag-ingest`) **basculé sur l'embedding dédié `:1238`** (dim 768)
- [x] Serveur dédié Satisfactory sur gpu-01 (`kaya.freeboxos.fr:7777`, IPv4 full-stack) - [x] Serveur dédié Satisfactory sur gpu-01 (`kaya.freeboxos.fr:7777`, IPv4 full-stack)
- [x] Annuaire **Authentik** + portail consoles **Guacamole** (SSO, namespace `auth`) — hub utilisateur exposé sur Internet (`:9081`/`:9080`, rate-limité) - [x] Annuaire **Authentik** + portail consoles **Guacamole** (SSO, namespace `auth`)
- [x] VPN WireGuard sur s01 (profils admin/invité) — dormant, prêt à activer - [x] VPN WireGuard sur s01 (profils admin/invité) — dormant, prêt à activer
- [x] **Domaine public `funklab.online` + HTTPS** (Let's Encrypt HTTP-01 sur Traefik, DNS OVH wildcard, Freebox 80/443)
- [x] **Hub SSO complet** : Grafana, Open WebUI, Argo CD en OIDC + n8n (login natif) sur `*.funklab.online` ; groupe `lab-admins` = admin partout
- [ ] WOL compute nodes (configuration BIOS) - [ ] WOL compute nodes (configuration BIOS)
- [ ] Route statique Freebox - [ ] MFA/TOTP Authentik (durcissement)
- [ ] TLS sur l'exposition Internet (vrai domaine + Let's Encrypt) / MFA Authentik - [ ] Proxy Provider Authentik pour exposer les apps sans login (Prometheus, Alertmanager, SearXNG)

View file

@ -15,6 +15,7 @@
| Problème NFS / stockage | [infra/nfs.md](infra/nfs.md) | | Problème NFS / stockage | [infra/nfs.md](infra/nfs.md) |
| Gérer les utilisateurs du portail (créer/révoquer/assigner) | [k8s/auth-portal-admin.md](k8s/auth-portal-admin.md) | | Gérer les utilisateurs du portail (créer/révoquer/assigner) | [k8s/auth-portal-admin.md](k8s/auth-portal-admin.md) |
| Portail consoles / SSO — architecture & pièges | [k8s/auth-portal.md](k8s/auth-portal.md) | | Portail consoles / SSO — architecture & pièges | [k8s/auth-portal.md](k8s/auth-portal.md) |
| Domaine public `funklab.online` + HTTPS (Traefik/Let's Encrypt) | [k8s/public-domain.md](k8s/public-domain.md) |
| Accès distant VPN (WireGuard, dormant) | [infra/wireguard.md](infra/wireguard.md) | | Accès distant VPN (WireGuard, dormant) | [infra/wireguard.md](infra/wireguard.md) |
| Serveur de jeu Satisfactory | [ops/satisfactory.md](ops/satisfactory.md) | | Serveur de jeu Satisfactory | [ops/satisfactory.md](ops/satisfactory.md) |
| Incident passé | [incidents.md](incidents.md) | | Incident passé | [incidents.md](incidents.md) |
@ -67,6 +68,7 @@
| [k8s/ghostfolio.md](k8s/ghostfolio.md) | Ghostfolio — suivi de portefeuille (PostgreSQL s01 + Redis) | | [k8s/ghostfolio.md](k8s/ghostfolio.md) | Ghostfolio — suivi de portefeuille (PostgreSQL s01 + Redis) |
| [k8s/auth-portal.md](k8s/auth-portal.md) | Authentik + Guacamole — architecture, déploiement, accès Internet, pièges | | [k8s/auth-portal.md](k8s/auth-portal.md) | Authentik + Guacamole — architecture, déploiement, accès Internet, pièges |
| [k8s/auth-portal-admin.md](k8s/auth-portal-admin.md) | Portail — administration : utilisateurs, machines, apps du hub, révocation | | [k8s/auth-portal-admin.md](k8s/auth-portal-admin.md) | Portail — administration : utilisateurs, machines, apps du hub, révocation |
| [k8s/public-domain.md](k8s/public-domain.md) | Domaine public `funklab.online` — HTTPS Let's Encrypt, apps exposées, ajout d'app |
| [k8s/k9s.md](k8s/k9s.md) | k9s — TUI de gestion du cluster | | [k8s/k9s.md](k8s/k9s.md) | k9s — TUI de gestion du cluster |
--- ---

View file

@ -8,7 +8,7 @@ sont dans **`admin/k8s/auth-portal.md`** ; le guide à envoyer aux utilisateurs
| Console | URL | Compte | | Console | URL | Compte |
|---|---|---| |---|---|---|
| **Authentik** (identités, apps du hub) | `http://auth.lab.local` (LAN) ou `http://kaya.freeboxos.fr:9081` → icône ⚙ | `akadmin` | | **Authentik** (identités, apps du hub) | `https://auth.funklab.online` (ou `http://auth.lab.local` en LAN) → icône ⚙ | `akadmin` |
| **Guacamole** (connexions, sessions) | tuile « Portail consoles » puis *Settings* | `Alkatrazz` (SSO, « Administer system ») | | **Guacamole** (connexions, sessions) | tuile « Portail consoles » puis *Settings* | `Alkatrazz` (SSO, « Administer system ») |
> `guacadmin` (compte local) est **inaccessible** tant que le SSO est prioritaire — > `guacadmin` (compte local) est **inaccessible** tant que le SSO est prioritaire —
@ -139,7 +139,8 @@ kubectl -n auth logs deploy/authentik-server --tail=50 # flows, redirect_uri,
| Symptôme | Cause probable | | Symptôme | Cause probable |
|---|---| |---|---|
| « Redirect URI Error » (page Authentik) | Redirect URI du provider ≠ `http://kaya.freeboxos.fr:9080/` au caractère près | | « Redirect URI Error » (page Authentik) | Redirect URI du provider ≠ l'URL publique de l'app au caractère près (cf. tableau `public-domain.md`) |
| « failed to query provider … 404 » (ArgoCD/OIDC) | Application Authentik absente ou **slug** ≠ celui attendu (ex. `argocd`) → discovery 404 |
| Login SSO accepté puis retour à la page de login Guacamole | Signing Key absente du provider, ou slug ≠ `guacamole` (JWKS 404 dans les logs) | | Login SSO accepté puis retour à la page de login Guacamole | Signing Key absente du provider, ou slug ≠ `guacamole` (JWKS 404 dans les logs) |
| Tout le monde bloqué au login | Anti-bruteforce (piège n°5) — attendre ~5 min ou redémarrer le pod guacamole | | Tout le monde bloqué au login | Anti-bruteforce (piège n°5) — attendre ~5 min ou redémarrer le pod guacamole |
| Tuile absente pour un utilisateur | Pas membre du groupe `guacamole` | | Tuile absente pour un utilisateur | Pas membre du groupe `guacamole` |

View file

@ -90,35 +90,30 @@ kubectl -n auth create secret generic guacamole-secret \
3. Settings → Users : les comptes Authentik apparaissent après leur **premier login** 3. Settings → Users : les comptes Authentik apparaissent après leur **premier login**
(`POSTGRESQL_AUTO_CREATE_ACCOUNTS=true`) → leur assigner les connexions (READ). (`POSTGRESQL_AUTO_CREATE_ACCOUNTS=true`) → leur assigner les connexions (READ).
## Accès externe (Internet) — Authentik en hub utilisateur ## Accès externe (Internet) — domaine public HTTPS
**Authentik est la porte d'entrée** (page « My applications » : une tuile par app **Depuis le 2026-07-07, tout passe par le domaine `funklab.online` en HTTPS** (Let's
autorisée), le SSO fait le reste. Choix assumé 2026-07-07 : exposition directe sans Encrypt). Authentik (`auth.funklab.online`) est la porte d'entrée ; le SSO fait le reste.
VPN, simplicité d'abord (WireGuard reste dispo, cf. `admin/infra/wireguard.md`). Détail complet de la chaîne (DNS OVH, Freebox, Traefik/TLS) : **`admin/k8s/public-domain.md`**.
| URL publique | Service | Chaîne | | URL publique | Service |
|---|---|---| |---|---|
| `http://kaya.freeboxos.fr:9081` | **Authentik** (hub + login) | Freebox `9081/tcp → s01` → DNAT → VIP MetalLB `192.168.10.201:9000` | | `https://auth.funklab.online` | **Authentik** — hub + login |
| `http://kaya.freeboxos.fr:9080` | Guacamole (via tuile SSO) | Freebox `9080/tcp → s01` → DNAT → VIP `192.168.10.202:8080` | | `https://portail.funklab.online` | Guacamole (consoles) |
| `https://grafana.funklab.online` · `https://openwebui.funklab.online` · `https://argocd.funklab.online` | apps SSO |
| `https://n8n.funklab.online` | n8n (login natif) |
- **URL canonique unique** : les endpoints OIDC de Guacamole pointent sur - **URL canonique = le domaine**, LAN inclus (dnsmasq split-horizon : `*.funklab.online`
`kaya.freeboxos.fr`**tout le monde, LAN inclus**, doit utiliser ces URLs (le LAN → Traefik en interne). Les endpoints OIDC des apps pointent sur `*.funklab.online`.
repasse par la Freebox, hairpin NAT). `portail.lab.local` affiche encore l'UI mais - Les anciens ports `kaya.freeboxos.fr:9080/9081` (DNAT → VIPs MetalLB `.202`/`.201`)
le SSO ramène sur l'URL publique. **restent un chemin réseau** mais le SSO ramène sur le domaine.
- Les VIPs dédiées **contournent Traefik** : un DNAT par port ne peut pas router par - **Un seul compte par personne (Authentik)**. Nouvelle app = nouveau provider + tuile.
Host sur l'entrypoint unique :80. - **Garde-fous** : rate-limit nftables + TLS Let's Encrypt (plus de HTTP clair) +
- **Un seul compte par personne (Authentik)** — plus de comptes locaux Guacamole. protections applicatives (Authentik lockout, Guacamole ban 5 échecs). Durcissement
Parcours ami : `kaya.freeboxos.fr:9081` → login → tuile « Portail consoles » → possible : MFA/TOTP Authentik.
console. Nouvelle app plus tard = nouveau provider + tuile, zéro compte en plus.
- **Garde-fous** : rate-limit nftables (30 connexions neuves/min par service) +
protections applicatives (Authentik : flows/lockout ; Guacamole : ban 5 échecs).
⚠️ HTTP **non chiffré** : mots de passe interceptables en théorie — mots de passe
dédiés, MFA/TOTP Authentik recommandé pour durcir, TLS (vrai domaine + Let's
Encrypt) si l'usage s'installe.
Config côté Authentik (UI) : provider `guacamole` → **Redirect URI Config côté Authentik (UI) — Redirect URI par app : voir le tableau de
`http://kaya.freeboxos.fr:9080/`** ; application « Portail consoles » → **Launch URL `admin/k8s/public-domain.md` (ex. Guacamole `https://portail.funklab.online/`).
`http://kaya.freeboxos.fr:9080/`**.
## Pièges / notes ## Pièges / notes

View file

@ -85,12 +85,37 @@ spec:
Le certificat est émis automatiquement au premier accès (challenge HTTP-01 sur le port 80). Le certificat est émis automatiquement au premier accès (challenge HTTP-01 sur le port 80).
## Intégration auth par app ## Apps exposées (état 2026-07-07)
| App | Mode | Note | 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 |
|---|---|---| |---|---|---|
| Grafana, Open WebUI, ArgoCD | **OIDC natif** | redirect_uri sur l'URL publique `*.funklab.online` | | 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 |
| Prometheus, Alertmanager, n8n, SearXNG | **Proxy Provider Authentik** | middleware forward-auth Traefik (app sans login propre) | | 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`. Détail de l'ajout d'une app au hub : `admin/k8s/auth-portal-admin.md`.

View file

@ -7,11 +7,11 @@ directement dans ton navigateur**. Rien à installer.
- Un navigateur (PC, Mac, tablette… ça marche partout) - Un navigateur (PC, Mac, tablette… ça marche partout)
- Ton **compte** : un nom d'utilisateur + mot de passe fournis par Ali - Ton **compte** : un nom d'utilisateur + mot de passe fournis par Ali
- L'adresse du portail : **http://kaya.freeboxos.fr:9081** - L'adresse du portail : **https://auth.funklab.online**
## Se connecter (30 secondes) ## Se connecter (30 secondes)
1. Ouvre **http://kaya.freeboxos.fr:9081** 1. Ouvre **https://auth.funklab.online**
2. Entre ton nom d'utilisateur puis ton mot de passe 2. Entre ton nom d'utilisateur puis ton mot de passe
3. Tu arrives sur **ta page d'applications** : chaque vignette est un service auquel 3. Tu arrives sur **ta page d'applications** : chaque vignette est un service auquel
tu as accès tu as accès
@ -49,7 +49,7 @@ directement dans ton navigateur**. Rien à installer.
| Problème | Solution | | Problème | Solution |
|---|---| |---|---|
| La page ne charge pas | Vérifie l'adresse exacte (avec le `:9081`) et ta connexion | | La page ne charge pas | Vérifie l'adresse exacte (`https://auth.funklab.online`) et ta connexion |
| Mot de passe refusé | Attention aux majuscules ; sinon demande une réinitialisation à Ali | | Mot de passe refusé | Attention aux majuscules ; sinon demande une réinitialisation à Ali |
| « Trop de tentatives » | Patiente 5 minutes, puis réessaie calmement | | « Trop de tentatives » | Patiente 5 minutes, puis réessaie calmement |
| La vignette « Portail consoles » n'apparaît pas | Ton compte n'est pas encore activé pour le portail — préviens Ali | | La vignette « Portail consoles » n'apparaît pas | Ton compte n'est pas encore activé pour le portail — préviens Ali |