Version : 4.15.0 Société : AISIA — Structure juridique en cours de création URL publique : https://aisia.fr/
---
1. Vue d'ensemble du cluster 2. Noeuds du cluster 3. Topologie réseau 4. Stack AISIA (services applicatifs) 5. Stack Core (services fondamentaux) 6. MariaDB 7. Redis 8. Qdrant 9. Prometheus et Grafana 10. Traefik (reverse proxy) 11. Placement et contraintes 12. Connectivité SSH
---
Le cluster AISIA est un ensemble de 21 noeuds physiques organisés en Docker Swarm, hébergeant l'intégralité de la plateforme AISIA en production.
| Aspect | Valeur |
|---|---|
| Noeuds totaux | 21 |
| Raspberry Pi 4 | 12 |
| Serveur toolsbox | 1 |
| NVIDIA Jetson Xavier AGX | 1 |
| Ring-mining | 1 |
| Autres noeuds | 6 (NAS, manager, etc.) |
| Orchestrateur | Docker Swarm |
| Registre privé | 192.168.1.1:5002 |
| Stockage partagé | NAS /mnt/docker/AISIA |
| URL publique | https://aisia.fr/ |
Internet
│
Traefik
│
┌──────┴──────┐
│ aisia_api │ (14 replicas ARM64)
│ (FastAPI) │
└──────┬──────┘
│
┌──────────┬───────┼───────┬──────────┐
│ │ │ │ │
MariaDB Redis Qdrant Ollama Jetson
(Galera) (+replica) (3x RPi) (GPU)
---
| Noeud | IP | Rôle | Specs |
|---|---|---|---|
| freebox-swarm | 192.168.1.1 | Manager Swarm + Registry | ARM64, NAS |
| Noeud | IP | Labels | Usage |
|---|---|---|---|
| raspberrypi01 | 192.168.1.x | worker, ollama | API + Ollama |
| raspberrypi02 | 192.168.1.x | worker, ollama | API + Ollama |
| raspberrypi03 | 192.168.1.x | worker, ollama | API + Ollama |
| raspberrypi04-12 | 192.168.1.x | worker | API replicas |
| Noeud | IP | Rôle | Specs |
|---|---|---|---|
| toolsbox | 192.168.1.240 | Builds, bot, tâches lourdes | 8 vCPU, ~12 Go RAM |
| Noeud | IP | Rôle | Specs |
|---|---|---|---|
| nvidia | 192.168.1.200 | GPU inférence | 512-core Volta, 32 Go RAM, CUDA |
aisia_gpu avec 6 modèles pré-chargés.
| Noeud | IP | Rôle |
|---|---|---|
| ring-mining-1 | 192.168.1.x | Service ring |
aisia_ring.
---
| Réseau | Type | Usage |
|---|---|---|
| ingress | Overlay (Swarm défaut) | Load balancing des services publiés |
| aisia_backend | Overlay | Communication inter-services AISIA |
| aisia-core_backend | Overlay | Communication services core (DB, Redis, Qdrant) |
Internet ←→ Box Free (NAT/Port forwarding)
│
├── 192.168.1.1 (manager/freebox-swarm)
├── 192.168.1.2-13 (RPi workers)
├── 192.168.1.200 (Jetson/nvidia)
├── 192.168.1.240 (toolsbox)
└── 192.168.1.x (NAS, ring-mining, etc.)
| URL | Destination | Méthode |
|---|---|---|
https://aisia.fr/ | Traefik → aisia_api | DNS + Traefik |
https://aisia.fr/chat | Traefik → aisia_api | File provider |
https://aisia.fr/. Les anciennes routes
lambda.freeboxos.fr ont été supprimées.
Les services Swarm sont résolus par leur nom de service :
aisia_api → replicas de l'APIaisia-core_mariadb → MariaDBaisia-core_redis → Redisaisia-core_qdrant → Qdrantaisia_ollama → replicas Ollama
Fichier : deploy/stack-poc-global-reuse.yml
| Attribut | Valeur |
|---|---|
| Image | 192.168.1.1:5002/aisia:v4.15.0 |
| Architecture | ARM64 |
| Replicas | 14 |
| Port | 8000 (interne), exposé via Traefik |
| Health check | GET /health |
| Placement | aisia.role == worker |
| Attribut | Valeur |
|---|---|
| Image | aisia:v4.15.0-amd64 |
| Architecture | AMD64 |
| Replicas | 1 |
| Placement | toolsbox |
| Attribut | Valeur |
|---|---|
| Image | Ollama officielle ARM64 |
| Replicas | 3 |
| Port | 11434 |
| Placement | aisia.ollama == true |
| Volume | /mnt/docker/AISIA/ollama/models |
| Attribut | Valeur |
|---|---|
| Replicas | 1 |
| Placement | aisia.gpu == true (Jetson) |
| Attribut | Valeur |
|---|---|
| Replicas | 1 |
| Placement | ring-mining-1 |
Fichier : deploy/stack-core.yml
| Service | Image | Replicas | Port | Volume |
|---|---|---|---|---|
| mariadb | MariaDB officielle | 1 (ou 3 Galera) | 3306 | NAS /mnt/docker/AISIA/mariadb |
| redis | Redis officielle | 1 + replica | 6379 | NAS /mnt/docker/AISIA/redis |
| qdrant | Qdrant officielle | 1 | 6333, 6334 | NAS /mnt/docker/AISIA/qdrant |
| prometheus | Prometheus officielle | 1 | 9090 | NAS /mnt/docker/AISIA/prometheus |
| grafana | Grafana officielle | 1 | 3000 | NAS /mnt/docker/AISIA/grafana |
| Paramètre | Valeur |
|---|---|
| Base de données | aisia |
| Utilisateur | aisia |
| Secret mot de passe | aisia_db_password (Docker secret) |
| Port | 3306 |
| Moteur | InnoDB |
| Charset | utf8mb4 |
Le préfixe de toutes les tables est aisia_ :
| Table | Description |
|---|---|
aisia_users | Comptes utilisateurs |
aisia_api_keys | Clés API gérées par l'admin |
aisia_conversations | Historique des conversations |
aisia_messages | Messages des conversations |
aisia_ai_rules | Règles guardrails IA |
aisia_local_model_overrides | Surcharges modèles locaux |
aisia_user_profiles | Profils étendus utilisateurs |
aisia_login_history | Historique des connexions |
aisia_groups | Groupes d'utilisateurs |
aisia_group_members | Membres des groupes |
aisia_group_permissions | Permissions des groupes |
aisia_user_consents | Consentements RGPD |
aisia_maintenance_tasks | États des tâches maintenance |
Pour la haute disponibilité, MariaDB peut être déployé en cluster Galera sur 3 noeuds NAS :
Toutes les tables utilisent des DDL idempotents :
CREATE TABLE IF NOT EXISTS aisia_xxx (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Les migrations sont exécutées automatiquement au démarrage de l'API.
AISIA utilise aiomysql pour les connexions asynchrones :
pool = await aiomysql.create_pool(
host=settings.database_host,
port=settings.database_port,
db=settings.database_name,
user=settings.database_user,
password=settings.database_password,
minsize=1,
maxsize=10,
)
Un jitter de 0-15 secondes est ajouté au démarrage pour éviter la surcharge quand les 14 replicas démarrent simultanément.
---
Redis est utilisé comme :
| Composant | Port | Description |
|---|---|---|
| Redis primaire | 6379 | Lecture/écriture |
| Redis replica | 6379 | Lecture seule (haute disponibilité) |
| Pattern | Usage | TTL |
|---|---|---|
aisia:conv:* | Cache conversations | 3600s (1h) |
bandit:* | État bandit router | 86400s (24h) |
cb:* | État circuit breakers | 3600s (1h) |
aisia:billing:* | Compteurs billing | 90 jours |
aisia:bot:status | Statut du bot | variable |
aisia:maintenance:* | Coordination maintenance | variable |
aisia:learning:* | Statut apprentissage | variable |
aisia:ai_rules | Cache guardrails | 300s |
aisia:rl:* | Rate limiting | 3600s/86400s |
oidc:state:* | CSRF states OIDC | 600s |
Si Redis est indisponible :
Qdrant est la base de données vectorielle utilisée pour :
| Collection | Description | Usage |
|---|---|---|
ai_responses | Résultats bruts des appels providers | Historique |
router_embeddings | Décisions de routing | Analyse |
eval_corpus | Datasets d'évaluation | Benchmark |
mtp_knowledge | Base de connaissances distillée | RAG |
mtp_training_pairs | Paires d'entraînement | Learning loop |
| Attribut | Valeur |
|---|---|
| Modèle | all-MiniLM-L6-v2 |
| Dimensions | 384 |
| Distance | Cosinus |
| Backend prioritaire | sentence-transformers |
| Backend fallback | fastembed (ONNX) |
| Port | Usage |
|---|---|
| 6333 | HTTP REST API |
| 6334 | gRPC API |
| Attribut | Valeur |
|---|---|
| Port | 9090 |
| Rétention | 15 jours (défaut) |
| Scrape interval | 15 secondes |
| Fichier config | deploy/prometheus.yml |
/metrics
plus les métriques système des noeuds du cluster.
scrape_configs:
- job_name: 'aisia-api'
dns_sd_configs:
- names: ['tasks.aisia_api']
type: 'A'
port: 8000
metrics_path: '/metrics'
Le fichier deploy/alerts.yml définit les règles d'alerte Prometheus.
| Attribut | Valeur |
|---|---|
| Port | 3000 |
| Datasource | Prometheus |
| Dashboards | 11 pré-configurés |
| Répertoire configs | deploy/grafana/ |
Traefik est configuré en mode file provider (pas de découverte dynamique Docker).
| Fichier | Description |
|---|---|
deploy/traefik.yml | Configuration principale |
deploy/traefik-dynamic.yml | Configuration dynamique (routes, middlewares) |
Après chaque déploiement de aisia_api, les IPs des containers peuvent changer.
Le script de mise à jour régénère le fichier services.yml :
bash deploy/update-traefik-backend.sh
| Route | Service | TLS |
|---|---|---|
https://aisia.fr/* | aisia_api | Oui (Let's Encrypt) |
| Label | Noeuds | Usage |
|---|---|---|
aisia.role=manager | freebox-swarm | Services manager |
aisia.role=worker | RPi01-12 | API replicas |
aisia.role=toolsbox | toolsbox | Bot, builds |
aisia.role=gpu | nvidia | Inférence GPU |
aisia.ollama=true | RPi01-03 | Replicas Ollama |
aisia.gpu=true | nvidia | Service GPU |
aisia.nas=true | Noeuds NAS | MariaDB Galera |
# Appliquer un label
docker node update --label-add aisia.role=worker raspberrypi01
Vérifier les labels
docker node inspect raspberrypi01 --format '{{json .Spec.Labels}}'
Lister tous les noeuds avec labels
docker node ls -q | xargs docker node inspect \
--format '{{.Description.Hostname}} {{json .Spec.Labels}}'
# API sur les workers
deploy:
placement:
constraints:
- node.labels.aisia.role == worker
Bot sur toolsbox
deploy:
placement:
constraints:
- node.labels.aisia.role == toolsbox
GPU sur Jetson
deploy:
placement:
constraints:
- node.labels.aisia.gpu == true
---
#### Sur le LAN (192.168.1.0/24)
# Manager direct
ssh slambert@192.168.1.1
Toolsbox direct
ssh slambert@192.168.1.240
Jetson/NVIDIA direct
ssh slambert@192.168.1.200
#### Hors LAN (défaut -- fonctionne toujours)
# Manager (point d'entrée)
ssh slambert@lambda.freeboxos.fr
Jump vers toolsbox
ssh -J slambert@lambda.freeboxos.fr slambert@192.168.1.240
Jump vers Jetson
ssh -J slambert@lambda.freeboxos.fr slambert@192.168.1.200
Jump vers un worker RPi
ssh -J slambert@lambda.freeboxos.fr slambert@192.168.1.x
Toujours préférer toolsbox (192.168.1.240) pour :
/mnt/docker. Ne jamais utiliser le manager pour les builds
sauf en cas d'urgence.
---
Document AISIA v4.21.0