Retour au blog

Installer Ollama et Open WebUI sur un VPS Linux sans exposer son IA

Faites tourner vos propres modèles d'IA sur un VPS Linux avec Ollama et Open WebUI, sans laisser l'API ouverte sur Internet : écoute locale, Nginx en HTTPS, pare-feu et dimensionnement RAM/CPU.

Admin
Baie de serveurs câblés dans un datacenter, illustrant l'hébergement d'Ollama et Open WebUI sur un VPS Linux

Héberger sa propre IA sur un VPS Linux avec Ollama et Open WebUI, c'est garder ses conversations chez soi et ne plus payer à la requête. Mais l'API d'Ollama n'a aucune authentification : un port 11434 ouvert sur Internet, c'est une IA offerte à tout le monde. Ce guide vous montre une installation où seul Nginx, en HTTPS, est joignable de l'extérieur.

Pourquoi une instance Ollama exposée pose problème

Ollama fournit une API REST très pratique, mais sans mot de passe ni clé. Quiconque atteint le port peut lister vos modèles, en télécharger de nouveaux jusqu'à remplir le disque, en supprimer, ou lancer des générations qui occupent tout le processeur de votre VPS. Les mainteneurs considèrent que l'authentification doit être confiée à un reverse proxy : c'est donc à vous de la mettre en place.

Le risque n'a rien de théorique. En février 2026, le moteur de recherche de fuites LeakIX recensait plus de 12 000 instances Ollama accessibles sans authentification, dont plus de 1 400 hébergées en France. La même année, une faille de gravité élevée (CVE-2026-7482, surnommée « Bleeding Llama ») permettait de lire la mémoire d'un serveur Ollama joignable, sans aucun identifiant. Une instance qui n'écoute qu'en local n'est tout simplement pas atteignable par ce genre d'attaque.

L'architecture que nous allons mettre en place

  • Ollama écoute uniquement sur 127.0.0.1:11434.
  • Open WebUI tourne dans Docker et écoute uniquement sur 127.0.0.1:3000.
  • Nginx est le seul service public : il reçoit le trafic en HTTPS (port 443) et le transmet à Open WebUI.
  • Le pare-feu n'autorise que SSH, HTTP (pour le certificat) et HTTPS.
  • Open WebUI gère les comptes : un administrateur, inscriptions fermées.

Le guide suppose un VPS Linux sous Ubuntu 24.04 ou Debian 12, un accès sudo, Docker déjà installé (voir notre guide d'installation de Docker sur VPS Linux) et un sous-domaine, par exemple ia.votre-domaine.fr, pointant vers l'adresse IP du serveur.

Quel VPS choisir : grille RAM et CPU sans GPU

Sur un VPS sans carte graphique, tout se joue sur la RAM et le nombre de cœurs. Le modèle doit tenir entièrement en mémoire, avec une marge pour le contexte de conversation, Open WebUI (prévoyez environ 1 Go) et le système. Les tailles ci-dessous sont celles des versions par défaut (quantifiées en 4 bits) publiées dans la bibliothèque d'Ollama.

VPSModèles réalistesExemples (taille du téléchargement)Usage
4 Go de RAM, 2 vCPU1 à 3 milliards de paramètresgemma3:1b (806 Mo), qwen3:1.7b (1,4 Go), llama3.2:3b (2,0 Go)Tests, résumés courts, petit assistant
8 Go de RAM, 3 vCPUJusqu'à 4B confortablement, 8B possible mais justeqwen3:4b (2,5 Go), gemma3:4b (3,4 Go), qwen3:8b (5,2 Go)Usage personnel quotidien
12 Go de RAM, 4 vCPU8B confortablement, 12-14B possible mais justeqwen3:8b (5,2 Go), gemma3:12b (8,2 Go), qwen3:14b (9,3 Go)Rédaction, code, petite équipe
32 Go de RAM et plus (serveur dédié)27 à 32Bgemma3:27b (17 Go), qwen3:32b (20 Go)Qualité supérieure, réponses lentes sans GPU

Chez SoLinux, cela correspond au VPS Linux 04G (4 Go, 2 cœurs, 45 Go NVMe), au VPS Linux 08G (8 Go, 3 cœurs, 50 Go NVMe) et au VPS Linux 12G (12 Go, 4 cœurs, 70 Go NVMe), sans engagement, à partir de 7 € par mois pour le 04G, en France, en Allemagne ou à New York. Pour un usage régulier, le 08G est le meilleur point de départ ; le 12G devient intéressant dès que vous voulez un modèle 8B à l'aise ou plusieurs utilisateurs.

Soyez réaliste sur la vitesse : sans GPU, un modèle 7-8B produit sa réponse mot après mot, à quelques mots par seconde, et le processeur est occupé à 100 % pendant la génération. Les modèles de 3-4B offrent souvent le meilleur compromis. Le stockage NVMe compte surtout pour le chargement initial du modèle en mémoire.

Étape 1 : préparer le serveur et le pare-feu

Commencez par mettre le système à jour, puis fermez tout ce qui n'est pas indispensable. Avec UFW :

sudo apt update && sudo apt upgrade -y
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Si vous préférez nftables directement (et pas en même temps qu'UFW), voici l'équivalent minimal pour la chaîne d'entrée, à placer dans /etc/nftables.conf :

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iif "lo" accept
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
    tcp dport { 22, 80, 443 } accept
  }
}
sudo nft -c -f /etc/nftables.conf   # vérifie la syntaxe
sudo systemctl enable --now nftables

Piège classique : un port publié par Docker avec -p 3000:8080 est ouvert sur toutes les interfaces et contourne les règles UFW, car Docker écrit ses propres règles de pare-feu. C'est pour cette raison que nous ne publierons aucun port Docker dans ce guide.

Étape 2 : installer Ollama et le garder en local

Ollama s'installe sur Linux avec son script officiel, qui crée un utilisateur ollama et un service systemd :

curl -fsSL https://ollama.com/install.sh | sh

Vérifiez ensuite que le service tourne :

ollama --version
sudo systemctl enable --now ollama
sudo systemctl status ollama

Par défaut, Ollama écoute sur 127.0.0.1:11434. Beaucoup de tutoriels vous font passer OLLAMA_HOST à 0.0.0.0 pour que Docker puisse le joindre : c'est précisément ce qui expose l'API. Fixez plutôt l'adresse locale de façon explicite, avec un fichier d'override systemd qui survivra aux mises à jour :

sudo systemctl edit ollama

Ajoutez ces lignes dans la zone prévue :

[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_NUM_PARALLEL=1"

Les deux dernières variables limitent Ollama à un modèle chargé et une requête à la fois : sur un VPS sans GPU, cela évite de saturer la RAM. Rechargez et contrôlez l'écoute :

sudo systemctl daemon-reload
sudo systemctl restart ollama
sudo ss -tlnp | grep 11434
# attendu : 127.0.0.1:11434, jamais 0.0.0.0:11434 ni [::]:11434
curl http://127.0.0.1:11434
# attendu : Ollama is running

Téléchargez ensuite un modèle adapté à votre VPS et testez-le en ligne de commande :

ollama pull qwen3:4b
ollama run qwen3:4b "Explique en une phrase ce qu'est un reverse proxy."
ollama list

Étape 3 : lancer Open WebUI avec Docker, sans port public

La commande de démarrage rapide d'Open WebUI publie le port 3000 et joint Ollama via host.docker.internal, ce qui oblige Ollama à écouter sur toutes les interfaces. Nous faisons autrement : le conteneur partage la pile réseau de l'hôte (--network=host), joint Ollama sur 127.0.0.1 et n'écoute lui-même que sur 127.0.0.1:3000 grâce aux variables HOST et PORT.

# clé secrète fixe : sans elle, les sessions sautent à chaque redémarrage
sudo mkdir -p /etc/open-webui
openssl rand -hex 32 | sudo tee /etc/open-webui/secret > /dev/null
sudo chmod 600 /etc/open-webui/secret

DOMAINE=ia.votre-domaine.fr   # votre sous-domaine

sudo docker run -d --name open-webui \
  --network=host \
  -e HOST=127.0.0.1 \
  -e PORT=3000 \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  -e WEBUI_SECRET_KEY="$(sudo cat /etc/open-webui/secret)" \
  -e CORS_ALLOW_ORIGIN="https://$DOMAINE" \
  -v open-webui:/app/backend/data \
  --restart always \
  ghcr.io/open-webui/open-webui:main

Le volume open-webui conserve les comptes, les conversations et les réglages. Pour la production, vous pouvez remplacer l'étiquette main par un numéro de version précis afin de choisir vous-même le moment des mises à jour. Vérifiez l'écoute après une minute (le premier démarrage est un peu long) :

sudo ss -tlnp | grep 3000
# attendu : 127.0.0.1:3000
curl -I http://127.0.0.1:3000

Étape 4 : créer le compte administrateur avant toute exposition

Le premier compte créé sur Open WebUI devient administrateur. Ne laissez pas cette place à un inconnu qui tomberait sur votre sous-domaine avant vous : créez-le avant de configurer Nginx, à travers un tunnel SSH. Depuis votre ordinateur :

ssh -L 3000:127.0.0.1:3000 utilisateur@IP_DU_VPS

Ouvrez ensuite http://localhost:3000 dans le navigateur de votre ordinateur et créez le compte administrateur avec un mot de passe long et unique. Puis, dans les réglages d'administration (section des utilisateurs ou des inscriptions, selon la version) :

  • désactivez les nouvelles inscriptions ;
  • si vous devez les laisser ouvertes un moment, gardez le rôle par défaut des nouveaux utilisateurs sur « en attente » (pending) : chaque compte devra être validé par vous ;
  • créez vous-même les comptes de vos collaborateurs depuis la gestion des utilisateurs.

Ne désactivez jamais l'authentification (WEBUI_AUTH=False) sur une instance accessible depuis Internet.

Étape 5 : Nginx en HTTPS devant Open WebUI

Installez Nginx et Certbot :

sudo apt install -y nginx certbot python3-certbot-nginx

Ajoutez une limite de tentatives de connexion, dans /etc/nginx/conf.d/limites.conf :

limit_req_zone $binary_remote_addr zone=owui_login:10m rate=5r/m;

Puis créez /etc/nginx/sites-available/open-webui. Open WebUI utilise des WebSockets et diffuse ses réponses en continu : il faut donc passer en HTTP/1.1, transmettre les en-têtes Upgrade et désactiver la mise en tampon, sans quoi les réponses arrivent d'un bloc ou se coupent.

server {
    listen 80;
    server_name ia.votre-domaine.fr;

    client_max_body_size 50M;

    # limite les essais de mot de passe
    location = /api/v1/auths/signin {
        limit_req zone=owui_login burst=5 nodelay;
        proxy_pass http://127.0.0.1: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;
    }

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 1800s;
        proxy_send_timeout 1800s;
    }
}

Activez le site, testez la configuration et demandez le certificat. Certbot ajoute lui-même le bloc HTTPS sur le port 443 et la redirection depuis HTTP :

sudo ln -s /etc/nginx/sites-available/open-webui /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d ia.votre-domaine.fr --redirect
sudo certbot renew --dry-run

Pour une petite équipe, vous pouvez ajouter une seconde barrière avec auth_basic dans le bloc location /, ou restreindre l'accès à quelques adresses IP avec allow et deny. Ces protections s'ajoutent au compte Open WebUI, elles ne le remplacent pas.

Vérifier que rien n'est exposé

Sur le serveur, listez les ports en écoute : seuls 22, 80 et 443 doivent apparaître sur une adresse publique.

sudo ss -tlnp

Depuis votre ordinateur, testez l'adresse IP du VPS : les ports 11434 et 3000 doivent refuser la connexion ou ne pas répondre. Seul votre sous-domaine en HTTPS, ouvert dans votre navigateur, doit afficher la page de connexion.

nc -zv -w 3 IP_DU_VPS 11434   # doit échouer
nc -zv -w 3 IP_DU_VPS 3000    # doit échouer

Maintenir l'installation à jour

  • Ollama : relancez le script d'installation officiel. Votre override systemd est conservé ; contrôlez quand même l'écoute avec ss -tlnp après chaque mise à jour. La faille CVE-2026-7482 est corrigée depuis la version 0.17.1 : vérifiez la vôtre avec ollama --version et ne laissez pas traîner une version ancienne.
  • Open WebUI : docker pull de l'image, puis docker stop, docker rm et relance de la même commande docker run. Le volume garde vos données.
  • Sauvegardes : sauvegardez régulièrement le volume open-webui (comptes et conversations) ; les modèles, eux, se retéléchargent.
  • Journaux : journalctl -u ollama, docker logs open-webui et /var/log/nginx/ pour repérer les tentatives de connexion répétées.

Questions fréquentes

Faut-il un GPU pour faire tourner Ollama sur un VPS ?

Non. Ollama fonctionne sur processeur seul. Les réponses sont plus lentes qu'avec une carte graphique, mais un modèle de 3 à 8 milliards de paramètres reste tout à fait utilisable sur un VPS de 8 à 12 Go de RAM.

Comment utiliser l'API d'Ollama depuis une autre machine sans l'exposer ?

Passez par un tunnel SSH : ssh -L 11434:127.0.0.1:11434 utilisateur@IP_DU_VPS, puis interrogez http://localhost:11434 depuis votre ordinateur. Pour une application tierce, Open WebUI peut aussi fournir des clés d'API par utilisateur, derrière votre Nginx en HTTPS.

Open WebUI n'affiche aucun modèle, que faire ?

Vérifiez que ollama list renvoie bien des modèles, que curl http://127.0.0.1:11434 répond, et que le conteneur a été lancé avec --network=host et OLLAMA_BASE_URL=http://127.0.0.1:11434. La connexion se contrôle aussi dans les réglages d'administration, rubrique des connexions.

Combien de personnes peuvent l'utiliser en même temps ?

Sans GPU, comptez une génération à la fois : les autres requêtes attendent leur tour. Pour deux ou trois utilisateurs occasionnels, un VPS 12G avec un modèle 4B ou 8B convient ; au-delà, un serveur dédié avec plus de cœurs et de RAM devient nécessaire.