Aller au contenu
Tutoriels10 août 2026

Installer une IA locale avec Docker, Ollama et Open WebUI sur Fedora

Retour d’expérience : accélération NVIDIA, volumes SELinux, conflit du port 11434 et intégration dans mon Homelab NVSD.

Une intelligence artificielle locale prenant vie au cœur d’un Homelab Docker sur Fedora

En bref

J’ai installé sur mon Acer Predator une stack d’intelligence artificielle entièrement locale composée de Docker, Ollama et Open WebUI. L’inférence est accélérée par une NVIDIA GeForce GTX 1650 de 4 Go, tandis que les modèles, les conversations et la configuration sont conservés sous /srv/homelab.

Cette installation m’a permis de valider un assistant privé pour le code, Docker et le dépannage technique. Elle m’a aussi confronté à deux difficultés très concrètes : les permissions SELinux sur Fedora et un conflit entre Ollama installé sur l’hôte et Ollama exécuté dans Docker.

ÉlémentConfiguration retenue
MachineAcer Predator
SystèmeFedora Silverblue 44 avec KDE Plasma
GPUNVIDIA GeForce GTX 1650 – 4 Go de VRAM
MémoireEnviron 15 Go de RAM
Conteneursollama et open-webui
Interfacehttp://localhost:3000
API Ollamahttp://localhost:11434
Modèles utilisésgemma3:4b et qwen2.5-coder:7b
Données locales/srv/homelab/stacks/ai/ollama/data et /srv/homelab/stacks/open-webui/data

Note de contexte – Cet article documente l’état réellement validé sur ma machine en août 2026. Les commandes restent à adapter si les pilotes NVIDIA, Docker ou les chemins du Homelab sont différents.

Pourquoi intégrer une IA locale au Homelab ?

Mon projet NVSD Homelab s’est construit autour d’une séparation simple :

  • le poste Fedora sert au développement, aux essais et à la validation locale ;
  • le VPS Ubuntu chez Infomaniak héberge les services publics et le site WordPress ;
  • Docker fournit un format commun pour organiser, déplacer et maintenir les services.

L’IA locale trouve naturellement sa place sur le poste Fedora. C’est là que se trouve la carte graphique, et c’est aussi là que je travaille sur mes fichiers Compose, mes applications web et le contenu du Homelab.

Mes objectifs étaient précis :

  • conserver les conversations et les requêtes techniques sur ma machine ;
  • disposer d’un assistant même sans service cloud ;
  • utiliser la même logique Docker que pour mes autres stacks ;
  • expérimenter plusieurs modèles sans modifier directement le système ;
  • connecter ensuite l’IA à mon environnement de développement.

L’objectif n’était pas de reproduire un grand service d’IA en ligne. Avec 4 Go de VRAM, il fallait plutôt construire un système raisonnable, spécialisé et stable.

Architecture finale

J’ai choisi deux conteneurs séparés :

  1. Ollama charge les modèles et expose l’API d’inférence sur le port 11434.
  2. Open WebUI fournit l’interface web sur le port 3000 et communique avec Ollama par le réseau Docker ai.

Le réseau proxy permet d’intégrer Open WebUI à Nginx Proxy Manager si je souhaite lui attribuer plus tard un nom local. L’API Ollama n’a pas besoin d’être exposée publiquement.

Deux services isolés, un réseau privé et des données persistantes : la même logique que pour les autres stacks du Homelab.

ComposantRôlePersistance
OllamaTéléchargement et exécution des modèles/root/.ollama dans le conteneur
Open WebUIInterface, comptes, conversations, fichiers et base locale/app/backend/data dans le conteneur
Réseau aiCommunication interne entre les deux servicesRéseau Docker externe
Réseau proxyAccès éventuel par Nginx Proxy ManagerRéseau Docker externe

Cette séparation rend les mises à jour plus simples : je peux remplacer l’image d’Open WebUI sans toucher aux modèles, ou redémarrer Ollama sans perdre mes conversations.

1. Vérifier Docker et la carte NVIDIA

Avant de créer la stack, j’ai vérifié le fonctionnement du pilote sur l’hôte :

nvidia-smi

Dans mon cas, la GTX 1650 était détectée avec le pilote NVIDIA 610.43.03. J’ai ensuite contrôlé Docker et Compose :

docker version
docker compose version
docker info | sed -n '/Runtimes/p'

Ollama a besoin du NVIDIA Container Toolkit pour accéder au GPU depuis Docker. Après installation du paquet, la configuration du runtime se fait ainsi :

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Le test le plus utile consiste à lancer nvidia-smi dans un conteneur CUDA :

docker run --rm --gpus all \
  nvidia/cuda:12.8.0-base-ubuntu22.04 \
  nvidia-smi

Si la carte apparaît ici, la base est saine. Si ce test échoue, il est inutile de chercher le problème dans Ollama : il faut d’abord corriger le runtime NVIDIA.

La GTX 1650 n’est pas une carte dédiée à l’IA, mais elle suffit pour expérimenter avec des modèles compacts.

2. Préparer l’arborescence et les réseaux

J’avais déjà déplacé les services du Homelab hors de mon dossier personnel, sous /srv/homelab. Ce choix évite de disperser les données techniques dans /home et prépare l’ajout de nouvelles stacks.

sudo mkdir -p /srv/homelab/stacks/ai/ollama/data
sudo mkdir -p /srv/homelab/stacks/open-webui/data

sudo chown -R "$(id -u):$(id -g)" \
  /srv/homelab/stacks/ai/ollama \
  /srv/homelab/stacks/open-webui

Les deux projets utilisent un réseau commun nommé ai. Open WebUI rejoint également le réseau proxy, déjà utilisé par Nginx Proxy Manager.

docker network inspect ai >/dev/null 2>&1 || docker network create ai
docker network inspect proxy >/dev/null 2>&1 || docker network create proxy

L’arborescence utile devient alors :

/srv/homelab/stacks/
├── ai/
│   └── ollama/
│       ├── compose.yaml
│       └── data/
└── open-webui/
    ├── compose.yaml
    └── data/

3. Déployer Ollama avec le GPU

Le fichier /srv/homelab/stacks/ai/ollama/compose.yaml contient le moteur d’inférence :

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped

    ports:
      - "11434:11434"

    volumes:
      - ./data:/root/.ollama:Z

    environment:
      OLLAMA_KEEP_ALIVE: 24h
      OLLAMA_MAX_LOADED_MODELS: 1
      OLLAMA_MAX_QUEUE: 512
      OLLAMA_NUM_PARALLEL: 1
      OLLAMA_ORIGINS: "*"

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

    healthcheck:
      test: ["CMD-SHELL", "ollama list >/dev/null 2>&1 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

    networks:
      - ai

networks:
  ai:
    external: true

Les paramètres correspondent aux limites de ma machine :

ParamètreValeurPourquoi
OLLAMA_KEEP_ALIVE24hÉvite de recharger constamment le modèle pendant une session de travail
OLLAMA_MAX_LOADED_MODELS1Empêche plusieurs modèles de saturer les 4 Go de VRAM
OLLAMA_NUM_PARALLEL1Évite plusieurs inférences simultanées sur un GPU limité
count1Réserve une seule carte NVIDIA au conteneur

Je lance ensuite la stack depuis Dockge ou directement en ligne de commande :

cd /srv/homelab/stacks/ai/ollama
docker compose up -d
docker compose ps
docker compose logs --tail=100 ollama

Puis je vérifie que le conteneur voit réellement le GPU :

docker exec ollama nvidia-smi

4. Déployer Open WebUI

Le fichier /srv/homelab/stacks/open-webui/compose.yaml contient l’interface :

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped

    ports:
      - "3000:8080"

    volumes:
      - ./data:/app/backend/data:Z

    environment:
      OLLAMA_BASE_URL: http://ollama:11434
      WEBUI_AUTH: "True"
      REQUEST_TIMEOUT: "120"
      ENABLE_UPDATES: "False"

    networks:
      - ai
      - proxy

networks:
  ai:
    external: true
  proxy:
    external: true

Le nom ollama est résolu automatiquement sur le réseau Docker ai. Open WebUI ne doit donc pas utiliser localhost:11434 : depuis son conteneur, localhost désignerait Open WebUI lui-même.

cd /srv/homelab/stacks/open-webui
docker compose up -d
docker compose ps
docker compose logs --tail=100 open-webui

L’interface est ensuite disponible à l’adresse :

http://localhost:3000

Le premier compte créé devient administrateur. Toutes les données de l’interface restent dans le dossier data, notamment la base webui.db, les fichiers téléversés et les données utilisées par les fonctions de recherche documentaire.

5. Le premier incident : deux Ollama pour un seul port

La difficulté la plus importante n’est pas venue du GPU. Une ancienne installation d’Ollama fonctionnait encore comme service systemd sur Fedora, alors que je venais de démarrer la version Docker.

Les symptômes étaient trompeurs :

  • le port 11434 était déjà occupé ;
  • Open WebUI ne voyait pas les modèles attendus ;
  • les commandes lancées sur l’hôte et dans le conteneur ne retournaient pas la même liste ;
  • un redémarrage du conteneur ne corrigeait pas le problème.

Un seul port, deux instances : le conflit entre le service hôte et le conteneur expliquait les incohérences.

J’ai commencé par identifier précisément le processus à l’écoute :

sudo ss -tlnp | grep ':11434'
systemctl status ollama --no-pager
docker ps --filter name=ollama

Comme j’avais décidé de conserver uniquement la version Docker, j’ai arrêté et désactivé le service de l’hôte :

sudo systemctl disable --now ollama

J’ai ensuite vérifié que le port était libre, puis redémarré la stack :

sudo ss -tlnp | grep ':11434' || true

cd /srv/homelab/stacks/ai/ollama
docker compose up -d

curl -s http://localhost:11434/api/tags | jq -r '.models[].name'

Cette résolution a également clarifié l’architecture : Ollama est désormais géré par Docker, ses modèles sont persistés dans la stack et le service hôte ne doit plus redémarrer en parallèle.

6. Le second incident : les volumes et SELinux

Fedora active SELinux, ce qui protège l’hôte mais peut bloquer un conteneur qui tente d’écrire dans un bind mount. Les symptômes prennent souvent la forme d’un dossier illisible, d’un fichier impossible à créer ou d’une erreur permission denied malgré des permissions Unix qui semblent correctes.

La correction retenue est visible dans les deux fichiers Compose :

volumes:
  - ./data:/root/.ollama:Z

et :

volumes:
  - ./data:/app/backend/data:Z

Le suffixe :Z demande un étiquetage SELinux privé pour le conteneur. Il convient aux données propres à un service. Le suffixe :z sert plutôt lorsqu’un même dossier doit être partagé entre plusieurs conteneurs.

Pour contrôler les labels :

ls -Zd /srv/homelab/stacks/ai/ollama/data
ls -Zd /srv/homelab/stacks/open-webui/data

Je limite volontairement le relabeling aux dossiers de données de la stack. Il ne faut jamais appliquer :Z à un dossier système large comme /usr, /home ou /.

7. Télécharger des modèles adaptés à 4 Go de VRAM

La GTX 1650 impose de rester réaliste. Un modèle peut être stocké sur disque sans tenir entièrement dans la VRAM, mais l’exécution devient plus lente si une partie du calcul est déportée vers la RAM et le processeur.

J’ai conservé deux modèles complémentaires :

docker exec -it ollama ollama pull gemma3:4b
docker exec -it ollama ollama pull qwen2.5-coder:7b
docker exec ollama ollama list
ModèleTaille observéeUsage principalComportement sur la GTX 1650
gemma3:4bEnviron 3,3 GoQuestions générales et explicationsLe plus confortable pour 4 Go de VRAM
qwen2.5-coder:7bEnviron 4,7 GoDocker, Python, HTML et assistance au codePlus lourd, avec déport partiel possible vers la RAM/CPU

Le point important n’est pas de collectionner les modèles, mais d’en choisir un ou deux adaptés aux tâches réelles. OLLAMA_MAX_LOADED_MODELS=1 évite qu’ils restent chargés simultanément.

8. Créer des profils spécialisés dans Open WebUI

J’utilise Open WebUI comme une interface commune, puis j’adapte le message système au type de travail :

ProfilUsage
Docker ExpertCompose, Dockerfile, healthchecks et réseaux
Stack ArchitectArchitecture multi-conteneurs et persistance
Frontend SpecialistHTML, CSS et JavaScript
TroubleshootingAnalyse progressive d’erreurs et de journaux
Teacher ModeExplications pédagogiques et étapes vérifiables
UniversalQuestions techniques générales

Exemple de message système pour les tâches Docker :

Tu es un assistant spécialisé dans Docker et les homelabs Linux.

Quand tu proposes une solution :
- commence par expliquer le diagnostic ;
- fournis des commandes vérifiables ;
- préserve les volumes et les données existantes ;
- distingue les réseaux internes des services exposés ;
- ajoute un healthcheck lorsque l’image le permet ;
- indique toujours comment vérifier le résultat et revenir en arrière.

Cette spécialisation est plus utile qu’un prompt très long : elle fixe quelques règles cohérentes avec la manière dont je maintiens le Homelab.

9. Connecter l’IA locale à Continue dans VS Code

Une fois l’API Ollama stabilisée, j’ai relié les modèles locaux à l’extension Continue dans VS Code. qwen2.5-coder:7b est utilisé pour le code et l’autocomplétion, tandis que gemma3:4b sert au dialogue technique plus général.

Exemple de configuration config.yaml :

name: NVSD Local AI
version: 1.0.0
schema: v1

models:
  - name: Gemma 3 4B - Local
    provider: ollama
    model: gemma3:4b
    apiBase: http://localhost:11434
    roles:
      - chat
      - edit
    defaultCompletionOptions:
      contextLength: 4096

  - name: Qwen 2.5 Coder 7B - Local
    provider: ollama
    model: qwen2.5-coder:7b
    apiBase: http://localhost:11434
    roles:
      - autocomplete
    defaultCompletionOptions:
      contextLength: 2048

Le contexte volontairement limité réduit la consommation mémoire et améliore la réactivité sur cette carte graphique. La valeur optimale dépend toutefois de la taille des fichiers et du type de tâche.

L’IA locale devient un outil du flux de développement, pas un service isolé de plus.

10. Vérifier et surveiller la stack

État des conteneurs

docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Je dois retrouver au minimum :

ollama        Up ...        0.0.0.0:11434->11434/tcp
open-webui    Up ...        0.0.0.0:3000->8080/tcp

Modèles disponibles par l’API

curl -s http://localhost:11434/api/tags \
  | jq -r '.models[].name'

Utilisation du GPU

watch -n 2 \
  'nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu,temperature.gpu --format=csv'

Consommation des conteneurs

docker stats ollama open-webui

Journaux

docker logs --tail=100 -f ollama
docker logs --tail=100 -f open-webui

Pendant mes essais, un modèle chargé utilisait presque toute la VRAM disponible, généralement autour de 3,8 à 4,0 Go selon le modèle et le contexte. Le suivi avec nvidia-smi permet de distinguer un vrai calcul GPU d’une exécution presque entièrement déportée sur le processeur.

Résultats obtenus

Après correction des conflits et stabilisation des volumes :

VérificationRésultat observé
GPU visible dans DockerOui, via docker exec ollama nvidia-smi
Interface Open WebUIAccessible sur http://localhost:3000
API OllamaAccessible sur http://localhost:11434
PersistanceModèles et conversations conservés après recréation des conteneurs
Débit indicatifEnviron 5 à 8 tokens/s selon le modèle, le contexte et le déport CPU
Latence à chaudEnviron 0,5 à 2 secondes avant le début d’une réponse simple
StabilitéAucun crash observé pendant la session de validation finale

Ces chiffres décrivent mon matériel et mes tests. Ils ne constituent pas un benchmark universel : la quantification du modèle, la longueur du contexte, le pilote et le partage GPU/CPU changent fortement les performances.

Sauvegarder ce qui compte réellement

Les modèles Ollama sont volumineux, mais ils peuvent être téléchargés de nouveau. Les données les plus importantes se trouvent dans Open WebUI : comptes, conversations, réglages, fichiers et base locale.

Une sauvegarde minimale peut cibler le dossier Open WebUI :

sudo tar -czf \
  "/srv/homelab/backups/open-webui-$(date +%F).tar.gz" \
  -C /srv/homelab/stacks/open-webui \
  data

Pour un arrêt cohérent avant une sauvegarde complète :

cd /srv/homelab/stacks/open-webui
docker compose stop

sudo tar -czf \
  "/srv/homelab/backups/ai-local-complete-$(date +%F).tar.gz" \
  -C /srv/homelab/stacks \
  ai/ollama open-webui

docker compose start

L’archive complète inclut les modèles et peut donc devenir très volumineuse. Pour une sauvegarde distante fréquente, je privilégie Open WebUI et je conserve séparément la liste des modèles à retélécharger.

Ce que cette installation m’a appris

Un petit GPU impose de choisir

La GTX 1650 suffit pour apprendre, coder et tester, mais elle oblige à limiter la taille du modèle, le contexte et le parallélisme. Cette contrainte a finalement amélioré la lisibilité de la stack.

Docker ne supprime pas les conflits avec l’hôte

Un conteneur peut être parfaitement configuré et rester inaccessible si un service local occupe déjà son port. Le diagnostic doit toujours commencer par l’hôte : processus actifs, ports, volumes et permissions.

SELinux fait partie de l’architecture Fedora

Le désactiver aurait masqué le problème. L’ajout ciblé de :Z aux bind mounts conserve la protection du système tout en autorisant les conteneurs à travailler dans leurs propres dossiers.

L’IA locale complète le VPS au lieu de le remplacer

Le poste Fedora fournit le GPU et l’environnement de développement. Le VPS reste consacré aux services publics, au reverse proxy et au site WordPress. Cette séparation évite d’exposer inutilement l’API d’inférence sur Internet.

Perspectives

Cette première stack constitue une base pour plusieurs évolutions déjà envisagées dans le Homelab :

  • sauvegarder automatiquement les conversations importantes ;
  • affiner les profils Open WebUI pour Docker, WordPress et le développement web ;
  • tester des modèles plus petits pour une autocomplétion plus rapide ;
  • relier l’interface à un nom local derrière Nginx Proxy Manager ;
  • réutiliser Ollama dans un futur assistant vocal privé, avec transcription et synthèse vocale ;
  • documenter les performances de plusieurs modèles sur la même GTX 1650.

Conclusion

Cette installation a transformé l’Acer Predator en véritable nœud IA du Homelab. Ollama fournit une API locale simple, Open WebUI rend les modèles agréables à utiliser et Docker maintient l’ensemble cohérent avec mes autres services.

Le résultat le plus intéressant n’est pas seulement d’exécuter un LLM sans cloud. C’est d’avoir intégré l’IA à une architecture que je comprends, que je peux sauvegarder et que je suis capable de dépanner.

Avec une GTX 1650 de 4 Go, il faut accepter les limites. Mais pour générer du code, analyser une erreur Docker, préparer un fichier Compose ou expliquer un concept technique, cette stack locale remplit déjà son rôle.


Questions fréquentes

Peut-on utiliser cette stack sans GPU ?

Oui. Ollama peut fonctionner sur CPU, mais les réponses seront nettement plus lentes. Il suffit de retirer la réservation NVIDIA du fichier Compose.

Peut-on installer plusieurs modèles avec seulement 4 Go de VRAM ?

Oui. Le stockage des modèles dépend du disque, pas de la VRAM. En revanche, je ne charge qu’un seul modèle à la fois grâce à OLLAMA_MAX_LOADED_MODELS=1.

Pourquoi Open WebUI utilise-t-il http://ollama:11434 ?

Parce que les deux conteneurs partagent le réseau Docker ai. Le nom du conteneur devient un nom DNS interne. localhost ne fonctionnerait pas depuis Open WebUI pour joindre Ollama.

Où sont enregistrées les conversations ?

Elles sont persistées dans /srv/homelab/stacks/open-webui/data, avec la base webui.db et les autres données de l’interface.

Pourquoi ne pas installer Ollama directement sur Fedora ?

C’est possible, mais j’ai choisi Docker pour conserver la même méthode de gestion que pour le reste du Homelab. Le point essentiel est de ne pas laisser l’instance hôte et l’instance Docker actives simultanément sur le port 11434.

Sources officielles


Article rédigé à la première personne à partir de l’installation et des tests réalisés dans le Homelab NVSD.
Dernière mise à jour : 10 août 2026.