Aller au contenu
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

BriqueCandidat v1Alternative envisagéePourquoi ce candidatStatut
MachineFramework Desktop 128 GoMini-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 lushypothèse (ADR-002)
OSLinux, distribution à choisir (Ubuntu LTS ou Fedora)Autre distribution avec noyau récentSupport officiel AMD des noyaux récents pour Strix HaloLinux confirmé (ADR-001), distribution ouverte (Q-007)
OrchestrationDocker ComposePodman + quadlets, installation nativeReproductible, largement documenté, un fichierhypothèse
Runtime LLMllama-server, backend Vulkan (RADV) ou ROCmvLLM, Ollama, LemonadeSupport communautaire le plus large sur Strix Halo, slots multi-utilisateurs, API OpenAIhypothèse (ADR-004, Q-002, Q-008)
InterfaceOpen WebUILibreChat, Onyx, AnythingLLMRAG intégré, groupes, SSO OIDC, recherche hybride, licence BSD-3 modifiée avec exemption sous 50 utilisateurshypothèse (ADR-005, Q-005)
Base applicativePostgreSQLSQLite (défaut Open WebUI)Sauvegardes propres, requêtes d'audit, même moteur que pgvectorhypothèse
Base vectoriellePostgreSQL + pgvector ou QdrantMilvus, Weaviate, LanceDBLes deux sont supportés par Open WebUI ; le choix dépend du filtrage par permissionsquestion ouverte (Q-004)
Embeddingsbge-m3 ou multilingual-e5-largeQwen3-EmbeddingMultilingues, licence MIT, dimension 1024à tester
Rerankerbge-reranker-v2-m3Qwen3-RerankerMultilingue, Apache 2.0, légerà tester
Reverse proxyCaddyTraefik, Nginx Proxy ManagerTLS automatique, configuration minimalehypothèse
IdentitéComptes locaux Open WebUI en V1Authentik ou Keycloak dès la V1 si le client a un annuaireMoins de services à opérer pour un POChypothèse
Sauvegardesrestic (chiffré, dédupliqué) vers disque externe ou NASborgbackup, snapshots ZFS/Btrfs envoyés hors machineChiffrement natif, restauration simple, dépôt distant possiblehypothèse
MonitoringPrometheus + Grafana ou NetdataUptime Kuma seulNetdata suffit pour un POC ; Prometheus/Grafana pour un parcà évaluer

Schéma de déploiement Docker Compose

Services

ServiceImage (à figer)RôlePortRéseauVolumesSecrets
caddycaddy officielTLS, reverse proxy, en-têtes de sécurité, limitation de débit443 (et 80 pour la redirection) exposés sur le LANfrontcaddy-data (certificats), Caddyfileclé API du fournisseur DNS si challenge DNS
open-webuighcr.io/open-webui/open-webuiInterface, comptes, groupes, knowledge bases, orchestration RAG8080 interne uniquementfront + backopen-webui-data (uploads, cache), documents en lecture seuleWEBUI_SECRET_KEY, mot de passe PostgreSQL, secret client OIDC
llama-serverimage llama.cpp avec backend Vulkan ou ROCm, ou build localModèle de chat, N slots, API /v1/chat/completions8081 internebackmodels (GGUF) en lecture seuleclé API interne optionnelle
llama-embedidemEmbeddings et reranking (/v1/embeddings, /rerank)8082 internebackmodelsaucune
postgrespostgres officiel + extension pgvectorBase applicative d'Open WebUI et, si retenu, index vectoriel5432 internebackpostgres-datamot de passe superutilisateur
qdrant (optionnel)qdrant officielIndex vectoriel avec filtrage payload par tenant6333 internebackqdrant-dataclé API Qdrant
authentik (V2)authentik server + worker + redisIdP OIDC, MFA, groupesvia Caddyfront + backauthentik-media, base PostgreSQL dédiéeclé secrète, mot de passe base
netdata ou prometheus + grafana + node-exporterimages officiellesMétriques hôte, GPU, conteneurs, latencevia Caddy (accès admin seulement)opsprometheus-data, grafana-datamot de passe admin Grafana
restictâche planifiée sur l'hôte (systemd timer) plutôt qu'un conteneurDump PostgreSQL + volumes vers dépôt chiffréaucunhors Dockeraccès en lecture aux volumesmot de passe du dépôt restic

Règles de configuration :

  • Ports : seul caddy publie des ports sur l'hôte. Tous les autres services sont joignables uniquement par nom sur un réseau Docker interne. Un docker ps ne 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 groupes video et render. 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 .env en 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-stopped partout ; l'ordre de démarrage est garanti par depends_on avec 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.

PosteHypothèseOrdre de grandeurOrigine
Système d'exploitation, noyau, cacheDistribution serveur sans bureau4 à 6 GoEstimation
Poids du modèle de chatgpt-oss-120b en MXFP4 (GGUF)≈ 60 GoEstimation à partir des tailles de fichiers publiées, voir fiche modèle
KV cache du chat4 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 attentionDépend du backend et de la taille de batch2 à 6 GoEstimation
Modèle d'embeddingbge-m3 ou multilingual-e5-large (≈ 0,6 milliard de paramètres)1 à 2 GoEstimation
Rerankerbge-reranker-v2-m31 à 2 GoEstimation
Open WebUI, PostgreSQL, pgvectorIndex de quelques dizaines de milliers de passages2 à 4 GoEstimation
Caddy, monitoring, IdPServices légers1 à 2 GoEstimation
Total engagé≈ 80 à 90 GoEstimation
MargeCache de fichiers, pics d'ingestion, second modèle≈ 40 GoEstimation

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 choixOption AOption BCritère de décisionQuestion
Base vectoriellepgvector : une seule base, sauvegardes simples, filtrage SQL classique ; le filtrage après index HNSW peut dégrader le rappel quand le filtre est sélectifQdrant : filtrage intégré à l'index, mode multi-tenant, service de plus à opérerFiabilité du filtrage par groupes sur un corpus test, avec mesure du rappelQ-004
Backend GPUVulkan (RADV) : recommandé par la communauté pour la stabilité et la générationROCm : meilleur sur les longs prompts selon plusieurs mesures, support officiel gfx1151 depuis ROCm 10.0Stabilité sur 48 h de charge, débit de génération et de traitement du promptQ-008
InterfaceOpen WebUI : tout intégré, plus simpleLibreChat : ACL par ressource plus fines, RAG en service séparéSuffisance du modèle de permissions d'Open WebUI pour le cas avocatsQ-005
Identité en V1Comptes locaux : rien à installer de plusAuthentik dès le départ : MFA, groupes, base saine pour la V2Existence d'un annuaire chez le client, appétence pour le MFAà ouvrir
Stockage des documentsCopie dans la Box (uploads Open WebUI)Partage SMB ou Nextcloud existant, indexé en placeSource de vérité des droits d'accèsà ouvrir
Distribution LinuxUbuntu LTS : support ROCm officiel, documentation abondanteFedora : noyau récent, correctifs Strix Halo plus tôtStabilité des pilotes, facilité de mise à jourQ-007
Sauvegarderestic vers disque USB chiffré sur siterestic vers NAS ou site distant via VPNExigence de RPO/RTO du client, règle 3-2-1voir Sauvegardes
MonitoringNetdata : zéro configurationPrometheus + Grafana : alertes, historique, multi-BoxNombre de Box à superviservoir Monitoring

Ce qu'il reste à tester

content/docs/architecture/box-v1.md2046 mots