Aller au contenu

Open WebUI - Interface ChatGPT pour Ollama

Vue d'ensemble

Open WebUI est une interface web moderne et complète pour interagir avec les modèles LLM locaux via Ollama. C'est l'équivalent open-source et auto-hébergé de ChatGPT, optimisé pour les serveurs d'inférence privés.

URL d'accès : http://192.168.1.82:3000

Caractéristiques

Interface utilisateur

  • UI moderne : Interface type ChatGPT avec mode clair/sombre
  • Multi-conversations : Gestion illimitée de conversations parallèles
  • Historique persistant : Toutes les conversations sont sauvegardées
  • Recherche : Recherche dans l'historique des conversations
  • Export/Import : Export JSON des conversations

Fonctionnalités avancées

  • RAG (Retrieval-Augmented Generation) : Upload de documents (PDF, TXT, MD) pour contexte
  • Web Search : Recherche web intégrée pour réponses à jour
  • Multi-utilisateurs : Authentification et isolation des données
  • Rôles : Admin, User, Pending (contrôle d'accès)
  • API compatible OpenAI : Utilisation via SDK OpenAI
  • Streaming : Réponses en temps réel (streaming SSE)

Modèles disponibles

Par défaut, Open WebUI détecte automatiquement tous les modèles Ollama installés :

llama3.3:70b          # Modèle général (45 GB VRAM)
qwen2.5-coder:32b     # Spécialisé code (20 GB VRAM)
llama3.2:3b           # Modèle léger rapide (3 GB VRAM)

Les utilisateurs peuvent basculer entre modèles en cours de conversation.

Installation

Déploiement automatique via GitLab CI/CD

Le playbook Ansible install-open-webui.yml est exécuté automatiquement à chaque push sur main.

Job GitLab : ansible:install-open-webui (stage apply)

Installation manuelle (si besoin)

cd /opt/probatiovault-ia-server/ansible
ansible-playbook -i inventory/hosts playbooks/install-open-webui.yml

Vérification de l'installation

# Status du conteneur Docker
docker ps | grep open-webui

# Logs temps réel
docker logs -f open-webui

# Accès web
curl -I http://192.168.1.82:3000

Architecture

Déploiement Docker

Docker Host (192.168.1.82)
  └─ open-webui (container)
       ├─ Port: 3000 → 8080 (internal)
       ├─ Volume: /data/open-webui → /app/backend/data
       ├─ Network: bridge
       └─ Env:
            ├─ OLLAMA_BASE_URL=http://192.168.1.82:11434
            ├─ WEBUI_AUTH=true
            ├─ ENABLE_RAG_WEB_SEARCH=true
            └─ DEFAULT_MODELS=llama3.3:70b,qwen2.5-coder:32b

Stockage des données

/data/open-webui/
  ├── webui.db              # Base de données SQLite (users, chats, settings)
  ├── uploads/              # Documents uploadés (RAG)
  ├── cache/                # Cache embeddings
  └── logs/                 # Logs application

Connexion Ollama

Open WebUI communique avec Ollama via l'API REST :

Open WebUI (port 3000)
      ↓ HTTP
Ollama API (port 11434)
GPU Inference (2× RTX 5090)

Important : Ollama doit être démarré avant Open WebUI.

Premier démarrage

1. Créer le compte admin

La première personne à s'inscrire devient automatiquement admin.

  1. Ouvrir http://192.168.1.82:3000
  2. Cliquer "Sign Up"
  3. Remplir :
  4. Name : Votre nom
  5. Email : admin@probatiovault.com (ou autre)
  6. Password : Mot de passe sécurisé
  7. Valider

Vous êtes maintenant Admin avec accès complet.

2. Vérifier la connexion Ollama

  1. Aller dans Settings (⚙️ en haut à droite)
  2. ConnectionsOllama API
  3. Vérifier que l'URL est : http://192.168.1.82:11434
  4. Cliquer "Test Connection" → doit afficher "✅ Connected"

3. Sélectionner un modèle

  1. Créer une nouvelle conversation (bouton "+")
  2. Cliquer sur le sélecteur de modèle (en haut)
  3. Choisir llama3.3:70b ou qwen2.5-coder:32b
  4. Commencer à discuter

Utilisation

Conversations basiques

Exemple 1 : Question générale

User: Explique-moi les transformers en machine learning

Assistant (llama3.3:70b):
Les transformers sont une architecture de réseau de neurones introduite en 2017
par Vaswani et al. dans le papier "Attention is All You Need"...

Exemple 2 : Génération de code

User: Écris une fonction Python pour calculer la suite de Fibonacci

Assistant (qwen2.5-coder:32b):
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

RAG (Retrieval-Augmented Generation)

Uploader un document pour contexte :

  1. Cliquer sur l'icône 📎 (attach) dans la zone de saisie
  2. Sélectionner un fichier (PDF, TXT, MD, DOCX)
  3. Attendre l'upload et l'indexation (embeddings)
  4. Poser une question sur le document

Exemple :

[Upload: architecture-probatiovault.pdf]

User: Quels sont les composants principaux de l'architecture ?
Assistant (llama3.3:70b):
Selon le document, les composants principaux sont :
1. Backend API (NestJS + PostgreSQL)
2. Frontend App (React Native)
3. Infrastructure (Terraform + Ansible)

Le modèle extrait automatiquement les informations pertinentes du document.

Web Search intégrée

Activer la recherche web (déjà activé par défaut) :

  1. Settings → Features → Web Search
  2. Provider : DuckDuckGo (pas de clé API requise)
  3. Enable Web Search : ✅

Utilisation :

User: Quelle est la dernière version de Python en 2026 ?

Assistant (avec web search):
[🔍 Recherche web effectuée]
La dernière version stable de Python en 2026 est Python 3.13.2...

Multi-modèles (model switching)

Vous pouvez changer de modèle en cours de conversation :

  1. Cliquer sur le sélecteur de modèle en haut
  2. Choisir un autre modèle (ex: passer de llama3.3 à qwen2.5-coder)
  3. Continuer la conversation

Le contexte est conservé, seul le modèle de génération change.

Gestion des utilisateurs

Rôles disponibles

Rôle Permissions
Admin Gestion users, settings globaux, accès tous les modèles
User Conversations, RAG, export/import, accès modèles autorisés
Pending En attente d'approbation (si signup désactivé)

Ajouter un utilisateur (mode admin)

  1. Settings → Admin Panel → Users
  2. Cliquer "Add User"
  3. Remplir :
  4. Name
  5. Email
  6. Password
  7. Role (User ou Admin)
  8. Save

Désactiver les inscriptions publiques

Par défaut, n'importe qui peut créer un compte. Pour restreindre :

  1. Settings → Admin Panel → Settings
  2. Enable Signup : ❌
  3. Save

Les nouveaux utilisateurs devront être créés manuellement par un admin.

Réinitialiser un mot de passe

Depuis l'admin panel :

  1. Settings → Admin Panel → Users
  2. Trouver l'utilisateur
  3. Cliquer "Edit" → "Change Password"
  4. Entrer le nouveau mot de passe

Depuis la ligne de commande (si admin locked out) :

docker exec -it open-webui /bin/bash
sqlite3 /app/backend/data/webui.db
UPDATE user SET password='<bcrypt_hash>' WHERE email='admin@probatiovault.com';
.quit
exit

Configuration avancée

Variables d'environnement

Modifier les variables dans le playbook Ansible et redéployer :

env:
  OLLAMA_BASE_URL: "http://192.168.1.82:11434"
  WEBUI_AUTH: "true"                    # Authentification
  WEBUI_NAME: "ProbatioVault AI"        # Nom affiché
  ENABLE_RAG_WEB_SEARCH: "true"         # Web search
  ENABLE_IMAGE_GENERATION: "false"      # Génération d'images (ComfyUI)
  DEFAULT_MODELS: "llama3.3:70b,qwen2.5-coder:32b"
  WEBUI_SECRET_KEY: "<random_string>"   # Clé de chiffrement (générer)
  DEFAULT_USER_ROLE: "user"             # Rôle par défaut
  ENABLE_SIGNUP: "true"                 # Autoriser les inscriptions
  MAX_UPLOAD_SIZE: "100"                # Taille max upload (MB)

Changer le port

Modifier dans le playbook :

ports:
  - "3000:8080"  # Changer 3000 par le port souhaité

Redéployer :

ansible-playbook -i inventory/hosts playbooks/install-open-webui.yml

Connexion à un Ollama distant

Si Ollama est sur un autre serveur :

env:
  OLLAMA_BASE_URL: "http://autre-serveur.local:11434"

Activer HTTPS (reverse proxy Nginx)

Créer un reverse proxy Nginx pour SSL :

server {
    listen 443 ssl;
    server_name ai.probatiovault.com;

    ssl_certificate /etc/ssl/certs/probatiovault.crt;
    ssl_certificate_key /etc/ssl/private/probatiovault.key;

    location / {
        proxy_pass http://192.168.1.82:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket support (streaming)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

API OpenAI compatible

Open WebUI expose une API compatible OpenAI pour intégration programmatique.

Endpoint

http://192.168.1.82:3000/api/v1

Obtenir une clé API

  1. Settings → Account → API Keys
  2. Cliquer "Create new secret key"
  3. Copier la clé (format : sk-...)

Utilisation avec SDK OpenAI

Python :

from openai import OpenAI

client = OpenAI(
    base_url="http://192.168.1.82:3000/api/v1",
    api_key="sk-your-api-key-here"
)

response = client.chat.completions.create(
    model="llama3.3:70b",
    messages=[
        {"role": "user", "content": "Explique les transformers"}
    ],
    stream=True
)

for chunk in response:
    print(chunk.choices[0].delta.content, end="")

cURL :

curl http://192.168.1.82:3000/api/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-your-api-key-here" \
  -d '{
    "model": "llama3.3:70b",
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": false
  }'

Endpoints disponibles

Endpoint Méthode Description
/models GET Liste des modèles disponibles
/chat/completions POST Génération de texte (chat)
/completions POST Génération de texte (completion)
/embeddings POST Génération d'embeddings

Intégration Homer

Open WebUI est référencé dans le dashboard Homer :

- name: "IA & Machine Learning"
  items:
    - name: "Open WebUI"
      logo: "assets/tools/open-webui.png"
      subtitle: "ChatGPT-like interface for Ollama"
      url: "http://192.168.1.82:3000"

Accès depuis Homer : http://192.168.1.82:8080

Troubleshooting

Open WebUI ne démarre pas

# Vérifier les logs Docker
docker logs open-webui

# Erreurs communes :
# - "Connection refused" : Ollama n'est pas démarré
# - "Permission denied" : Problème de volumes Docker

# Redémarrer le conteneur
docker restart open-webui

Ollama non détecté

# Vérifier qu'Ollama est accessible
curl http://192.168.1.82:11434/api/tags

# Vérifier la variable d'environnement
docker inspect open-webui | grep OLLAMA_BASE_URL

# Tester la connexion depuis le conteneur
docker exec -it open-webui curl http://192.168.1.82:11434/api/tags

Modèles non listés

Si les modèles Ollama n'apparaissent pas dans Open WebUI :

  1. Settings → Connections → Ollama API
  2. Cliquer "Refresh Models"
  3. Vérifier que l'URL Ollama est correcte

Ou redémarrer le conteneur :

docker restart open-webui

Upload de fichiers échoue

# Vérifier l'espace disque
df -h /data/open-webui

# Vérifier les permissions du volume
ls -la /data/open-webui

# Augmenter la limite de taille (si nécessaire)
# Éditer le playbook Ansible :
env:
  MAX_UPLOAD_SIZE: "500"  # 500 MB au lieu de 100 MB

Performances lentes

Si les réponses sont lentes :

  1. Vérifier la charge GPU :

    nvidia-smi
    

  2. Choisir un modèle plus léger :

  3. llama3.2:3b au lieu de llama3.3:70b

  4. Limiter les utilisateurs concurrents :

  5. Les GPUs ne peuvent traiter qu'une requête à la fois par modèle

Erreur 502 Bad Gateway

# Le conteneur n'est pas démarré
docker ps | grep open-webui

# Si absent, le relancer
docker start open-webui

# Vérifier les logs
docker logs open-webui --tail 50

Maintenance

Mise à jour Open WebUI

# Pull la dernière image
docker pull ghcr.io/open-webui/open-webui:main

# Arrêter et supprimer l'ancien conteneur
docker stop open-webui
docker rm open-webui

# Relancer avec la nouvelle image (via Ansible)
cd /opt/probatiovault-ia-server/ansible
ansible-playbook -i inventory/hosts playbooks/install-open-webui.yml

Important : Les données dans /data/open-webui sont préservées.

Sauvegarde des données

# Sauvegarder la base de données et uploads
sudo tar czf /tmp/open-webui-backup-$(date +%Y%m%d).tar.gz /data/open-webui/

# Copier la sauvegarde ailleurs (NAS, S3, etc.)
cp /tmp/open-webui-backup-*.tar.gz /mnt/nas/backups/

Restaurer depuis une sauvegarde

# Arrêter Open WebUI
docker stop open-webui

# Restaurer les données
sudo tar xzf /tmp/open-webui-backup-20260211.tar.gz -C /

# Redémarrer Open WebUI
docker start open-webui

Nettoyage de l'historique

Pour supprimer les anciennes conversations et libérer de l'espace :

  1. Settings → Admin Panel → Database
  2. Cliquer "Cleanup Old Chats"
  3. Choisir la période (ex: conversations > 90 jours)
  4. Confirm

Ou via SQL :

docker exec -it open-webui /bin/bash
sqlite3 /app/backend/data/webui.db
DELETE FROM chat WHERE created_at < datetime('now', '-90 days');
VACUUM;
.quit
exit

Monitoring des ressources

# Utilisation CPU/RAM du conteneur
docker stats open-webui

# Taille du volume de données
du -sh /data/open-webui

# Nombre d'utilisateurs actifs
docker exec -it open-webui sqlite3 /app/backend/data/webui.db \
  "SELECT COUNT(*) FROM user WHERE role != 'pending';"

Cas d'usage avancés

1. Documentation technique interactive

Upload de documentations techniques pour Q&A :

[Upload: kubernetes-docs.pdf, terraform-docs.pdf]

User: Comment déployer un cluster Kubernetes avec Terraform ?
Assistant (llama3.3:70b + RAG):
Basé sur les documents fournis, voici les étapes :
1. Créer un module Terraform pour le cluster EKS
2. Définir les node groups avec autoscaling
3. Configurer le provider Kubernetes
4. Déployer avec `terraform apply`

[Code example extrait des documents...]

2. Revue de code assistée

User: @code
def process_data(data):
    result = []
    for item in data:
        if item > 0:
            result.append(item * 2)
    return result

Optimise cette fonction et explique les changements.

Assistant (qwen2.5-coder:32b):
Voici une version optimisée avec list comprehension :

```python
def process_data(data):
    return [item * 2 for item in data if item > 0]

Changements : 1. List comprehension : plus pythonique et plus rapide 2. Moins de lignes : code plus concis 3. Performance : ~30% plus rapide sur grandes listes

### 3. Traductions techniques
User: Traduis ce texte technique en anglais :

"Le serveur d'inférence utilise 2 RTX 5090 avec 64 GB de VRAM chacune. L'architecture permet un load balancing automatique entre les GPUs."

Assistant (llama3.3:70b): "The inference server uses 2 RTX 5090 with 64 GB of VRAM each. The architecture enables automatic load balancing between the GPUs."

### 4. Génération de tests unitaires
User: Génère des tests unitaires pour cette fonction :

def calculate_tax(amount, rate):
    return amount * (rate / 100)

Assistant (qwen2.5-coder:32b):

import pytest

def test_calculate_tax_basic():
    assert calculate_tax(100, 20) == 20.0

def test_calculate_tax_zero_rate():
    assert calculate_tax(100, 0) == 0.0

def test_calculate_tax_zero_amount():
    assert calculate_tax(0, 20) == 0.0

def test_calculate_tax_decimal():
    assert calculate_tax(100, 7.5) == 7.5

def test_calculate_tax_large_amount():
    assert calculate_tax(1000000, 20) == 200000.0
### 5. Extraction d'informations depuis logs
[Upload: application-logs.txt (500 MB)]

User: Combien d'erreurs 500 dans les logs ?

Assistant (llama3.3:70b + RAG): D'après l'analyse des logs : - Erreurs 500 : 247 occurrences - Erreurs 404 : 1,523 occurrences - Erreurs 503 : 12 occurrences

Top 3 endpoints avec erreurs 500 : 1. /api/users/profile (89 fois) 2. /api/payments/process (67 fois) 3. /api/orders/create (54 fois) ```

Ressources

Résumé des ports

Service Port Protocole Accès
Open WebUI 3000 HTTP LAN uniquement
API OpenAI 3000 HTTP LAN uniquement
Ollama (backend) 11434 HTTP Localhost + LAN

Sécurité

Recommandations

  1. Changez le mot de passe admin après le premier démarrage
  2. Désactivez les inscriptions publiques si usage interne
  3. Activez HTTPS si accès depuis Internet
  4. Limitez l'accès réseau (firewall, VPN)
  5. Sauvegardez régulièrement les données (/data/open-webui)
  6. Mettez à jour régulièrement l'image Docker

Exposition Internet (déconseillé)

Si vous devez exposer Open WebUI sur Internet :

  1. HTTPS obligatoire (reverse proxy Nginx + Let's Encrypt)
  2. Rate limiting (limite de requêtes par IP)
  3. Authentification forte (2FA si possible)
  4. Monitoring (alertes sur tentatives de connexion)
  5. Firewall (whitelist IPs si possible)

Recommandation : Utilisez un VPN (WireGuard) pour accès distant sécurisé.

Différences avec ChatGPT

Fonctionnalité Open WebUI ChatGPT
Hébergement Auto-hébergé (privé) Cloud OpenAI
Coût Gratuit (hors infrastructure) Abonnement $20/mois
Données Restent sur votre serveur Envoyées à OpenAI
Modèles Ollama local (Llama, Qwen, etc.) GPT-4.5, GPT-o1
Performance Dépend du GPU (RTX 5090) Optimisé cloud
Fonctionnalités RAG, Web search, API Plugins, DALL-E, Voice
Personnalisation Totale (open-source) Limitée

Avantages Open WebUI : - ✅ Données privées (RGPD compliant) - ✅ Pas de coût récurrent - ✅ Personnalisation totale - ✅ Pas de limites de tokens/jour

Avantages ChatGPT : - ✅ Modèles plus puissants (GPT-4.5, o1) - ✅ Pas de gestion infrastructure - ✅ Disponibilité 24/7 garantie - ✅ Fonctionnalités multimodales avancées (DALL-E 3, Voice)