* feat(stt): auto-start via `stt --install-service` (phase 6) Ajoute `stt --install-service` / `--uninstall-service` : génère et active un service systemd --user (lié à graphical-session.target) qui lance le HUD + voix à l'ouverture de session. Le kiosk existant (ui.kiosk) fournit l'« écran Jarvis ». - cli : _service_unit (génération du unit, fonction pure testable), _cmd_install_service (écrit le unit + import-environment DISPLAY/WAYLAND + daemon-reload/enable/start), _cmd_uninstall_service. - Docs : admin/ia/stt.md (phase 6 → ✅, section Auto-start + caveat DISPLAY), stt/README. - Bump client 0.2.1 → 0.3.0. Phase 6 de la roadmap STT. Reste : test sur poste, outils Hermes (7). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa * feat(stt): app de bureau (fenêtre type Discord) + auto-update Rend STT lançable comme une application de bureau et ajoute la mise à jour intégrée. - Mode fenêtre « app » : _open_browser ouvre le HUD en fenêtre chromeless (--app=, type Discord) en plus du kiosk plein écran ; support Brave ajouté. Sélection via --window {app,kiosk,none} ou [ui].window_mode. - stt --install-desktop / --uninstall-desktop : entrée .desktop + icône (stt/hud/icon.svg, aussi favicon du HUD) → STT dans le menu/dock, lance --window app. - stt --update : pipx reinstall depuis la source git (via clé SSH), affiche « ancienne → nouvelle » ; stt --version. - Docs (admin/ia/stt.md, stt/README) + config (window_mode) + bump 0.3.0 → 0.4.0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa * fix(stt): détection navigateur cross-distro (AlmaLinux/Fedora + Debian/Ubuntu) _open_browser tente les binaires natifs (rpm + deb : brave-browser / chromium / chromium-browser / google-chrome…) puis Flatpak (com.brave.Browser, org.chromium.Chromium, com.google.Chrome…), sinon repli sur le navigateur par défaut. systemd --user, lanceurs .desktop et pipx sont déjà identiques sur les deux familles. Doc : note de compatibilité distros. Bump 0.4.0 → 0.4.1. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa * docs(stt): journal 2026-06-18 + PROGRESS + ligne STT du CLAUDE.md - progress/2026-06-18.md : HUD avancé, auto-start, app de bureau, auto-update, cross-distro - PROGRESS.md : entrée du jour - CLAUDE.md : ligne STT enrichie (HUD, auto-start, app de bureau, auto-update) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa * feat(stt): fenêtre app autonome (profil + WM class dédiés, hors session Brave) Le mode app s'attachait à la session Brave de l'utilisateur (même profil/icône) → « ça sent le Brave ». On lance désormais une instance séparée : --class=STT-Funk + --user-data-dir dédié (~/.local/share/stt/app-profile), et le .desktop déclare StartupWMClass=STT-Funk → fenêtre autonome avec sa propre icône de barre des tâches. (Flatpak : --class seul, sandbox.) Une vraie fenêtre native (pywebview) reste une option ultérieure. Bump 0.4.1 → 0.4.2. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|---|---|---|
| .github/workflows | ||
| admin | ||
| ansible | ||
| archive | ||
| docs | ||
| hermes-skills | ||
| k8s | ||
| progress | ||
| stt | ||
| talos | ||
| tools | ||
| .gitignore | ||
| .sops.yaml | ||
| CLAUDE.md | ||
| LICENSE | ||
| Makefile | ||
| PROGRESS.md | ||
| README.md | ||
| requirements.txt | ||
Funk Lab
Homelab IA — Kubernetes (Talos) + GPU AMD + Agent autonome (Hermes)
Vue d'ensemble
Funk est un homelab orienté IA composé de 5 machines physiques :
- un nœud de stockage/passerelle qui héberge tous les services de données et l'agent IA
- un nœud GPU dédié à l'inférence LLM local (AMD RX 6700XT)
- trois nœuds qui forment un cluster Kubernetes (Talos Linux)
L'ensemble est géré en Infrastructure-as-Code : Ansible pour les hôtes AlmaLinux, talhelper pour Talos, ArgoCD pour les workloads Kubernetes.
Architecture
Internet
│
[ Freebox ] 192.168.1.254
│ port 1 · VLAN 1
┌───────────────┴────────────────────────────┐
│ Switch Netgear GS308EV4 │ 8 ports Gigabit · managé Plus
│ 8 ports Access (sans trunk) │ VLAN 1 (Default) + VLAN 10 (cluster-funk)
└───┬───┬─────────────────────────────┬───────┘
VLAN 1 │ │ VLAN 10 │ ports 3-6 · VLAN 10 (cluster 192.168.10.0/24)
enp4s0 │ │ enp6s0f3u2c2 ┌──────────┴───────────────────────┐
(port 2) │ │ (port 7) │ │
┌──┴───┴──┐ [ compute-01 ] [ compute-02 ] [ compute-03 ] [ gpu-01 ]
│storage-01│ 192.168.10.11 192.168.10.12 192.168.10.13 192.168.10.20
│AlmaLinux │ control-plane worker worker llama-server
│Gateway· │ Talos Linux · Kubernetes AMD RX 6700XT
│NAT·DNS· │
│NFS·PG· │
│Qdrant· │
│LiteLLM· │
│Hermes │
└──────────┘
Câblage du switch (Netgear GS308EV4) — tous les ports en mode Access (pas de trunk). storage-01 utilise deux NIC physiques, une par VLAN (pas de sous-interface taguée) :
| Port | Connecté à | IP | VLAN |
|---|---|---|---|
| 1 | Freebox | — | 1 · Default |
| 2 | storage-01 — NIC1 enp4s0 (WAN) |
192.168.1.200 |
1 · Default |
| 3 | gpu-01 | 192.168.10.20 |
10 · cluster-funk |
| 4 | compute-01 (control-plane) | 192.168.10.11 |
10 · cluster-funk |
| 5 | compute-02 (worker) | 192.168.10.12 |
10 · cluster-funk |
| 6 | compute-03 (worker) | 192.168.10.13 |
10 · cluster-funk |
| 7 | storage-01 — NIC2 enp6s0f3u2c2 (LAN cluster) |
192.168.10.1 |
10 · cluster-funk |
| 8 | PC perso (poste admin) | 192.168.1.x |
1 · Default |
storage-01 fait passerelle / NAT entre la VLAN 1 (LAN domestique
192.168.1.0/24, côté Freebox) et la VLAN 10 (cluster192.168.10.0/24).
Stack IA
┌─────────────────────────────────────┐
│ Hermes Agent (storage-01) │
│ │
│ profil funk-ai (Qwen3-8B GPU) │
│ │ ask-agent system/monitor │
│ ▼ │
│ profil system (Qwen3-1.7B CPU) │
│ profil monitor (Qwen3-1.7B CPU) │
│ profil brain (Claude Sonnet API) │
└──────────────┬──────────────────────┘
│
LiteLLM Proxy :4000
│
┌────────────────────┼────────────────────┐
│ │ │
qwen3-8b GPU qwen3-1.7b CPU Claude API
gpu-01 :1234 :1236 system / :1237 monitor Anthropic
| Composant | Rôle | Hôte |
|---|---|---|
| llama-server (×4) | Inférence GPU (:1234) + 2× CPU isolés (:1236/:1237) + embeddings dédiés nomic-embed-text (:1238) — ROCm 7.x | gpu-01 |
| LiteLLM | Proxy API — routing local/cloud transparent | storage-01 |
| Hermes Agent | Agent IA multi-profils avec mémoire vectorielle | storage-01 |
| ask-agent | Délégation inter-agents (system / monitor / brain) | storage-01 |
| STT | Assistant vocal « Jarvis » — client stt (poste) + STT-server in-cluster |
k8s (ai) |
| Qdrant | Base vectorielle — RAG (funk-docs) + mémoire STT (stt-memory) |
storage-01 |
| PostgreSQL 16 | Persistance Hermes, LiteLLM, n8n, Open WebUI, Ghostfolio | storage-01 |
Profils Hermes
| Profil | Modèle | Usage |
|---|---|---|
funk-ai |
Qwen3-8B GPU (~35 tok/s) | Agent principal — par défaut |
system |
Qwen3-1.7B CPU (~21 tok/s) | Calculs rapides, formatage, résumés |
monitor |
Qwen3-1.7B CPU (~21 tok/s) | Analyse logs, métriques, santé système |
brain |
Claude Sonnet 4.6 (API) | Raisonnement complexe, architecture |
Infrastructure
Machines
| Machine | IP | OS | RAM | Rôle |
|---|---|---|---|---|
| storage-01 | 192.168.10.1 | AlmaLinux 9.7 | 32 GB | Gateway · NFS · Services IA |
| gpu-01 | 192.168.10.20 | AlmaLinux 9.7 | 32 GB | Inférence LLM (RX 6700XT) |
| compute-01 | 192.168.10.11 | Talos v1.13 | 16 GB | k8s control-plane |
| compute-02 | 192.168.10.12 | Talos v1.13 | 8 GB | k8s worker |
| compute-03 | 192.168.10.13 | Talos v1.13 | 8 GB | k8s worker |
Stockage
- NVMe système (
/home/data, ~845 GB XFS) — bind-monté sur/srv/datadepuis 2026-05-29 - RAID5 logiciel (
md0) — 4 × 1 TB SATA, actif mais plus monté (sdb ATA errors + sdd retiré) - Point de montage
/srv/data— héberge modèles LLM, bases de données, données Hermes
Organisation du repo
├── ansible/ # Gestion storage-01 + gpu-01 (AlmaLinux)
│ ├── inventory.yml
│ ├── playbooks/
│ │ ├── storage-01.yml
│ │ └── gpu-01.yml
│ ├── group_vars/ # Variables globales + vault chiffré
│ ├── host_vars/ # Variables par machine
│ └── roles/
│ ├── common # Paquets, sécurité, NTP
│ ├── gateway # nftables + NAT
│ ├── dnsmasq # DNS local (lab.local)
│ ├── nfs_server # Exports NFS (modèles, k8s)
│ ├── nfs_client # Montages NFS sur gpu-01
│ ├── rocm # Stack GPU AMD (ROCm 7.x)
│ ├── llama_server # Inférence LLM + embeddings
│ ├── litellm # Proxy LLM + script ask-agent
│ ├── hermes_agent # Agent IA autonome
│ ├── hermes_user # User hermes + SSH partagé entre hosts
│ ├── rag # RAG : scripts rag-ingest/rag-query + skill Hermes
│ ├── alertmanager_webhook # Pont AlertManager → ask-agent
│ ├── postfix_relay # SMTP sortant via Gmail
│ ├── node_exporter # Métriques Prometheus
│ ├── minio # ⚠️ placeholder vide — service non déployé
│ ├── postgresql # Base de données
│ ├── qdrant # Base vectorielle
│ └── hermes_auto_improve # Worker analyse doc + trigger server :9095
├── hermes-skills/ # Skills Hermes versionnés
│ ├── funk/
│ │ ├── agent-delegation/ # Délégation ask-agent (system/monitor/brain)
│ │ └── rag-docs/ # Usage de rag-query
│ └── souls/ # Prompts système par profil (funk-ai, system, monitor, brain)
├── tools/ # Sources des outils déployés
│ ├── hermes-auto-improve/ # auto-improve.py + trigger-server.py
│ └── hermes-voice/ # Client vocal Hermes (CLI faster-whisper + Piper)
├── stt/ # Assistant vocal « Jarvis » — client `stt` (pipx) + STT-server (conteneur)
├── admin/ # Base de connaissance (indexée dans le RAG)
├── progress/ # Journaux de session (référencés par PROGRESS.md)
├── archive/ # Documents historiques obsolètes (conception d'origine) — ne fait pas foi
├── talos/ # Cluster Kubernetes (talhelper)
└── k8s/ # Workloads ArgoCD
├── infra/ # monitoring, nfs-provisioner (Traefik + MetalLB via helm au bootstrap)
└── apps/ # Open WebUI, n8n, STT, Ghostfolio, external-services
Démarrage rapide
Pré-requis
pip install ansible
ansible-galaxy collection install ansible.posix community.general community.postgresql
Déployer storage-01
cd ansible/
ansible-playbook -i inventory.yml playbooks/storage-01.yml
Déployer gpu-01
ansible-playbook -i inventory.yml playbooks/gpu-01.yml
Déployer un rôle spécifique
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags litellm
ansible-playbook -i inventory.yml playbooks/gpu-01.yml --tags llama_server
Gestion du cluster
funk-start # Allume gpu-01 (WOL) + démarre tous les services
funk-start --k8s # Idem + démarre les nœuds k8s
funk-stop # Arrêt propre
funk-stop --k8s # Arrêt propre + éteint k8s avant
funk-status # État de tous les services (13 checks)
Détail complet des procédures : admin/ops/cluster.md
Secrets
Les secrets sont gérés via Ansible Vault (chiffrement AES256).
# Chiffrer le vault
ansible-vault encrypt ansible/group_vars/all/vault.yml
# Editer les secrets
ansible-vault edit ansible/group_vars/all/vault.yml
Variables stockées dans le vault : vault_anthropic_api_key, vault_pg_hermes_password, vault_pg_litellm_password, vault_pg_n8n_password, vault_pg_openwebui_password, vault_pg_ghostfolio_password, vault_postfix_relay_password, vault_n8n_api_key.
Contrainte GPU
La RX 6700XT (gfx1031) n'est pas officiellement supportée par ROCm. La variable suivante est obligatoire dans tous les services GPU :
HSA_OVERRIDE_GFX_VERSION=10.3.0
Elle est gérée automatiquement par le rôle Ansible llama_server.
Roadmap
- Ansible — storage-01 (gateway, NFS, PostgreSQL, Qdrant, LiteLLM, Hermes, postfix, AlertManager webhook)
- Ansible — gpu-01 (ROCm, llama-server : GPU :1234 + embeddings :1238 via le rôle ; 2× CPU manuels)
- Stack IA opérationnelle (Hermes multi-profils + Qwen3 + Claude API)
- Délégation inter-agents (
ask-agent+ skillagent-delegation) - RAG opérationnel — Qdrant 339 chunks,
rag-query/rag-ingest - User
hermesavec SSH partagé entre storage-01 et gpu-01 - Cluster Kubernetes opérationnel (Talos v1.13 + talhelper)
- MetalLB + Traefik + wildcard DNS
lab.local - Monitoring complet (kube-prometheus-stack + AlertManager → Hermes + n8n)
- Open WebUI (
openwebui.lab.local, namespaceai) - n8n (
n8n.lab.local, namespaceai, 3 workflows actifs) - Email sortant — Postfix relay → Gmail SMTP
- hermes-auto-improve — analyse quotidienne de la doc par Hermes (n8n 22h → PR
hermes/daily-work) - Ghostfolio — suivi de portefeuille (
ghostfolio.lab.local, PostgreSQL s01 + Redis) - STT — assistant vocal « Jarvis » (client
stt+ STT-server in-cluster, mémoire Qdrantstt-memory) - Modèle d'embedding dédié — nomic-embed-text sur gpu-01
:1238(utilisé par la mémoire STT) - Réparer Qdrant — crash-loop résolu 2026-06-17 (collection
funk-docssupprimée → à re-ingérer) - Re-ingérer le RAG (
rag-ingest) et le basculer sur l'embedding dédié:1238 - WOL compute nodes (configuration BIOS)
- Route statique Freebox
