Commit graph

241 commits

Author SHA1 Message Date
alkatrazz
a3ba3089e2 feat(voice): améliorer hermes-voice + fix hermes-agent
hermes-voice :
- mode SSH : appel `hermes -z` via storage-01 (soul + skills + RAG + mémoire)
- mode litellm : fallback avec historique de session (10 échanges)
- Whisper large-v3 : meilleure reconnaissance FR (distil-large-v3 dérivait vers l'anglais)
- forcer français dans les requêtes SSH
- historique conversationnel + reset vocal ("oublie tout")

hermes-agent :
- fix boucle de redémarrage (510 restarts) : ajouter --replace à ExecStart

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 16:24:21 +02:00
alkatrazz
6fc5b5984e feat(voice): ajouter client vocal Hermes (hermes-voice)
- tools/hermes-voice/ : pipeline VAD → faster-whisper → LiteLLM → piper TTS
- mot-clé "hermes" détecté dans la transcription Whisper (pas de wake word model)
- modes : VAD continu + push-to-talk + --no-tts pour debug
- nftables : ouvrir port 4000 LiteLLM vers LAN domestique (192.168.1.0/24)
- admin/ia/hermes-voice.md : documentation installation et utilisation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 15:12:44 +02:00
alkatrazz
eca28a8dc1 docs(k8s): ajouter documentation k9s
Installation poste perso + storage-01, configuration namespace par défaut,
raccourcis navigation, cas d'usage fréquents, dépannage.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 23:07:32 +02:00
alkatrazz
529bb66ebd docs: mise à jour documentation — NVMe, Qwen3, gaps IaC
- CLAUDE.md : /srv/data NVMe (plus RAID5), structure k8s/ expliquée,
  namespace ai ajouté, Hermes data code/données séparés
- README.md : roadmap complète (n8n/Open WebUI/monitoring opérationnels),
  Talos v1.13, vault vars complètes, rôles Ansible manquants, RAID5→NVMe
- admin/ia/rag.md : 284→339 chunks, RAID5→NVMe
- admin/ia/hermes.md : RAID5→NVMe (incidents 2026-05-13 et 2026-05-29)
- admin/ia/litellm.md : qwen2.5→qwen3-8b, gap IaC CPU models documenté
- admin/ia/llama_server.md : gap IaC instances CPU documenté
- admin/index_knowledge.py : 5 chunks RAG mis à jour (Qwen2.5→Qwen3,
  RAID5→NVMe, vault vars + rôles complets)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 22:58:24 +02:00
alkatrazz
7f6fee94c2 docs(claude): gpu-01 reboot ok — kernel 5.14.0-687.5.3 opérationnel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:20:11 +02:00
alkatrazz
5165fca73b docs(claude): noter reboot gpu-01 en attente (kernel 5.14.0-687.5.3)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:10 +02:00
alkatrazz
144c522096 chore: mettre à jour vault Gmail + RAG 339 chunks
- vault: App Password Gmail mis à jour pour postfix_relay
- CLAUDE.md: RAG 284 → 339 chunks (ajout docs n8n + open-webui)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:17:08 +02:00
alkatrazz
12f219c83b docs: documenter Open WebUI, n8n et mettre à jour l'état du projet
- CLAUDE.md : état au 2026-05-29 — Open WebUI + n8n , LiteLLM sur
  0.0.0.0, postfix Gmail SMTP, suppression  workloads IA
- admin/k8s/open-webui.md : architecture, déploiement, credentials,
  dépannage, différence avec Hermes TUI
- admin/k8s/n8n.md : architecture, 2 workflows documentés (alertes +
  rapport horaire), 8 idées de workflows futurs, opérations courantes,
  dépannage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:10:46 +02:00
alkatrazz
0df9ccf812 feat(alertmanager): ajouter webhook n8n pour résumés alertes par email
AlertManager envoie maintenant les alertes à deux receivers :
- hermes-monitor (webhook Hermes existant)
- n8n webhook → LLM summary → Gmail

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:28:50 +02:00
alkatrazz
e644c1ae1b fix(nftables): ouvrir port 25 SMTP pour pods k8s (10.42/16)
n8n tourne dans un pod k8s — le port 25 de postfix n'était ouvert
que pour 192.168.10.0/24 (nœuds cluster), pas pour 10.42.0.0/16
(pods). Connexion ETIMEDOUT au nœud Send Email du workflow alertes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:27:08 +02:00
alkatrazz
8c94936467 fix(postfix): basculer relay de Brevo vers Gmail SMTP
Brevo rejetait les mails envoyés depuis aliyesilkaya93@gmail.com
(domaine non vérifié côté Brevo). Gmail SMTP signe lui-même les mails
→ livraison garantie vers le compte Gmail destinataire.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:13:24 +02:00
alkatrazz
ad49b129a1 fix(litellm): exposer port 4000 au cluster k8s
LiteLLM écoutait sur 127.0.0.1 uniquement — les pods k8s (10.42.x.x)
ne pouvaient pas atteindre 192.168.10.1:4000, Open WebUI affichait
"Aucun modèle disponible". Binding changé en 0.0.0.0 + nftables ouvert
pour 192.168.10.0/24 et 10.42.0.0/16.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 16:15:37 +02:00
alkatrazz
e1446c687a fix(k8s/n8n): N8N_SECURE_COOKIE=false — HTTP interne sans TLS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:46:32 +02:00
alkatrazz
f9609e48dd fix(k8s/open-webui): memory 1Gi→2Gi (OOMKill HuggingFace download au boot)
fix(ansible/postgresql): GRANT ALL ON SCHEMA public (PostgreSQL 15+ default)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:42:54 +02:00
alkatrazz
bdd36d7188 fix(ansible/postgresql): no_log sur Grant + alias db déprécié → database
- Grant user privileges : ajout no_log:true (mot de passe visible en clair
  dans les logs Ansible en cas d'échec via item loop)
- Alias 'db' déprécié par community.postgresql → renommé 'database'
- litellm DB recrée manuellement (corruption pg_attribute copiée depuis RAID)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:25:42 +02:00
alkatrazz
77c4fe99c2 fix(ansible/nfs_server): supprimer le montage RAID — /srv/data est NVMe bind-mount
La tâche "Mount RAID5 array (fstab + immediate)" écrasait l'entrée fstab
bind-mount (/home/data → /srv/data) et remontait le RAID à chaque apply.

- Suppression de ansible.posix.mount state=mounted pour le RAID
- La tâche mdadm.conf devient conditionnelle (when: stdout non vide)
  et failed_when: false pour ne pas bloquer si le RAID n'est pas assemblé
- Ajout d'un sanity-check : vérifie que /srv/data est un répertoire
- Commentaires explicatifs dans tasks/ et defaults/ pour prévenir toute
  régression future

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:21:26 +02:00
alkatrazz
bc137d13b4 feat(k8s): déployer Open WebUI + n8n sur namespace ai via ArgoCD
Open WebUI (openwebui.lab.local) :
- Connecté à LiteLLM (192.168.10.1:4000/v1) comme backend OpenAI-compatible
- PostgreSQL via storage-01 pour l'historique des conversations
- PVC 5Gi NFS pour les uploads, Traefik IngressRoute

n8n (n8n.lab.local) :
- PostgreSQL via storage-01, chiffrement des credentials
- PVC 2Gi NFS, Traefik IngressRoute
- Webhook URL interne : http://n8n.lab.local

Ansible : ajoute openwebui et n8n dans postgresql_databases/users
(vault_pg_openwebui_password + vault_pg_n8n_password à ajouter au vault)

Prérequis avant 1er déploiement :
  make vault-edit   # ajouter les 2 passwords
  make apply-storage --tags postgresql
  kubectl create secret generic open-webui-secret -n ai ...
  kubectl create secret generic n8n-secret -n ai ...

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 15:08:41 +02:00
alkatrazz
3cd374630d docs(incidents): 2026-05-29 — migration /srv/data RAID5 → NVMe (sdb ATA bus errors)
- Incident : sdb ATA bus errors sous charge I/O bloquaient le rsync en état D
- Résolution : sdb marqué (F) dans mdadm, rsync relancé (205 MB/s, 35s)
- Fix : version.info corrompu dans segment Qdrant RocksDB (0.D\0 → 0.6.0)
- Architecture : /srv/data bind-monté depuis /home/data (NVMe XFS, 801 GB libres)
- fstab mis à jour, tous les services opérationnels
- CLAUDE.md : venv bootstrap, make --tags invalide, incidents.md dans admin/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 14:59:13 +02:00
alkatrazz
940234806d docs(incidents): 2026-05-27 — défaillance sdd, corruptions multiples, retrait RAID
Documente l'incident complet :
- Cause racine : sdd défaillant (44 secteurs morts, 6 ans d'utilisation)
  write-back cache masquant les échecs d'écriture → corruption silencieuse
- Corruptions résolues : Qdrant RocksDB, PostgreSQL grafana+litellm,
  Prometheus TSDB, Docker registry, sacrifice-web
- Correctif permanent : sdd retiré du RAID (mdadm.conf + initramfs)
- Actions restantes listées : remplacement sdd, câble sda, APM sdb, UPS, e2fsck

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 19:43:31 +02:00
alkatrazz
d39b083342 fix(grafana): corriger envFromSecrets (était envFromSecretRef)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 15:31:35 +02:00
alkatrazz
92ea6c60a5 fix(grafana): migrer SQLite→PostgreSQL — DDL NFS trop lent au boot
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 15:26:39 +02:00
alkatrazz
2bd7b2c602 fix(grafana): désactiver initChownData — perms déjà 472:472 + NFS writes bloquées sur compute-03
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 14:30:24 +02:00
alkatrazz
ae0aa614d3 docs(email): masquer exemple App Password dans la doc 2026-05-17 16:54:20 +02:00
alkatrazz
8da92cb721 feat(postfix): relay SMTP Gmail + suppression règles Conan nftables
- postfix_relay: switch Brevo → Gmail SMTP (smtp.gmail.com:587, App Password)
- smtp_generic_maps: réécriture expéditeur root@lab.localaliyesilkaya93@gmail.com
- nftables: suppression DNAT/NAT Conan Exiles (ports 7777/7778/27015)
- gateway handler: reloaded → restarted (flush complet des règles nft)
- hermes_agent: pip → uv pour installation qdrant-client (venv sans pip binaire)
- CLAUDE.md: corrections funk-cluster, hermes-switch, RAID5, postfix
- docs: admin/infra/email.md — procédure complète relay Gmail

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 16:46:42 +02:00
alkatrazz
24c0bf9e12 docs: progression 2026-05-14 + désignore progress/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:28:10 +02:00
alkatrazz
e17396a150 feat(souls): révision complète des 4 SOUL.md Hermes + doc
funk-ai : ajout rag-query, tableau services complet, patterns courants
monitor : format VERDICT obligatoire, services Funk + signes d'erreur, sévérités alertes
system  : contexte AlmaLinux/k8s, formats de réponse par type, exemples concrets
brain   : contexte cluster complet, contrainte GPU, RAM k8s, quand l'appeler

docs: admin/ia/hermes-souls.md — résumé des 4 profils, déploiement

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:22:56 +02:00
alkatrazz
eae6e76645 feat(rag): RAG Hermes — Qdrant + rag-ingest/rag-query + skill funk-ai
Indexation de admin/ (284 chunks) dans Qdrant via embeddings Qwen3-8B.
rag-query utilisable en CLI et depuis le profil funk-ai de Hermes.
Note: modèle d'embedding générique — qualité limitée, voir admin/ia/rag.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:16:06 +02:00
alkatrazz
3a013834aa fix(webhook): réponse HTTP 200 immédiate + ask-agent asynchrone
BrokenPipeError corrigé : send_response(200) envoyé avant subprocess.
ask-agent lancé en threading.Thread daemon — AlertManager n'attend plus.
NO_COLOR=1 + TERM=dumb pour éviter les codes ANSI dans les logs.

docs: alertmanager-webhook.md — architecture, flux, test, dépannage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 21:58:39 +02:00
alkatrazz
c97e895b87 fix(nftables): ouvre port 9093 pour AlertManager webhook → Hermes monitor
Les pods AlertManager (10.42.0.0/16) ne pouvaient pas joindre le webhook
sur storage-01:9093 — alertes Prometheus reçues mais jamais transmises à
ask-agent monitor. Port 9093 ajouté pour pods k8s + nœuds cluster.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 21:37:48 +02:00
alkatrazz
719cd4bf8c feat(monitoring): dashboard infra — section services systemd + NFS I/O
Nouvelle section "Services — état systemd" en bas du dashboard :

storage-01 (8 panels verts/rouges) :
  DNS (dnsmasq), NFS server, PostgreSQL, Qdrant, LiteLLM,
  Hermes Agent, nftables, chronyd (NTP)

gpu-01 (4 panels) :
  llama-server GPU (:1234), llama-server system (:1236),
  llama-server monitor (:1237), chronyd (NTP)

Timeseries NFS :
  - Débit NFS disque (read/write bytes/s)
  - Requêtes NFS/s par type (read/write/getattr/lookup)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 19:02:27 +02:00
alkatrazz
428fa4ce2a feat(monitoring): dashboard infra — 10 nouveaux panels
Compute (compute-01/02/03) :
  - Uptime min (dtdurations, jaune<12h / vert>12h / bleu>7j)
  - Disk /var % avg (xfs, seuil 60%/85%)

storage-01 :
  - RAID5 état (mapping 1→ACTIF vert / 0→DÉGRADÉ rouge)
  - RAID5 disques HS (vert=0 / rouge>=1)
  - Uptime (dtdurations)
  - Temp CPU (hwmon pci AMD, seuil 60°/80°)

gpu-01 :
  - Uptime (dtdurations)
  - Temp CPU Tdie (hwmon AMD, seuil 70°/90°)
  - Swap % (16GB configuré, actuellement 0%)
  - Timeseries GPU edge/hotspot/VRAM (hwmon RX 6700XT)
  - Timeseries CPU Tdie/Tctl (hwmon AMD)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:57:15 +02:00
alkatrazz
a21b986d54 fix(monitoring): dashboard infra — remplace regex instance par job=node-exporter
instance=~"192\.168\.10\.(11|12|13):9100" → job="node-exporter"

La barre oblique inversée dans les regex PromQL string literals causait
une erreur "unknown escape sequence" (\.  n'est pas un escape PromQL valide).
job="node-exporter" est équivalent (seuls les 3 compute nodes ont ce job)
et ne dépend pas d'adresses IP hardcodées.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:48:00 +02:00
alkatrazz
0498d770f2 fix(monitoring): dashboard infra nodata — nftables pod CIDR + mountpoint
nftables.conf.j2 :
  - Ajoute 10.42.0.0/16 (CIDR pods k8s) pour port 9100 (node_exporter)
    et port 8080 (hermes webhook AlertManager)
  - Appliqué live sur storage-01 + persisté dans /etc/sysconfig/nftables.conf
  - storage-01 était up=0 (timeout) car pods Prometheus ne pouvaient pas
    l'atteindre malgré node_exporter actif

dashboard-infrastructure.yaml :
  - Corrige mountpoint /srv → /srv/data (RAID5 monté sur /srv/data)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:42:11 +02:00
alkatrazz
f937c2589d fix(funk-cluster): grep -c bug + uncordon automatique au démarrage
- check_k8s_pods : grep -c retournait "0\n0" (|| echo 0 inutile quand
  grep-c affiche 0 même en cas d'absence de match) — utilise un cache
  intermédiaire pods_output + running=$(grep -c) || running=0
- cmd_start : uncordon automatique si nœuds SchedulingDisabled détectés
  (séquelle d'un funk-stop --k8s), suivi d'une attente pod infra avant
  le check — évite de devoir passer --k8s juste pour débloquer le cluster

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:57:12 +02:00
alkatrazz
494184b025 feat(funk-cluster): check k8s pod health in funk-start et funk-status
Ajoute check_k8s_pods / check_k8s_workloads (argocd, infra, monitoring).
funk-start vérifie désormais les pods k8s si les nœuds sont joignables,
même sans --k8s. En mode --k8s : attente ArgoCD + infra avant le check.
funk-status montre aussi l'état des pods si cluster up.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:54:18 +02:00
alkatrazz
c09a88a540 docs: progression 2026-05-14
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 01:12:05 +02:00
alkatrazz
a4a5fb2383 fix(funk-cluster): SIGKILL process fils hermes avant umount /srv/data
hermes-agent spawne des process Python qui survivent hors du cgroup
systemd après stop_service. Ils gardent des file descriptors ouverts sur
/srv/data (logs, state.db-shm) et bloquent le umount.

Ajout d'un lsof + kill -9 sur tous les process tenant /srv/data avant
sync + umount — garantit un démontage propre sans dépendre de systemd.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 01:09:53 +02:00
alkatrazz
0c37635802 fix(funk-cluster): umount propre /srv/data avant extinction storage-01
Avant, shutdown -h now était appelé directement après stop qdrant/postgresql.
systemd démontait /srv/data pendant la séquence d'extinction sans garantie
que tous les buffers aient été flushés.

Séquence ajoutée avant shutdown :
  1. stop nfs-server (était oublié dans le script)
  2. sync — flush tous les buffers disque
  3. umount /srv/data — démontage explicite du RAID5
  Si umount échoue, lsof affiche le processus bloquant avant d'abandonner.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 01:06:53 +02:00
alkatrazz
5bcf95b82e docs: réorganisation complète de admin/ en 4 domaines thématiques
Structure avant : 20 fichiers à plat dans admin/ — difficile à naviguer.
Structure après : 4 sous-répertoires thématiques + index clair.

Réorganisation :
  admin/ops/    → cluster.md, ansible.md, systeme.md
  admin/infra/  → reseau.md, nfs.md, dnsmasq.md, ssh.md
  admin/k8s/    → talos.md, argocd.md, monitoring.md
  admin/ia/     → llama_server.md, rocm.md, litellm.md, hermes.md

Suppressions :
  - ask-agent.md : contenu fusionné dans ia/hermes.md (section ask-agent)
  - lm_studio.md : obsolète (LM Studio remplacé par llama-server)

Mises à jour contenu :
  - ia/hermes.md : fusion complète avec ask-agent.md (profils, skills,
    SOUL.md, ask-agent CLI, dépannage) — doc unifiée sans redondance
  - ops/cluster.md : section GitOps réduite à 2 lignes + lien argocd.md
  - incidents.md : tableau de résumé en tête + 4 nouveaux incidents
    (Grafana OOMKilled, AlertManager null receiver, llama-server 501,
    nftables règle après drop)
  - README.md : réécrit — navigation rapide + index par domaine

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 00:47:58 +02:00
alkatrazz
d552abd2ef fix(monitoring): Grafana memory limit 512Mi → 1Gi
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 23:55:33 +02:00
alkatrazz
273d4b2a23 fix(monitoring): augmenter limite mémoire Grafana 256Mi → 512Mi
Grafana 13 était OOMKilled régulièrement (exit code 137, 5 restarts
observés) avec la limite à 256Mi — cause des "no available server"
Traefik pendant les redémarrages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 23:15:37 +02:00
alkatrazz
7db7aa2e9d docs: mise à jour documentation monitoring + llama-server + réseau
- monitoring.md : refonte complète — architecture corrigée (ROCm via
  textfile_collector port 9100, plus de port 9101), dashboards Grafana
  (funk-k8s1, funk-inf1, funk-ai01) avec URLs directes et workflow
  GitOps, tableaux de règles d'alertes par catégorie, commandes admin
  Prometheus/AlertManager, structure fichiers annotée
- llama_server.md : mis à jour Qwen3-8B (depuis Qwen2.5-14B), ajout
  des 3 instances systemd (GPU 1234 + CPU system 1236 + CPU monitor
  1237), section Métriques Prometheus avec flag --metrics obligatoire
  et liste des métriques llamacpp réelles, performances mises à jour
- reseau.md : ajout ports 9100 (node_exporter) et 9093 (alertmanager
  webhook) dans la table nftables, note sur l'ordre des règles
  (insert avant drop, pas add)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 23:10:56 +02:00
alkatrazz
630bdee1a2 fix: monitoring ArgoCD — directory.recurse pour dashboards/ et alerts/
L'Application monitoring ne scannait que le répertoire racine,
ignorant les sous-dossiers dashboards/ et alerts/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:57:52 +02:00
alkatrazz
18da44a89f feat: monitoring — dashboards Grafana + alertes Prometheus
Dashboards (ConfigMaps, auto-importés par sidecar Grafana) :
- dashboard-kubernetes : cluster overview, pods, PVCs, restarts
- dashboard-infrastructure : compute/storage-01/gpu-01 CPU/RAM/disque/réseau + GPU ROCm
- dashboard-ai : llama-server GPU/CPU tokens/s, requêtes, VRAM, température GPU

Alertes (PrometheusRule) :
- alerts-node : CPU>90%, RAM>90%, disque>80%, storage-01/gpu-01 down, load élevé
- alerts-k8s : NodeNotReady, PodCrashLoop, PodPending, DeploymentUnavailable, PVCNotBound, ArgoCDOutOfSync
- alerts-ai : llama-server GPU/system/monitor down, GPU temp>80°C, VRAM>95%, queue élevée

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:47:49 +02:00
alkatrazz
83c10feae7 fix: monitoring — collecte métriques externes (nftables, llama --metrics, ROCm via 9100)
- nftables storage-01 : ports 9100 (node_exporter) + 9093 (webhook) ouverts pour 192.168.10.0/24
- llama-server : ajout --metrics pour exposer /metrics sur les 3 instances
- values.yaml : suppression job gpu-01-rocm:9101 inexistant (ROCm passe par node_exporter 9100 textfile_collector)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:41:19 +02:00
alkatrazz
0cd45b7be9 docs: monitoring — URLs Prometheus et AlertManager accessibles via Ingress
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:31:46 +02:00
alkatrazz
e0d233da02 fix: alertmanager — receiver null manquant (Watchdog heartbeat)
Le chart kube-prometheus-stack génère une sous-route pour l'alerte
Watchdog qui référence le receiver "null". Notre config le remplaçait
sans le définir → ReconciliationFailed, StatefulSet jamais créé.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:29:19 +02:00
alkatrazz
d23d464372 fix: monitoring — Ingress Prometheus/AlertManager, paths + pathType requis
Le chart kube-prometheus-stack nécessite paths:[/] et pathType:Prefix
contrairement au sous-chart Grafana qui a des defaults.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:27:01 +02:00
alkatrazz
7fa790c8d3 feat: monitoring — Ingress Prometheus et AlertManager (traefik, lab.local)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:23:31 +02:00
alkatrazz
c9fd0d2812 feat: funk-cluster start --k8s — uncordon + attente ArgoCD
Après funk-stop --k8s, les nœuds reviennent Ready mais SchedulingDisabled
(cordon stocké dans etcd). Sans uncordon, tous les pods restent Pending.

Ajouts dans funk-start --k8s :
- kubectl uncordon sur les nœuds SchedulingDisabled uniquement (idempotent)
- Attente ArgoCD Running (jusqu'à 3 min) — confirme que le GitOps est opérationnel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:22:12 +02:00