Architecture
Architecture Box v1
Composition candidate de la première Box : Framework Desktop sous Linux, Docker Compose, llama-server, Open WebUI, PostgreSQL, Caddy, restic et monitoring, avec un budget mémoire explicite.
Hypothèse#docker#llama-cpp#open-webui#pgvector#qdrant#framework#strix-halo#sauvegarde#monitoringPublié le 16 sept. 2026Mis à jour le 16 sept. 2026Vérifié le 16 sept. 2026À revérifier le 15 déc. 2026
L'essentiel
- La Box v1 est une machine unique (candidate : Framework Desktop, Ryzen AI Max+ 395, 128 Go) sous Linux, sur laquelle tous les services tournent dans Docker Compose.
- Le runtime d'inférence candidat est llama-server (llama.cpp) exposant une API OpenAI-compatible ; l'interface candidate est Open WebUI, qui porte aussi le RAG et les comptes en V1.
- La base vectorielle n'est pas tranchée : PostgreSQL + pgvector (une seule base pour tout) ou Qdrant (filtrage par permissions intégré à l'index). C'est la question Q-004.
- La mémoire unifiée de 128 Go est la ressource à budgéter : modèle, KV cache, embeddings et services doivent tenir avec une marge. Le tableau ci-dessous donne des ordres de grandeur, tous marqués comme estimations à mesurer.
- Tout ce qui suit est une hypothèse de travail : elle sert à écrire le POC, pas à figer le produit.
Composition candidate
| Brique | Candidat v1 | Alternative envisagée | Pourquoi ce candidat | Statut |
|---|---|---|---|---|
| Machine | Framework Desktop 128 Go | Mini-PC Strix Halo concurrents (Beelink, GMKtec, HP Z2 Mini G1a) | Constructeur qui documente Linux, pièces standard, châssis silencieux d'après les tests lus | hypothèse (ADR-002) |
| OS | Linux, distribution à choisir (Ubuntu LTS ou Fedora) | Autre distribution avec noyau récent | Support officiel AMD des noyaux récents pour Strix Halo | Linux confirmé (ADR-001), distribution ouverte (Q-007) |
| Orchestration | Docker Compose | Podman + quadlets, installation native | Reproductible, largement documenté, un fichier | hypothèse |
| Runtime LLM | llama-server, backend Vulkan (RADV) ou ROCm | vLLM, Ollama, Lemonade | Support communautaire le plus large sur Strix Halo, slots multi-utilisateurs, API OpenAI | hypothèse (ADR-004, Q-002, Q-008) |
| Interface | Open WebUI | LibreChat, Onyx, AnythingLLM | RAG intégré, groupes, SSO OIDC, recherche hybride, licence BSD-3 modifiée avec exemption sous 50 utilisateurs | hypothèse (ADR-005, Q-005) |
| Base applicative | PostgreSQL | SQLite (défaut Open WebUI) | Sauvegardes propres, requêtes d'audit, même moteur que pgvector | hypothèse |
| Base vectorielle | PostgreSQL + pgvector ou Qdrant | Milvus, Weaviate, LanceDB | Les deux sont supportés par Open WebUI ; le choix dépend du filtrage par permissions | question ouverte (Q-004) |
| Embeddings | bge-m3 ou multilingual-e5-large | Qwen3-Embedding | Multilingues, licence MIT, dimension 1024 | à tester |
| Reranker | bge-reranker-v2-m3 | Qwen3-Reranker | Multilingue, Apache 2.0, léger | à tester |
| Reverse proxy | Caddy | Traefik, Nginx Proxy Manager | TLS automatique, configuration minimale | hypothèse |
| Identité | Comptes locaux Open WebUI en V1 | Authentik ou Keycloak dès la V1 si le client a un annuaire | Moins de services à opérer pour un POC | hypothèse |
| Sauvegardes | restic (chiffré, dédupliqué) vers disque externe ou NAS | borgbackup, snapshots ZFS/Btrfs envoyés hors machine | Chiffrement natif, restauration simple, dépôt distant possible | hypothèse |
| Monitoring | Prometheus + Grafana ou Netdata | Uptime Kuma seul | Netdata suffit pour un POC ; Prometheus/Grafana pour un parc | à évaluer |
Schéma de déploiement Docker Compose
Services
| Service | Image (à figer) | Rôle | Port | Réseau | Volumes | Secrets |
|---|---|---|---|---|---|---|
caddy | caddy officiel | TLS, reverse proxy, en-têtes de sécurité, limitation de débit | 443 (et 80 pour la redirection) exposés sur le LAN | front | caddy-data (certificats), Caddyfile | clé API du fournisseur DNS si challenge DNS |
open-webui | ghcr.io/open-webui/open-webui | Interface, comptes, groupes, knowledge bases, orchestration RAG | 8080 interne uniquement | front + back | open-webui-data (uploads, cache), documents en lecture seule | WEBUI_SECRET_KEY, mot de passe PostgreSQL, secret client OIDC |
llama-server | image llama.cpp avec backend Vulkan ou ROCm, ou build local | Modèle de chat, N slots, API /v1/chat/completions | 8081 interne | back | models (GGUF) en lecture seule | clé API interne optionnelle |
llama-embed | idem | Embeddings et reranking (/v1/embeddings, /rerank) | 8082 interne | back | models | aucune |
postgres | postgres officiel + extension pgvector | Base applicative d'Open WebUI et, si retenu, index vectoriel | 5432 interne | back | postgres-data | mot de passe superutilisateur |
qdrant (optionnel) | qdrant officiel | Index vectoriel avec filtrage payload par tenant | 6333 interne | back | qdrant-data | clé API Qdrant |
authentik (V2) | authentik server + worker + redis | IdP OIDC, MFA, groupes | via Caddy | front + back | authentik-media, base PostgreSQL dédiée | clé secrète, mot de passe base |
netdata ou prometheus + grafana + node-exporter | images officielles | Métriques hôte, GPU, conteneurs, latence | via Caddy (accès admin seulement) | ops | prometheus-data, grafana-data | mot de passe admin Grafana |
restic | tâche planifiée sur l'hôte (systemd timer) plutôt qu'un conteneur | Dump PostgreSQL + volumes vers dépôt chiffré | aucun | hors Docker | accès en lecture aux volumes | mot de passe du dépôt restic |
Règles de configuration :
- Ports : seul
caddypublie des ports sur l'hôte. Tous les autres services sont joignables uniquement par nom sur un réseau Docker interne. Undocker psne doit montrer aucun autre port publié. - Accès GPU : les conteneurs d'inférence reçoivent les périphériques
/dev/dri(Vulkan) et, si ROCm,/dev/kfd, ainsi que les groupesvideoetrender. Aucun autre conteneur n'a accès au GPU. - Volumes : les modèles GGUF sont montés en lecture seule ; les documents sources sont montés en lecture seule ; les données applicatives vivent dans des volumes nommés, tous inclus dans la sauvegarde.
- Secrets : jamais en clair dans
compose.yaml. Fichier.enven permissions 600 ou secrets Docker ; clés générées à l'installation et consignées dans le coffre du prestataire, pas dans le dépôt Git. - Versions : chaque image est figée sur un tag précis et le fichier Compose est versionné. Les mises à jour se font par changement de tag, test, puis redéploiement.
- Redémarrage :
restart: unless-stoppedpartout ; l'ordre de démarrage est garanti pardepends_onavec conditions de santé (healthcheck) sur PostgreSQL et llama-server. - Réglage mémoire GPU : la part de mémoire unifiée allouable au GPU dépend de la réservation BIOS et des paramètres GTT/TTM du noyau. La documentation AMD recommande de garder la réservation BIOS petite et d'augmenter la limite partagée. La valeur pratique atteignable reste à mesurer sur la machine (Q-011).
Allocation mémoire cible
La machine dispose de 128 Go de mémoire unifiée partagée entre le CPU et le GPU. Le tableau suivant budgète cette mémoire pour un scénario de référence : modèle de chat gpt-oss-120b, quatre slots de 32 000 tokens chacun, embeddings et reranker chargés, base vectorielle pgvector.
| Poste | Hypothèse | Ordre de grandeur | Origine |
|---|---|---|---|
| Système d'exploitation, noyau, cache | Distribution serveur sans bureau | 4 à 6 Go | Estimation |
| Poids du modèle de chat | gpt-oss-120b en MXFP4 (GGUF) | ≈ 60 Go | Estimation à partir des tailles de fichiers publiées, voir fiche modèle |
| KV cache du chat | 4 slots × 32k tokens = 128k tokens, f16 ; gpt-oss-120b a un cache par token très faible (attention groupée, moitié des couches en fenêtre glissante) | ≈ 10 Go (borne haute) | Estimation calcul, à mesurer |
| Tampons de calcul, flash attention | Dépend du backend et de la taille de batch | 2 à 6 Go | Estimation |
| Modèle d'embedding | bge-m3 ou multilingual-e5-large (≈ 0,6 milliard de paramètres) | 1 à 2 Go | Estimation |
| Reranker | bge-reranker-v2-m3 | 1 à 2 Go | Estimation |
| Open WebUI, PostgreSQL, pgvector | Index de quelques dizaines de milliers de passages | 2 à 4 Go | Estimation |
| Caddy, monitoring, IdP | Services légers | 1 à 2 Go | Estimation |
| Total engagé | ≈ 80 à 90 Go | Estimation | |
| Marge | Cache de fichiers, pics d'ingestion, second modèle | ≈ 40 Go | Estimation |
Points d'attention :
- Le modèle change tout. Un modèle dense de 70 milliards de paramètres en Q4 pèse plus de 40 Go et son KV cache est bien plus lourd par token (de l'ordre de 10 Go pour 32k tokens f16 selon les calculs de la recherche inférence, donc environ 40 Go pour quatre slots de 32k). Il consommerait toute la marge et serait par ailleurs lent en génération, car limité par la bande passante mémoire. Les architectures MoE à faible nombre de paramètres actifs sont plus adaptées à cette machine. Voir Inférence et Multi-utilisateurs.
- Le KV cache se quantifie. Passer le cache en q8_0 divise son empreinte par deux, au prix d'une perte de qualité à mesurer.
- Le nombre de slots est un choix. Quatre slots couvrent l'hypothèse « 1 à 3 utilisateurs actifs simultanément » avec une réserve. Le débit par utilisateur baisse quand les slots sont occupés en même temps (voir la question Q-001).
- La limite GPU n'est pas 128 Go. Selon les réglages, la part allouable au GPU rapportée par la communauté se situe entre 96 et 120 Go environ ; la valeur exacte sur notre machine reste à mesurer (Q-011).
Points de choix et alternatives
| Point de choix | Option A | Option B | Critère de décision | Question |
|---|---|---|---|---|
| Base vectorielle | pgvector : une seule base, sauvegardes simples, filtrage SQL classique ; le filtrage après index HNSW peut dégrader le rappel quand le filtre est sélectif | Qdrant : filtrage intégré à l'index, mode multi-tenant, service de plus à opérer | Fiabilité du filtrage par groupes sur un corpus test, avec mesure du rappel | Q-004 |
| Backend GPU | Vulkan (RADV) : recommandé par la communauté pour la stabilité et la génération | ROCm : meilleur sur les longs prompts selon plusieurs mesures, support officiel gfx1151 depuis ROCm 10.0 | Stabilité sur 48 h de charge, débit de génération et de traitement du prompt | Q-008 |
| Interface | Open WebUI : tout intégré, plus simple | LibreChat : ACL par ressource plus fines, RAG en service séparé | Suffisance du modèle de permissions d'Open WebUI pour le cas avocats | Q-005 |
| Identité en V1 | Comptes locaux : rien à installer de plus | Authentik dès le départ : MFA, groupes, base saine pour la V2 | Existence d'un annuaire chez le client, appétence pour le MFA | à ouvrir |
| Stockage des documents | Copie dans la Box (uploads Open WebUI) | Partage SMB ou Nextcloud existant, indexé en place | Source de vérité des droits d'accès | à ouvrir |
| Distribution Linux | Ubuntu LTS : support ROCm officiel, documentation abondante | Fedora : noyau récent, correctifs Strix Halo plus tôt | Stabilité des pilotes, facilité de mise à jour | Q-007 |
| Sauvegarde | restic vers disque USB chiffré sur site | restic vers NAS ou site distant via VPN | Exigence de RPO/RTO du client, règle 3-2-1 | voir Sauvegardes |
| Monitoring | Netdata : zéro configuration | Prometheus + Grafana : alertes, historique, multi-Box | Nombre de Box à superviser | voir Monitoring |
Ce qu'il reste à tester
- Évaluer vLLM sur ROCm gfx1151En septembre 2026, l'image officielle vllm/vllm-openai-rocm démarre sur gfx1151 avec ROCm 7.x sans patch, sert un MoE de taille moyenne, et donne un TTFT p95 inférieur à celui de llama-server à 5 clients ; mais elle ne sert pas gpt-oss-120b en MXFP4 sans conversion, et réserve plus de mémoire que llama-server pour un même contexte.À tester
- Scan de vulnérabilités des images Docker de la BoxLes images officielles de la pile retenue ne contiennent aucune vulnérabilité critique exploitable dans le contexte de la Box (services non exposés, réseau interne), et un scan mensuel automatisé avec Trivy plus un SBOM par image permettent de suivre les correctifs sans effort excessif.À tester
- Valider l'installation reproductibleUne personne compétente en administration Linux mais sans connaissance préalable du projet réinstalle la Box en moins d'une demi-journée à partir de la page Installation et du dépôt de configuration, et obtient le même résultat à la checklist de validation que l'installation initiale.À tester