Aller au contenu

Installation de Open WebUI et d'Ollama

Logo

👋 Présentation d'Openwebui et d'Ollama

Open WebUI est une interface web auto-hébergée, extensible et riche en fonctionnalités, conçue pour fonctionner entièrement hors ligne. Elle prend en charge divers moteurs de modèles de langage (LLM) en utilisant Ollama.

Ollama est un outil open-source qui permet d'exécuter localement des modèles de langage de grande taille (LLM) tels que Llama 3.3, DeepSeek-R1, Phi-4, Mistral et Gemma 3.

Prérequis

Pour une bonne expérience utilisateur, il est conseillé d'utiliser une machine avec une carte graphique Nvidia. Pour mar part, j'ai utilisé un PC portable Asus Tuf Gaming de 2019 ayant comme spec. :

  • Processeur : Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz 12 coeurs
  • RAM : 32 Go
  • Disque dur : Nvme 256 Go
  • Carte graphique : NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile]

Installation des drivers Nvidia

Avant tout il faut configurer les dépôts pour pouvoir installer par la suite les paquets Nvidia.

Le dépôt Linux nvidia-container-toolkit permet d'installer les outils nécessaires pour exécuter des conteneurs Docker avec l'accélération GPU fournie par les cartes graphiques NVIDIA.

Configuration du dépôt Nvidia et Debian (root)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# vim /etc/apt/sources.list :
deb http://debian.univ-tlse2.fr/debian/ bookworm main non-free-firmware non-free contrib
deb http://security.debian.org/debian-security bookworm-security main non-free-firmware non-free contrib
deb http://debian.univ-tlse2.fr/debian/ bookworm-updates main non-free-firmware non-free contrib
Installation des paquets Nvidia (root)
apt update
apt install -y nvidia-driver firmware-misc-nonfree

# Je ne sais pas si la ligne ci-dessous est réellement nécessaire.
apt install -y nvidia-cuda-dev nvidia-cuda-toolkit

# Cette ligne ci-dessous est indispensable car le paquet nvidia-container-toolkit 
# permet d’exécuter des conteneurs Docker avec l’accélération GPU de NVIDIA.
apt-get install -y nvidia-container-toolkit

Rédémarrez le système.

Configuration Docker

Création de l'arborescence (root)
mkdir -p /srv/docker/openwebui/{config/{dyn_traefik,secrets},logs,ollama-local,open-webui-local,}
touch config/acme.json
chmod 600 config/acme.json
chown -R <VOTRE_USER>: /srv/docker

Les fichiers contenant les secrets "ovh_*" seront contenus dans le répertoire /srv/docker/openwebui/config/secrets. Ils seront utilisés pour l'authentification sur l'API d'OVH dans le cadre de la génération du certificat TLS avec Let's Encrypt et le challenge DNS.

/srv/docker/openwebui/compose.yml
---
secrets:
  ovh_endpoint:
    file: "./config/secrets/ovh_endpoint.secret"
  ovh_application_key:
    file: "./config/secrets/ovh_application_key.secret"
  ovh_application_secret:
    file: "./config/secrets/ovh_application_secret.secret"
  ovh_consumer_key:
    file: "./config/secrets/ovh_consumer_key.secret"

services:
  traefik:
    image: "traefik:v3"
    container_name: traefik
    networks:
      - traefik
    secrets:
      - "ovh_endpoint"
      - "ovh_application_key"
      - "ovh_application_secret"
      - "ovh_consumer_key"
    environment:
      - "TZ=Europe/Paris"
      - "OVH_ENDPOINT_FILE=/run/secrets/ovh_endpoint"
      - "OVH_APPLICATION_KEY_FILE=/run/secrets/ovh_application_key"
      - "OVH_APPLICATION_SECRET_FILE=/run/secrets/ovh_application_secret"
      - "OVH_CONSUMER_KEY_FILE=/run/secrets/ovh_consumer_key"
    volumes:
      # Mapping sur le socket interne de Docker
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
      # Mapping du fichier de configuration statique
      - './config/traefik.yml:/traefik.yml'
      # Mapping du dossier contenant la configuration dynamique
      - './config/dyn_traefik/:/dyn_traefik/'
      # Mapping du fichier de stockage des certificats
      - './config/acme.json:/acme.json'
      - "./logs:/var/log"
    ports:
      - "80:80"
      - "443:443"
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.domaine.fr`)"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
      - "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
      - "traefik.http.routers.traefik-dashboard.middlewares=traefik-dashboard-ipallowlist"
      - "traefik.http.middlewares.traefik-dashboard-ipallowlist.ipallowlist.sourcerange=127.0.0.1/32, 192.168.1.0/24"
      - "traefik.http.services.traefik-dashboard-service.loadbalancer.server.port=8080"

  openWebUI:
    image: ghcr.io/open-webui/open-webui:cuda
    container_name: openwebui
    hostname: openwebui
    networks:
      - ollama-net
      - traefik
    restart: unless-stopped
    volumes:
      - ./open-webui-local:/app/backend/data
    environment:
      WEBUI_NAME: Quercy Libre IA
      OLLAMA_BASE_URLS: http://ollama:11434
      WEBUI_URL: https://ia.domaine.fr
    labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik"
        - "traefik.http.routers.openwebui.rule=Host(`ia.domaine.fr`)"
        - "traefik.http.routers.openwebui.tls=true"
        - "traefik.http.routers.openwebui.tls.certresolver=letsencrypt"
        - "traefik.http.services.openwebui.loadbalancer.server.port=8080"
        - "traefik.http.routers.openwebui.service=openwebui"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "2"

  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    hostname: ollama
    networks:
      - ollama-net
    volumes:
      - ./ollaima-local:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "2"

networks:
  ollama-net:
  traefik:
    external: true
/srv/docker/openwebui/config/traefik.yml
---
api:
  dashboard: true

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    directory: /dyn_traefik/
    watch: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: ":443"

certificatesResolvers:
  letsencrypt:
    acme:
      caServer: "https://acme-v02.api.letsencrypt.org/directory"
      email: "<EMAIL>"
      storage: "/acme.json"
      keyType: EC384
      dnsChallenge:
        provider: ovh
        delayBeforeCheck: 10
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"

log:
  filePath: "/var/log/traefik.log"
  format: json
  level: INFO
  maxSize: 5
  maxBackups: 50
  maxAge: 10
  compress: true

accessLog:
  filePath: "/var/log/access.log"
  format: json
  fields:
    defaultMode: keep
    names:
      StartUTC: drop

Lancez la commande docker compose pull suivie de la commande docker compose up -d.

Patientez un peu puis rendez-vous sur l'URL d'Open WebUI (https://ia.domaine.fr dans cet exemple)

Lors de la première connexion, il vous sera demandé de vous enregistrer. Par défaut vous serez administrateur de l'application.

Mire de connexion Open WebUI

Importation d'un premier modèle

Aucun modèle n'est fourni par défaut. Nous allons donc commencer par le premier modèle Llama3 qui le modèle open source de Meta AI.

Une fois authentifié, cliquez sur "Sélectionnez un modèle", saisissez "llam3.1:8b" "dans la case "Rechercher un modèle" puis cliquez sur "Récupérer llama3.1:8b depuis Ollama.com".

Récupération du modèle llama3.1:8b

Le modèle sera alors téléchargé et intégré automatiquement. Voici ce que cela donne (en vitesse normale et c'est clairement moi le plus lent 😂) quand je l'interroge :

Récupération du modèle llama3.1:8b

J'en ai profité pour tester d'autres modèles que vous pouvez retrouver ici Modèles pour Ollama.

Les notations 8b, 12b, 70b font référence au nombre de paramètres d’un modèle de langage (LLM). Le "b" signifie billion en anglais, soit milliard en français.

Plus un modèle a de paramètres, plus il peut être complexe, nuancé et précis, mais aussi plus il nécessite de ressources pour fonctionner (puissance de calcul, mémoire, etc.). Le paramètre 8b est un bon compromis sur des petites machines. La vitesse de réponse de Gemma3:12b à la même question posée ci-dessus est 3 à 5 fois moins rapide. Pour un modèle 70b il faut selon toute vraisemblance au moins 128 Go de RAM.

Conclusion

Open WeUI offre beaucoup de possibilités quant à son usage. Je ne suis pas un expert IA mais j'ai pu commencer à m'amuser dessus très facilement. Le plus dur finalement c'est de trouver la bonne machine pour démarrer.

Non content de pouvoir avoir mon chatgpt personnel, je me suis lancé dans l'apprentissage de l'IA en lui fournissant des données afin qu'elle me les restitue. En effet Open WebUI permet d'entrainer son propre modèle basé sur un modèle LLM existant. C'est là que ça devient réellement plus difficile mais tellement plus intéressant. Je commence même à obtenir des resultats concluants. Cela fera l'objet d'une prochaine documentation selon mes avancées.