Dans ce tuto, j'ai utilisé mon serveur Dell R430 Avec 1x Intel Xeon E5-2667 c3, sans GPU. Pour une telle configuration, Mistral est le mieux adapté. Puisque Le serveur est sous un environnement de virtualisation avec proxmox, je procéderai avec un conteneur LXC, mais c'est tout à fait possible avec un debian installé bare metal.

Dans proxmox, aller sur le stockage local (local storage), puis dans CT Templates, chercher debian 12 et le télécharger.
Ensuite, se rendre dans "Create CT", et configurer selon vos besoins. Dans mon cas j'ai configuré le contenueur comme suite :
Onglet Général
Onglet Template
Onglet Disks
Onglet CPU
Onglet Memory
Onglet Network
Lancer le conteneur.
Dans proxmox, séléctionner le conteneur dans le menu, et lancer la console.
root@ai-lxc:~# apt update && apt upgrade -y
Ensuite installer les outils utiles :
root@ai-lxc:~# apt install -y curl git htop nano
Toujours dans la console :
root@ai-lxc:~# curl -fsSL https://ollama.com/install.sh | sh
Si un message d'erreur apparaît en vous demandant d'installer le paquet ZSTD, faites-le.
root@ai-lxc:~# apt install zstd
Puis relancer la commande :
root@ai-lxc:~# curl -fsSL https://ollama.com/install.sh | sh
Ensuite vérifier que le service tourne :
root@ai-lxc:~# systemctl status ollama
On doit voir active (running). Puis teste la version :
root@ai-lxc:~# ollama --version
Dans mon cas : 0.17.4
On installe Mistral 7B, rapide en CPU.
root@ai-lxc:~# ollama pull mistral
Environ 4.4 Go
Ensuite lancer un test :
root@ai-lxc:~# ollama run mistral
Quand le prompt >>> apparaît, taper par exemple :
>>> Explique en 5 lignes ce qu'est la virtualisation.
Si le modèle répond correctement → tout est bon côté CPU / RAM.

Faites CTRL+D pour quitter le prompt.
Par défaut, Ollama n’utilise pas forcément tous les threads. On va lui dire d’utiliser tous tes cœurs disponibles.
Vérifie combien de threads le LXC voit :
root@ai-lxc:~# nproc
16
root@ai-lxc:~#
On créer un fichier pour l'override :
root@ai-lxc:~# mkdir -p /etc/systemd/system/ollama.service.d
root@ai-lxc:~# nano /etc/systemd/system/ollama.service.d/override.conf
Y insérer (changer le nombre de coeur en fonction de votre configuration):
[Service]
Environment="OLLAMA_NUM_THREADS=16"
Environment="OLLAMA_KEEP_ALIVE=5m"
Environment="OLLAMA_HOST=0.0.0.0"
La dernière ligne sert à dire À Ollama d'écouter depuis l'extérieur, ça sera important pour la suite. Si toutefois vous voulez installer votre interface graphique sur le même conteneur que Mistral et Ollama, ne rajoutez pas cette dernière ligne et Ollama va écouter sur l'adresse IP locale
127.0.0.1
Sauvegarder le fichier puis :
root@ai-lxc:~# systemctl daemon-reload
root@ai-lxc:~# systemctl restart ollama
Vérifie que c’est pris en compte :
root@ai-lxc:~# systemctl show ollama | grep -E "OLLAMA_NUM_THREADS|OLLAMA_KEEP_ALIVE"
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin OLLAMA_NUM_THREADS=16 OLLAMA_KEEP_ALIVE=5m
root@ai-lxc:~# time ollama run mistral "Réponds en UNE phrase : 2+2 = ?"
2 + 2 = 4
real 0m2.543s
user 0m0.034s
sys 0m0.035s
root@ai-lxc:~# time ollama run mistral "Donne moi le nom du président actuel des USA"
Le président actuel des États-Unis est Joe Biden. Il a pris ses fonctions le 20 janvier 2021.
real 0m4.822s
user 0m0.033s
sys 0m0.037s
root@ai-lxc:~#
Dans cette étape, on va créer un 2e conteneur qui va héberger l'interface web pour une meilleure isolation. La configuration que j'ai utilisée :
Onglet Général
Onglet Template
Onglet Disks
Onglet CPU
Onglet Memory
Onglet Network
Dans le conteneur ai-web :
root@ai-web:~# apt update && apt upgrade -y
root@ai-web:~# apt install -y curl git python3 python3-venv python3-pip
Puis vérifier :
root@ai-web:~# python3 --version
Python 3.11.2
root@ai-web:~# pip3 --version
pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)
root@ai-web:~#
On va :
créer un utilisateur dédié openwebui
installer Open WebUI dans un venv
lancer Open WebUI en service systemd
l’exposer en local sur http://IP_ai-web:8080
On créer un utilisateur dédié our que le programme ne tourne pas en root (plus propre et plus sûr).
root@ai-web:~# useradd -r -m -d /opt/openwebui -s /usr/sbin/nologin openwebui
Un venv (environnement virtuel Python) est un petit environnement isolé pour installer un programme Python sans casser le système.
Ça permet :
On va en créer un dans /opt/openwebui.
root@ai-web:~# mkdir -p /opt/openwebui
root@ai-web:~# chown openwebui:openwebui /opt/openwebui
On crée l’environnement Python pour Open WebUI dans son dossier :
root@ai-web: cd /opt/openwebui
root@ai-web:/opt/openwebui# runuser -u openwebui -- python3 -m venv /opt/openwebui/venv
root@ai-web:/opt/openwebui# ls -l
total 4
drwxr-xr-x 5 openwebui openwebui 4096 Feb 28 04:13 venv
On installe avec pip du venv, en tant que l’utilisateur openwebui.
Mettre pip à jour :
root@ai-web:~# runuser -u openwebui -- /opt/openwebui/venv/bin/pip install --upgrade pip
Installer Open WebUI :
root@ai-web:~# runuser -u openwebui -- /opt/openwebui/venv/bin/pip install open-webui

Vérifier que la commande existe :
root@ai-web:~# runuser -u openwebui -- /opt/openwebui/venv/bin/open-webui --help | head
Output :
Usage: open-webui [OPTIONS] COMMAND [ARGS]...
╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ main │
root@ai-web:~#
root@ai-web:~# nano /etc/systemd/system/openwebui.service
Coller EXACTEMENT ceci dedans. Remplacer IP_OLLAMA par l’IP fixe du conteneur ai-lxc, qui héberge Ollama et Mistral. Dans mon cas c'est 192.168.1.25
[Unit]
Description=Open WebUI
After=network.target
[Service]
User=openwebui
Group=openwebui
WorkingDirectory=/opt/openwebui
Environment=WEBUI_HOST=0.0.0.0
Environment=WEBUI_PORT=8080
Environment=OLLAMA_BASE_URL=http://192.168.1.25:11434
ExecStart=/opt/openwebui/venv/bin/open-webui serve
Restart=always
[Install]
WantedBy=multi-user.target
Le port 11434 est le port par défaut d'Ollama.

Activer le service :
root@ai-web:~# systemctl daemon-reload
root@ai-web:~# systemctl enable openwebui
Created symlink /etc/systemd/system/multi-user.target.wants/openwebui.service -> /etc/systemd/system/openwebui.service.
root@ai-web:~# systemctl start openwebui
Puis vérifier :
root@ai-web:~# systemctl status openwebui

Maintenant, tester le lien : http://192.168.1.128:8080

Après la création du compte administrateur, on va vérifier la connexion avec Ollama.
En haut à droite, cliquer sur l'icone du profil, puis "réglages". Puis "Réglages d'administration", ensuite, "Modèles".



On travaille dans le conteneur ai-web.
Installer les paquets nécessaires :
root@ai-web:~# apt install -y libffi-dev libssl-dev
Créer l'utilisateur système pour SearXNG
root@ai-web:~# adduser --system --home /opt/searxng --group --shell /usr/sbin/nologin searxng
Cloner le code dans /opt/searxng
root@ai-web:~# runuser -u searxng -- git clone https://github.com/searxng/searxng.git /opt/searxng/searxng
Créer le venv
root@ai-web:~# runuser -u searxng -- python3 -m venv /opt/searxng/venv
Installer les dépendances Python
root@ai-web:~# runuser -u searxng -- /opt/searxng/venv/bin/pip install --upgrade pip wheel
root@ai-web:~# runuser -u searxng -- /opt/searxng/venv/bin/pip install -r /opt/searxng/searxng/requirements.txt
root@ai-web:~# runuser -u searxng -- /opt/searxng/venv/bin/pip install -e /opt/searxng/searxng --no-build-isolation
root@ai-web:~# cp /opt/searxng/searxng/searx/settings.yml /opt/searxng/searxng/settings.yml
root@ai-web:~# chown searxng:searxng /opt/searxng/searxng/settings.yml
Générer une clé secrète
root@ai-web:~# runuser -u searxng -- /opt/searxng/venv/bin/python -c "import secrets; print(secrets.token_hex(32))"
Copier la clé qui sera généréé (la longue chaîne hexadécimale) quelque part, on va la coller dans le fichier.
Éditer le fichier de config avec nano
root@ai-web:~# nano /opt/searxng/searxng/settings.yml
Dans le fichier, trouver secret_key et coller la clé copiée précédemment.
secret_key: "COLLER_LA_CLE_ICI"
Puis, dans le même fichier, trouver formats: dans la section search: et ajouter - json
Attention : Il faut respecter l'indentation

root@ai-web:~# nano /etc/systemd/system/searxng.service
Coller ceci :
[Unit]
Description=SearXNG
After=network.target
[Service]
User=searxng
Group=searxng
WorkingDirectory=/opt/searxng/searxng
Environment=SEARXNG_SETTINGS_PATH=/opt/searxng/searxng/settings.yml
ExecStart=/opt/searxng/venv/bin/python -m searx.webapp
Restart=always
[Install]
WantedBy=multi-user.target
Ensuite :
root@ai-web:~# systemctl daemon-reload
root@ai-web:~# systemctl enable searxng
root@ai-web:~# systemctl start searxng
root@ai-web:~# systemctl status searxng

tester que le service répond :
root@ai-web:~# curl -I http://127.0.0.1:8888
HTTP/1.0 200 OK
Ensuite configurer l'interface graphique depuis le menu réglages d'administration


