Funk-lab/README.md

192 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Funk Lab
> Homelab IA — Kubernetes (Talos) + GPU AMD + Agent autonome (Hermes)
<!-- Si tu as une image du rack/setup, ajoute-la ici :
![Funk Lab](docs/funk-lab.jpg)
-->
## 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 ]
┌────────────────┐
│ storage-01 │ AlmaLinux 9.7
│ 192.168.10.1 │ Gateway + NAT + DNS
│ │ NFS RAID5 · PostgreSQL
│ │ Qdrant · LiteLLM · Hermes
└───────┬────────┘
│ LAN cluster (192.168.10.0/24)
┌───────────┼───────────┐
│ │ │
[ compute-01 ] [ compute-02 ] [ compute-03 ] Talos Linux
192.168.10.11 192.168.10.12 192.168.10.13 Kubernetes
control-plane worker worker
┌───────────┘
[ gpu-01 ] AlmaLinux 9.7
192.168.10.20 llama-server (ROCm)
AMD RX 6700XT 12GB
```
---
## Stack IA
```
Hermes Agent → LiteLLM :4000 → Qwen3-8B (local, gpu-01)
→ Claude Sonnet / Opus (API Anthropic)
Hermes ←→ Qdrant :6333 (mémoire vectorielle sémantique)
```
| Composant | Rôle | Hôte |
|---|---|---|
| **llama-server** | Inférence LLM + embeddings (ROCm 7.x) | gpu-01 |
| **LiteLLM** | Proxy API — switch local/cloud transparent | storage-01 |
| **Hermes Agent** | Agent IA autonome avec mémoire vectorielle | storage-01 |
| **Qdrant** | Base vectorielle pour la mémoire sémantique | storage-01 |
| **PostgreSQL 16** | Persistance Hermes + LiteLLM | storage-01 |
---
## 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.10+ | 16 GB | k8s control-plane |
| compute-02 | 192.168.10.12 | Talos v1.10+ | 8 GB | k8s worker |
| compute-03 | 192.168.10.13 | Talos v1.10+ | 8 GB | k8s worker |
### Stockage
- RAID5 logiciel (`md0`) — 4 × 1 TB SATA → **2,7 TB** utiles sur storage-01
- 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 multi-modèles
│ ├── hermes_agent # Agent IA autonome
│ ├── postgresql # Base de données
│ └── qdrant # Base vectorielle
├── talos/ # Cluster Kubernetes (talhelper) [à venir]
└── k8s/ # Workloads ArgoCD [à venir]
```
---
## Démarrage rapide
### Pré-requis
```bash
pip install ansible
ansible-galaxy collection install ansible.posix community.general community.postgresql
```
### Déployer storage-01
```bash
cd ansible/
ansible-playbook -i inventory.yml playbooks/storage-01.yml
```
### Déployer gpu-01
```bash
ansible-playbook -i inventory.yml playbooks/gpu-01.yml
```
### Déployer un rôle spécifique
```bash
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
```bash
funk-start # Allume gpu-01 (WOL) + démarre tous les services
funk-stop # Arrêt propre
funk-status # État de tous les services (13 checks)
```
---
## Secrets
Les secrets sont gérés via **Ansible Vault** (chiffrement AES256).
```bash
# 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`.
---
## 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
- [x] Ansible — storage-01 (gateway, NFS, PostgreSQL, Qdrant, LiteLLM, Hermes)
- [x] Ansible — gpu-01 (ROCm, llama-server, embeddings)
- [x] Stack IA opérationnelle (Hermes + Qwen3-8B + mémoire vectorielle)
- [ ] Route statique Freebox
- [ ] Bootstrap cluster Kubernetes (Talos + talhelper)
- [ ] ArgoCD + MetalLB + Traefik
- [ ] Workloads IA en k8s (Open WebUI, n8n, monitoring)
- [ ] Rôle MinIO