mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 06:34:43 +02:00
docs(cluster): aligne la doc sur l'état réel + re-ingest RAG + fix ubatch embed (#44)
* fix(rag): ubatch=2048 pour llama-embed + retry rag-ingest + nettoie defaults rag L'instance llama-embed (:1238) tournait avec l'ubatch llama.cpp par défaut (512). En mode --embeddings + pooling, toute l'entrée doit tenir dans un seul ubatch → tout chunk > 512 tokens échouait en HTTP 500 « input too large to process. increase the physical batch size ». ~46 chunks du RAG (CHUNK_MAX=2000 chars ≈ 700 tokens) n'étaient pas indexés. - llama_server : ajoute llama_embed_ubatch_size (2048 = ctx) + flags --batch-size/--ubatch-size dans le template llama-embed.service. - rag-ingest : retry (5×, backoff) sur erreurs transitoires 5xx/réseau de l'embed. - rag/defaults : aligne embed_url/embed_model sur nomic :1238 (étaient des vars mortes pointant encore qwen3-8b :1234 — trompeuses). Résultat : ré-ingestion 436/436 chunks, 0 erreur. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs(cluster): aligne la doc sur l'état réel (relevé 2026-06-21) + snapshot Passe de vérification terrain (SSH s01/g01 + kubectl) pour corriger les écarts doc↔réalité, et ajout d'un document de référence vérifié. - admin/ops/etat-cluster.md (nouveau) : snapshot daté — machines, services+ports par hôte, workloads k8s, namespaces, IngressRoute, bases PG, modèles LiteLLM, RAG/Qdrant, + procédure pour régénérer le relevé. - OS AlmaLinux 9.7 → 9.8 (s01/g01) ; précise k8s v1.33.1 (CLAUDE/README/install/talos). - RAG funk-docs : retire le warning périmé « supprimée 2026-06-17 / à re-ingérer » → reconstruite (436 chunks, nomic-embed-text :1238 dim 768, CPU). Maj rag.md, incidents.md, stt.md. - Namespace sacrifice (hors-repo, hors ArgoCD) + bases PG grafana/sacrifice + services ai via IngressRoute + registry in-cluster (CLAUDE.md, k9s.md). - Services de résilience (llm-heartbeat, llama-watchdog/embed) et instances CPU manuelles :1236/:1237 (souvent éteintes) documentés. - Journal progress/2026-06-21.md : section relevé + RAG. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f0e33c1121
commit
af98b47018
15 changed files with 292 additions and 82 deletions
|
|
@ -1,9 +1,8 @@
|
|||
# RAG — Documentation Funk
|
||||
|
||||
> ⚠️ **À re-ingérer** — Qdrant a été réparé le **2026-06-17** (fin du crash-loop), mais la
|
||||
> réparation a **supprimé la collection `funk-docs`** : `rag-query` ne retourne rien tant que
|
||||
> `rag-ingest` n'a pas reconstruit l'index (reconstructible depuis `admin/`).
|
||||
> Détails de l'incident : `admin/incidents.md` (entrée 2026-06-05).
|
||||
> ✅ **Opérationnel** (relevé 2026-06-21) — `funk-docs` reconstruite après l'incident Qdrant du
|
||||
> 2026-06-17 : **436 chunks**, statut 🟢 green, embeddings **nomic-embed-text** (`:1238`, dim 768).
|
||||
> `rag-query` fonctionne. Détails de l'incident : `admin/incidents.md` (entrée 2026-06-05).
|
||||
|
||||
Le RAG (Retrieval-Augmented Generation) permet à Hermes de répondre en s'appuyant
|
||||
sur la documentation du repo (`admin/`) plutôt que sur sa seule mémoire de modèle.
|
||||
|
|
@ -17,7 +16,7 @@ Hermes (funk-ai)
|
|||
│ terminal: rag-query "comment relancer dnsmasq ?"
|
||||
▼
|
||||
/usr/local/bin/rag-query (storage-01)
|
||||
│ 1. Embed la question → POST http://192.168.10.20:1234/v1/embeddings
|
||||
│ 1. Embed la question → POST http://192.168.10.20:1238/v1/embeddings (nomic-embed-text)
|
||||
│ 2. Recherche vectorielle → POST http://127.0.0.1:6333/collections/funk-docs/points/search
|
||||
▼
|
||||
Qdrant (storage-01:6333)
|
||||
|
|
@ -40,52 +39,37 @@ Hermes formule sa réponse en citant les sources
|
|||
| `rag-query` | `/usr/local/bin/rag-query` | Interroge Qdrant depuis la ligne de commande |
|
||||
| Skill `rag-docs` | Profil `funk-ai` Hermes | Enseigne à Hermes comment utiliser `rag-query` |
|
||||
| Docs indexées | `/srv/data/rag/docs/` (NVMe) | Copie locale du dossier `admin/` |
|
||||
| Collection Qdrant | `funk-docs` | supprimée le 2026-06-17 → **à re-ingérer** (≈339 chunks, dim 4096 Cosine) |
|
||||
| Collection Qdrant | `funk-docs` | **436 chunks**, 🟢 green, **dim 768 Cosine** (nomic-embed-text) |
|
||||
|
||||
---
|
||||
|
||||
## Modèle d'embedding utilisé
|
||||
|
||||
**Qwen3-8B** via llama-server GPU (port 1234), avec les flags `--embeddings --pooling mean`.
|
||||
**nomic-embed-text** via l'instance dédiée llama-server `llama-embed` sur gpu-01 (`:1238`, **CPU**,
|
||||
dim 768). C'est un **vrai modèle d'embedding** — les scripts déployés `rag-ingest` et `rag-query`
|
||||
le hardcodent (`EMBED_URL=http://192.168.10.20:1238/v1/embeddings`, `EMBED_MODEL=nomic-embed-text`).
|
||||
|
||||
C'est le modèle de chat principal, réutilisé pour les embeddings.
|
||||
> Historique : le RAG utilisait au départ **Qwen3-8B** (modèle de chat, `:1234`, dim 4096) réutilisé
|
||||
> pour les embeddings → scores cosinus saturés (0.90–0.95), peu discriminants. La migration vers
|
||||
> nomic (dim 768) étale les scores → tri par pertinence réel. La collection a été recréée à dim 768.
|
||||
|
||||
### Limitation connue
|
||||
> ⚠️ **Drift IaC** : `ansible/roles/rag/defaults/main.yml` a longtemps gardé `embed_url: :1234` /
|
||||
> `embed_model: qwen3-8b` — variables **mortes** (le handler lance `rag-ingest` sans passer d'env →
|
||||
> le défaut hardcodé nomic du script gagne). Aligné sur nomic dans le même lot que ce relevé.
|
||||
|
||||
Qwen3-8B est un modèle génératif, **pas un modèle d'embedding dédié**.
|
||||
Ses représentations vectorielles ont peu de discrimination sémantique :
|
||||
les scores de similarité cosinus sont uniformément hauts (0.90–0.95)
|
||||
quelle que soit la pertinence du résultat.
|
||||
|
||||
Conséquence : les résultats retournés ne sont pas triés par pertinence réelle —
|
||||
le fichier avec le plus de tokens (ex : `incidents.md`) remonte souvent en premier.
|
||||
|
||||
### Quand améliorer
|
||||
|
||||
Pour une recherche sémantique précise, utiliser un modèle d'embedding dédié :
|
||||
|
||||
| Modèle | Taille | Dimension | Notes |
|
||||
|---|---|---|---|
|
||||
| `nomic-embed-text-v1.5` | ~274 MB | 768 | Rapide, bon équilibre qualité/taille |
|
||||
| `bge-m3` | ~1.2 GB | 1024 | Multilingue (français natif) — meilleur choix pour ce repo |
|
||||
|
||||
Déploiement — **déjà fait pour STT** (instance `nomic-embed-text` sur `:1238`, dim 768) :
|
||||
le rôle `llama_server` gère désormais une instance dédiée embeddings sur gpu-01 (GPU),
|
||||
activée par `llama_embed_enabled` (voir `ansible/roles/llama_server/README.md`). STT pointe
|
||||
dessus (`STT_EMBED_URL=http://192.168.10.20:1238/v1/embeddings`).
|
||||
L'instance `llama-embed` est gérée par le rôle `llama_server` (`llama_embed_enabled`, voir son README).
|
||||
|
||||
```bash
|
||||
# (re)déployer l'instance embeddings sur gpu-01
|
||||
ansible-playbook -i inventory.yml playbooks/gpu-01.yml --tags llama_server
|
||||
```
|
||||
|
||||
Pour basculer **le RAG** sur cette même instance (quand il sera réparé) :
|
||||
```bash
|
||||
# Modifier ansible/roles/rag/defaults/main.yml :
|
||||
# embed_url: "http://192.168.10.20:1238/v1/embeddings"
|
||||
# embed_model: "nomic-embed-text"
|
||||
# Puis re-indexer (la dimension passe à 768 → collection recréée) : rag-ingest /srv/data/rag/docs/
|
||||
```
|
||||
### Alternative envisagée
|
||||
|
||||
| Modèle | Taille | Dimension | Notes |
|
||||
|---|---|---|---|
|
||||
| `nomic-embed-text` | ~274 MB | 768 | **En service** — rapide, bon équilibre qualité/taille |
|
||||
| `bge-m3` | ~1.2 GB | 1024 | Multilingue (français natif) — option si la qualité FR doit monter |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -143,7 +127,7 @@ rsync -av --delete admin/ storage-01:/srv/data/rag/docs/
|
|||
ssh storage-01 "rag-ingest /srv/data/rag/docs/"
|
||||
```
|
||||
|
||||
L'ingestion prend ~5-10 minutes pour 339 chunks (embeddings via GPU).
|
||||
L'ingestion prend quelques minutes pour ~436 chunks (embeddings via l'instance nomic `:1238`, CPU).
|
||||
Elle est idempotente — re-lancer ne crée pas de doublons (IDs stables basés sur MD5 du fichier+section).
|
||||
|
||||
---
|
||||
|
|
@ -197,9 +181,8 @@ hermes-skills/funk/rag-docs/
|
|||
|
||||
| Sujet | Détail |
|
||||
|---|---|
|
||||
| Qualité embeddings | Qwen3-8B = modèle chat réutilisé — scores peu discriminants. Fonctionnel mais pas optimal. |
|
||||
| Modèle dédié | `nomic-embed-text` ou `bge-m3` diviseraient les faux positifs par ~3 |
|
||||
| Contention GPU | `rag-ingest` sollicite le GPU (port 1234) pendant ~5-10 min — éviter pendant une session d'inférence active |
|
||||
| Qualité embeddings | `nomic-embed-text` (modèle dédié) — scores cosinus discriminants, tri par pertinence réel |
|
||||
| Embeddings CPU | `llama-embed` (:1238) tourne en **CPU** (découplé du slot chat GPU) — `rag-ingest` ne contend pas le GPU. ubatch=2048 requis (sinon 500 sur chunks > 512 tokens) |
|
||||
| Re-indexation | Obligatoire après modification de `admin/` — pas de sync automatique |
|
||||
| Qdrant persistance | Données dans `/srv/data/qdrant/` sur NVMe — survivent aux redémarrages |
|
||||
| Score minimum | `MIN_SCORE = 0.60` dans `rag-query` — tous les résultats sont au-dessus avec ce modèle |
|
||||
| Score minimum | `MIN_SCORE` dans `rag-query` ajusté pour nomic (scores plus étalés que qwen3-8b) |
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ Objectif ultérieur : « agir sur le homelab » via les outils de Hermes (phase
|
|||
| Agir sur le homelab | Hermes Agent (`:8080`, profils funk-ai/system/monitor/brain) | ✅ opérationnel |
|
||||
| Voix (STT + TTS + wake word) | `tools/hermes-voice/` — faster-whisper + Piper + webrtcvad | ✅ existe (CLI only) |
|
||||
| Démarrage auto au boot | `stt --install-service` (systemd --user) — repris du pattern `tools/hermes-voice/` | ✅ |
|
||||
| Mémoire sémantique | Qdrant `:6333` + RAG (`rag-query`/`rag-ingest`) sur s01 | ✅ Qdrant réparé 17/06 (RAG `funk-docs` à re-ingérer) |
|
||||
| Mémoire sémantique | Qdrant `:6333` + RAG (`rag-query`/`rag-ingest`) sur s01 | ✅ Qdrant réparé 17/06, RAG `funk-docs` re-ingéré (436 chunks, nomic dim 768) |
|
||||
|
||||
Maillon réellement manquant : **l'interface graphique HUD** + le packaging + la mémoire perso.
|
||||
|
||||
|
|
@ -125,7 +125,7 @@ au prompt système (`STT_DISABLE_THINKING`, défaut `true` ; inoffensif hors Qwe
|
|||
borné `max_turns` + TTL) et l'injecte dans l'appel LLM. `/v1/ask {session_id}` + `/v1/reset`.
|
||||
Le client génère un `session_id` par run. Deployment en **1 worker** (cohérence mémoire process).
|
||||
- **Long-terme (5b, ✅ validé 17/06)** : collection Qdrant dédiée `stt-memory` (indépendante du
|
||||
`funk-docs` du RAG), embeddings via Qwen3 `:1234` (dim 4096, Cosine), souvenirs pertinents
|
||||
`funk-docs` du RAG), embeddings via nomic-embed-text `:1238` (dim 768, Cosine), souvenirs pertinents
|
||||
(top-k) injectés au prompt. Qdrant en IP directe `192.168.10.1:6333`. **Dégrade proprement**
|
||||
si Qdrant/embeddings injoignables (la mémoire court-terme tient).
|
||||
- **Validé bout-en-bout** : « mon chat s'appelle Felix » (session A) rappelé dans une
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ error: unexpected character 'D' while parsing minor version number
|
|||
|
||||
Le fichier `version.info` du segment contient `0.D\0` au lieu d'un numéro de version — corruption de données (première occurrence le 2026-06-05 à 21h10).
|
||||
|
||||
### Résolution (crash-loop résolu le 2026-06-17 ; re-ingest encore à faire)
|
||||
### Résolution (crash-loop résolu le 2026-06-17 ; RAG re-ingéré le 2026-06-21)
|
||||
|
||||
La collection `funk-docs` est entièrement reconstructible depuis `admin/` :
|
||||
|
||||
|
|
@ -37,9 +37,10 @@ curl -s http://127.0.0.1:6333/collections # doit répondre
|
|||
|
||||
> **État au 2026-06-17** : les 3 premières étapes (stop + drop `funk-docs` + start) ont été
|
||||
> appliquées sur s01 pour sortir Qdrant du crash-loop (cf. `admin/ia/stt.md`, jalon 5c). Le
|
||||
> service Qdrant et la mémoire STT (`stt-memory`) sont donc opérationnels, **mais** `rag-ingest`
|
||||
> n'a pas encore été relancé : la collection `funk-docs` est vide → `rag-query` reste muet
|
||||
> tant que l'index n'est pas reconstruit.
|
||||
> service Qdrant et la mémoire STT (`stt-memory`) sont opérationnels.
|
||||
>
|
||||
> ✅ **Clôturé (2026-06-21)** : `funk-docs` a été **reconstruite** via `rag-ingest` (relevé : 436
|
||||
> chunks, 🟢 green, embeddings nomic-embed-text `:1238` dim 768) → `rag-query` opérationnel.
|
||||
|
||||
### Prévention
|
||||
|
||||
|
|
@ -52,7 +53,7 @@ curl -s http://127.0.0.1:6333/collections # doit répondre
|
|||
| Date | Composant | Résumé | Sévérité |
|
||||
|---|---|---|---|
|
||||
| 2026-06-19 | llama-server (gpu-01) | Inférence gelée (`/health` OK, génération bloquée) → 502 LLM — **résolu** par restart. Détail : [`incidents-llm-gpu.md`](incidents-llm-gpu.md) | Important |
|
||||
| 2026-06-05 | Qdrant | **Résolu 2026-06-17** — crash-loop corrigé (drop `funk-docs`) ; RAG à re-ingérer | Important |
|
||||
| 2026-06-05 | Qdrant | **Résolu 2026-06-17**, RAG **re-ingéré 2026-06-21** (436 chunks, nomic dim 768) | Important |
|
||||
| 2026-05-29 | RAID5 / sdb + storage-01 | sdb ATA bus errors sous I/O — migration /srv/data du RAID vers NVMe | Important |
|
||||
| 2026-05-27 | RAID5 / sdd | Disque sdd défaillant (44 secteurs morts) — corruptions multiples en cascade | Critique |
|
||||
| 2026-05-14 | Grafana | OOMKilled — limite 256Mi trop serrée pour Grafana 13 | Warning |
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ Chaque fichier couvre une machine ou une couche du projet de A à Z.
|
|||
|
||||
| Guide | Machine | OS | Rôle |
|
||||
|---|---|---|---|
|
||||
| [storage-01.md](storage-01.md) | storage-01 | AlmaLinux 9.7 | Passerelle + RAID5 + services IA (Hermes, LiteLLM, Qdrant, PostgreSQL) |
|
||||
| [gpu-01.md](gpu-01.md) | gpu-01 | AlmaLinux 9.7 | Inférence LLM (ROCm + llama-server, RX 6700XT) |
|
||||
| [kubernetes.md](kubernetes.md) | compute-01/02/03 | Talos v1.13 | Cluster Kubernetes (MetalLB, Traefik, DNS wildcard) |
|
||||
| [storage-01.md](storage-01.md) | storage-01 | AlmaLinux 9.8 (ISO 9.7) | Passerelle + RAID5 + services IA (Hermes, LiteLLM, Qdrant, PostgreSQL) |
|
||||
| [gpu-01.md](gpu-01.md) | gpu-01 | AlmaLinux 9.8 (ISO 9.7) | Inférence LLM (ROCm + llama-server, RX 6700XT) |
|
||||
| [kubernetes.md](kubernetes.md) | compute-01/02/03 | Talos v1.13 (k8s v1.33.1) | Cluster Kubernetes (MetalLB, Traefik, DNS wildcard) |
|
||||
|
||||
## Ordre d'installation recommandé
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ Il est consommé par storage-01 (LiteLLM le pointe directement via HTTP).
|
|||
| CPU | AMD Ryzen 5 3600 (6c/12t) |
|
||||
| RAM | 32 GB DDR4 |
|
||||
| GPU | AMD RX 6700XT — 12 GB VRAM, architecture RDNA2 (gfx1031) |
|
||||
| OS | AlmaLinux 9.7 |
|
||||
| OS | AlmaLinux 9.8 (installé depuis ISO 9.7, point releases via `dnf update`) |
|
||||
| Disque | SSD SATA 500 GB (OS + binaires) |
|
||||
| Stockage modèles | NFS via storage-01 `/srv/data/models` → monté sur `/mnt/models` |
|
||||
|
||||
|
|
|
|||
|
|
@ -74,9 +74,12 @@ ssh -t storage-01 k9s # -t obligatoire pour allouer un TTY (TUI)
|
|||
| Namespace | Contenu |
|
||||
|---|---|
|
||||
| `monitoring` | Prometheus, Grafana, AlertManager |
|
||||
| `ai` | Open WebUI, n8n |
|
||||
| `infra` | Traefik, MetalLB, NFS provisioner |
|
||||
| `ai` | Open WebUI, n8n, **STT-server**, **Ghostfolio** (+ Redis) |
|
||||
| `infra` | Traefik, MetalLB, NFS provisioner, **registry** in-cluster |
|
||||
| `argocd` | ArgoCD (GitOps) |
|
||||
| `metallb-system` | MetalLB (controller + speakers) |
|
||||
| `nfs-provisioner` | nfs-subdir-external-provisioner |
|
||||
| `sacrifice` | Jeu FPS Sacrifice (web + CronJob) — **hors repo Funk-lab, hors ArgoCD** |
|
||||
| `kube-system` | Composants Kubernetes internes |
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Le cluster Kubernetes **funk** compte **3 nœuds** (trois machines ThinkCentre),
|
|||
sous **Talos Linux v1.13.0** (Kubernetes v1.33.1) : **compute-01** est le control-plane,
|
||||
**compute-02** et **compute-03** sont des workers. Les deux autres machines du homelab —
|
||||
**storage-01** (passerelle) et **gpu-01** (llama-server) — sont **hors du cluster** et
|
||||
tournent sous **AlmaLinux 9.7**. Donc : 3 nœuds Kubernetes Talos + 2 hôtes AlmaLinux hors cluster.
|
||||
tournent sous **AlmaLinux 9.8**. Donc : 3 nœuds Kubernetes Talos + 2 hôtes AlmaLinux hors cluster.
|
||||
|
||||
| Nœud | IP | Rôle | Disque | RAM |
|
||||
|---|---|---|---|---|
|
||||
|
|
|
|||
167
admin/ops/etat-cluster.md
Normal file
167
admin/ops/etat-cluster.md
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
# État réel du cluster Funk — snapshot vérifié
|
||||
|
||||
> Relevé **2026-06-21** directement sur les machines (SSH s01/g01 + `kubectl`). Ce document
|
||||
> reflète l'état **observé**, pas l'état *souhaité* de l'IaC — en cas d'écart, les écarts connus
|
||||
> sont signalés (⚠️). Pour la procédure de relevé, voir la fin du fichier.
|
||||
|
||||
---
|
||||
|
||||
## Machines
|
||||
|
||||
| Machine | IP | OS / kernel | Uptime relevé | Rôle |
|
||||
|---|---|---|---|---|
|
||||
| storage-01 | 192.168.10.1 (LAN) / 192.168.1.200 (WAN) | AlmaLinux **9.8** (Olive Jaguar), `5.14.0-687.5.3.el9_8` | 20 j | Passerelle + bastion + données + IA hors-cluster |
|
||||
| gpu-01 | 192.168.10.20 | AlmaLinux **9.8**, `5.14.0-687.5.3.el9_8` | — | llama-server (RX 6700XT, ROCm 7.x) hors-cluster |
|
||||
| compute-01 | 192.168.10.11 | Talos v1.13 / **k8s v1.33.1** | 40 j | k8s control-plane |
|
||||
| compute-02 | 192.168.10.12 | Talos v1.13 / **k8s v1.33.1** | 40 j | k8s worker |
|
||||
| compute-03 | 192.168.10.13 | Talos v1.13 / **k8s v1.33.1** | 40 j | k8s worker |
|
||||
|
||||
> ⚠️ `CLAUDE.md` indiquait AlmaLinux **9.7** pour s01/g01 — la réalité est **9.8**.
|
||||
|
||||
---
|
||||
|
||||
## storage-01 — services actifs (systemd)
|
||||
|
||||
| Service | Port(s) écoute | Rôle |
|
||||
|---|---|---|
|
||||
| `litellm` | `0.0.0.0:4000` | Proxy multi-modèles (Hermes + ask-agent + STT-server) |
|
||||
| `llm-heartbeat` | — | **Anti-502** : garde chaud le tuyau LiteLLM↔llama-server (rôle `litellm`) |
|
||||
| `hermes-agent` | (pas de port WAN) | Agent Hermes — appli **TUI**, **pas d'API HTTP** (le « gateway :8080 » de la doc historique n'écoute pas) |
|
||||
| `hermes-auto-improve` | `0.0.0.0:9095` | Trigger HTTP analyse doc quotidienne |
|
||||
| `hermes-exec` | `0.0.0.0:9096` | Exécuteur d'actions vocales `hermes -z --yolo` (jeton Bearer) — assistant STT |
|
||||
| `qdrant` | `0.0.0.0:6333` / `:6334` | Base vectorielle (RAG `funk-docs` + mémoire STT `stt-memory`) |
|
||||
| `postgresql-16` | `192.168.10.1:5432` | PostgreSQL 16 (8 bases, cf. plus bas) |
|
||||
| `dnsmasq` | `192.168.10.1:53` | DNS + wildcard `*.lab.local` |
|
||||
| `nfs-*` (mountd/idmapd/statd) | `:2049 :111 :20048` | Export NFS modèles + PVCs k8s |
|
||||
| `node_exporter` | `:9100` | Métriques Prometheus |
|
||||
| `alertmanager-webhook` | `0.0.0.0:9093` | Pont AlertManager → Hermes monitor |
|
||||
| `postfix` | `:25` | Relais SMTP sortant (Gmail App Password) |
|
||||
|
||||
> Note : `:9093` côté s01 = **alertmanager-webhook** (storage-01), à ne pas confondre avec
|
||||
> l'Alertmanager k8s (`alertmanager.lab.local`, in-cluster).
|
||||
|
||||
---
|
||||
|
||||
## gpu-01 — services llama-server (systemd)
|
||||
|
||||
| Service | Port | État relevé | Rôle |
|
||||
|---|---|---|---|
|
||||
| `llama-server` | `:1234` | ✅ actif | Chat principal **qwen3-8b** (GPU, ROCm) |
|
||||
| `llama-embed` | `:1238` | ✅ actif | Embeddings dédiés **nomic-embed-text** (**CPU**, dim 768, `--ubatch-size 2048`) |
|
||||
| `llama-embed-heartbeat` | — | ✅ actif | Garde chaud le slot embeddings :1238 |
|
||||
| `llama-watchdog` | — | ✅ actif | **Auto-réparation** du llama-server figé (bug ROCm gfx1031) |
|
||||
| llama-server CPU `:1236` | `:1236` | ⚠️ **éteint** | Instance manuelle (profil Hermes `system`) — **non gérée par IaC** |
|
||||
| llama-server CPU `:1237` | `:1237` | ⚠️ **éteint** | Instance manuelle (profil Hermes `monitor`) — **non gérée par IaC** |
|
||||
|
||||
> ⚠️ Au relevé, **seuls `:1234` et `:1238` écoutent**. Les instances CPU `:1236`/`:1237` sont
|
||||
> **arrêtées** → les profils Hermes `system` et `monitor` (qui pointent dessus) sont actuellement
|
||||
> **dégradés**. Ce sont des services manuels (gap IaC connu, cf. `ansible/roles/llama_server/README.md`).
|
||||
>
|
||||
> ⚠️ GPU : `rocminfo` rapporte `gfx1030` (et non `gfx1031`) — c'est l'effet attendu de
|
||||
> `HSA_OVERRIDE_GFX_VERSION=10.3.0`, indispensable car la RX 6700XT (gfx1031) n'est pas
|
||||
> officiellement supportée par ROCm.
|
||||
|
||||
---
|
||||
|
||||
## LiteLLM — modèles exposés (`:4000`)
|
||||
|
||||
| Alias | Backend |
|
||||
|---|---|
|
||||
| `hermes-default` | Alias consommé par Hermes (bascule via `hermes-switch`) |
|
||||
| `qwen3-8b` | llama-server GPU gpu-01 `:1234` |
|
||||
| `claude-sonnet-4-6` | API Anthropic (profil `brain`, facturé) |
|
||||
| `claude-opus-4-7` | API Anthropic (facturé) |
|
||||
|
||||
---
|
||||
|
||||
## Cluster k8s — workloads
|
||||
|
||||
**Nœuds** : compute-01/02/03 tous `Ready`, k8s `v1.33.1` (40 j d'uptime).
|
||||
|
||||
**Namespaces & pods** (tous `Running` au relevé) :
|
||||
|
||||
| Namespace | Workloads |
|
||||
|---|---|
|
||||
| `ai` | ghostfolio, ghostfolio-redis, n8n, open-webui, **stt-server** |
|
||||
| `argocd` | application-controller, applicationset, notifications, redis, repo-server, server |
|
||||
| `infra` | **traefik** (LB `192.168.10.200`), **registry** (registry Docker in-cluster) |
|
||||
| `monitoring` | kube-prometheus-stack (Prometheus, Alertmanager, Grafana **13.0.1**, kube-state-metrics, operator, node-exporters) |
|
||||
| `metallb-system` | controller + speakers |
|
||||
| `nfs-provisioner` | nfs-subdir-external-provisioner |
|
||||
| `kube-system` | coredns, flannel, kube-proxy, control-plane statiques |
|
||||
| **`sacrifice`** | **`sacrifice-web`** (`sacrifice.lab.local`) + CronJob `sacrifice-assign-renfort` |
|
||||
|
||||
> ⚠️ **Namespace `sacrifice` non documenté** dans `CLAUDE.md`. C'est le projet de jeu FPS
|
||||
> [Sacrifice](https://github.com/Alkatrazz24/Sacrifice) (monorepo séparé). Déployé **hors du repo
|
||||
> Funk-lab** et **hors ArgoCD** (absent de la liste des Applications) — sa propre chaîne le pousse.
|
||||
> Il possède aussi sa base PostgreSQL `sacrifice` sur storage-01.
|
||||
|
||||
**ArgoCD Applications** (toutes `Synced` / `Healthy`) :
|
||||
`root` · `ghostfolio` · `n8n` · `open-webui` · `stt` · `monitoring` · `kube-prometheus-stack` ·
|
||||
`nfs-provisioner` · `nfs-subdir-external-provisioner`.
|
||||
|
||||
**Exposition HTTP** :
|
||||
|
||||
| Type | Hôtes |
|
||||
|---|---|
|
||||
| `Ingress` standard | `argocd.lab.local`, `grafana.lab.local`, `prometheus.lab.local`, `alertmanager.lab.local`, `sacrifice.lab.local` |
|
||||
| `IngressRoute` (CRD Traefik) | `ai/open-webui`, `ai/n8n`, `ai/ghostfolio`, `ai/stt-server`, `infra/traefik-dashboard` |
|
||||
|
||||
> Les services du namespace `ai` (openwebui, n8n, ghostfolio, stt) passent par des **IngressRoute
|
||||
> Traefik** (CRD), pas par des `Ingress` standards.
|
||||
|
||||
---
|
||||
|
||||
## PostgreSQL 16 (storage-01) — bases
|
||||
|
||||
`hermes` · `litellm` · `n8n` · `openwebui` · `ghostfolio` · `grafana` · `sacrifice` · `postgres`
|
||||
|
||||
> ⚠️ Bases non listées dans `CLAUDE.md` : **`grafana`** (Grafana k8s utilise un PG externe sur s01)
|
||||
> et **`sacrifice`** (projet hors-repo).
|
||||
|
||||
---
|
||||
|
||||
## RAG / Qdrant — état
|
||||
|
||||
| Collection | Points | Statut | Dim / distance |
|
||||
|---|---|---|---|
|
||||
| `funk-docs` | **436** | 🟢 green | 768 / Cosine |
|
||||
| `stt-memory` | — | 🟢 | 768 / Cosine |
|
||||
|
||||
> ✅ **`funk-docs` reconstruite et complète (436 chunks, 0 erreur)** — le warning « collection
|
||||
> supprimée le 2026-06-17, re-ingest requis » de `CLAUDE.md`/`README`/`admin/ia/rag.md` est
|
||||
> **périmé**. Embeddings via **nomic-embed-text** (`:1238`, dim 768), **plus** qwen3-8b.
|
||||
>
|
||||
> 🐛 **Fix de ce lot — embeddings tronqués à 512 tokens** : le relevé initial montrait 389 points
|
||||
> avec **~46 chunks manquants** (HTTP 500 `input too large to process. increase the physical batch
|
||||
> size (current: 512)`). Cause : `llama-embed` (:1238) tournait avec l'**ubatch llama.cpp par
|
||||
> défaut (512)**, or en mode `--embeddings`+pooling toute l'entrée doit tenir dans un seul ubatch
|
||||
> → tout chunk > 512 tokens échouait (CHUNK_MAX=2000 chars ≈ 700 tokens). **Corrigé** : `--batch-size`
|
||||
> /`--ubatch-size = 2048` (= ctx) → ré-ingestion **436/436, 0 erreur**. Fix durable dans le rôle
|
||||
> `llama_server` (`llama_embed_ubatch_size`) ; appliqué en live via drop-in systemd sur g01 (à
|
||||
> réconcilier au prochain `make apply-gpu`). `rag-ingest` gagne aussi un retry sur 5xx transitoires.
|
||||
>
|
||||
> ⚠️ Drift IaC mineur (corrigé) : `ansible/roles/rag/defaults/main.yml` mentionnait encore
|
||||
> `embed_url: :1234` / `embed_model: qwen3-8b` (variables **mortes** — les scripts déployés
|
||||
> hardcodent nomic `:1238`).
|
||||
|
||||
---
|
||||
|
||||
## Comment régénérer ce snapshot
|
||||
|
||||
Depuis le poste perso (accès `ssh storage-01` = user `ansible` ; g01 via `root@192.168.10.20` ;
|
||||
kubeconfig `/home/ansible/.kube/config` sur s01) :
|
||||
|
||||
```bash
|
||||
# Services + ports s01
|
||||
ssh storage-01 'systemctl list-units --type=service --state=running | grep -iE "litellm|hermes|qdrant|postgres|nfs|dnsmasq|node_exporter|alertmanager|postfix"; ss -tlnp'
|
||||
# gpu-01
|
||||
ssh storage-01 'ssh root@192.168.10.20 "systemctl list-units llama* ; ss -tlnp | grep :12"'
|
||||
# k8s
|
||||
ssh storage-01 'KUBECONFIG=/home/ansible/.kube/config kubectl get nodes,pods,ingress,ingressroute -A'
|
||||
ssh storage-01 'KUBECONFIG=/home/ansible/.kube/config kubectl get applications -n argocd'
|
||||
# Bases PG + Qdrant + LiteLLM
|
||||
ssh storage-01 'sudo -u postgres psql -tAc "SELECT datname FROM pg_database WHERE datistemplate=false"'
|
||||
ssh storage-01 'curl -s localhost:6333/collections | python3 -m json.tool'
|
||||
ssh storage-01 'curl -s localhost:4000/v1/models -H "Authorization: Bearer lm-studio" | python3 -m json.tool'
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue