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 :
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.
- Ouvrir http://192.168.1.82:3000
- Cliquer "Sign Up"
- Remplir :
- Name : Votre nom
- Email : admin@probatiovault.com (ou autre)
- Password : Mot de passe sécurisé
- Valider
Vous êtes maintenant Admin avec accès complet.
2. Vérifier la connexion Ollama¶
- Aller dans Settings (⚙️ en haut à droite)
- Connections → Ollama API
- Vérifier que l'URL est :
http://192.168.1.82:11434 - Cliquer "Test Connection" → doit afficher "✅ Connected"
3. Sélectionner un modèle¶
- Créer une nouvelle conversation (bouton "+")
- Cliquer sur le sélecteur de modèle (en haut)
- Choisir
llama3.3:70bouqwen2.5-coder:32b - 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 :
- Cliquer sur l'icône 📎 (attach) dans la zone de saisie
- Sélectionner un fichier (PDF, TXT, MD, DOCX)
- Attendre l'upload et l'indexation (embeddings)
- 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) :
- Settings → Features → Web Search
- Provider : DuckDuckGo (pas de clé API requise)
- 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 :
- Cliquer sur le sélecteur de modèle en haut
- Choisir un autre modèle (ex: passer de llama3.3 à qwen2.5-coder)
- 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)¶
- Settings → Admin Panel → Users
- Cliquer "Add User"
- Remplir :
- Name
- Password
- Role (User ou Admin)
- Save
Désactiver les inscriptions publiques¶
Par défaut, n'importe qui peut créer un compte. Pour restreindre :
- Settings → Admin Panel → Settings
- Enable Signup : ❌
- Save
Les nouveaux utilisateurs devront être créés manuellement par un admin.
Réinitialiser un mot de passe¶
Depuis l'admin panel :
- Settings → Admin Panel → Users
- Trouver l'utilisateur
- Cliquer "Edit" → "Change Password"
- 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 :
Redéployer :
Connexion à un Ollama distant¶
Si Ollama est sur un autre serveur :
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¶
Obtenir une clé API¶
- Settings → Account → API Keys
- Cliquer "Create new secret key"
- 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 :
- Settings → Connections → Ollama API
- Cliquer "Refresh Models"
- Vérifier que l'URL Ollama est correcte
Ou redémarrer le conteneur :
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 :
-
Vérifier la charge GPU :
-
Choisir un modèle plus léger :
-
llama3.2:3bau lieu dellama3.3:70b -
Limiter les utilisateurs concurrents :
- 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 :
- Settings → Admin Panel → Database
- Cliquer "Cleanup Old Chats"
- Choisir la période (ex: conversations > 90 jours)
- 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
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."
User: Génère des tests unitaires pour cette fonction :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
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¶
- GitHub officiel : https://github.com/open-webui/open-webui
- Documentation : https://docs.openwebui.com
- Discord : https://discord.gg/5rJgQTnV4s
- Changelog : https://github.com/open-webui/open-webui/releases
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¶
- Changez le mot de passe admin après le premier démarrage
- Désactivez les inscriptions publiques si usage interne
- Activez HTTPS si accès depuis Internet
- Limitez l'accès réseau (firewall, VPN)
- Sauvegardez régulièrement les données (
/data/open-webui) - Mettez à jour régulièrement l'image Docker
Exposition Internet (déconseillé)¶
Si vous devez exposer Open WebUI sur Internet :
- HTTPS obligatoire (reverse proxy Nginx + Let's Encrypt)
- Rate limiting (limite de requêtes par IP)
- Authentification forte (2FA si possible)
- Monitoring (alertes sur tentatives de connexion)
- 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)