Ollama permet maintenant d'exécuter un modèle d'intelligence artificielle sur notre VPS. Nous allons ajouter AnythingLLM, une interface Web qui permettra de dialoguer avec ce modèle et de préparer l'exploitation de documents et de connaissances spécialisées.

Nous allons installer AnythingLLM dans un conteneur Docker indépendant, conserver ses données et le rendre accessible par HTTPS grâce à Traefik. Nous connecterons ensuite l'interface à Ollama et effectuerons un premier test.

1. Préparer l'installation

Nous allons conserver les fichiers et les données d'AnythingLLM dans le répertoire /opt/labo/anythingllm, conformément à l'organisation modulaire de notre plateforme.

Depuis le terminal du VPS, créons le répertoire de stockage. Il conservera les données de l'application indépendamment du cycle de vie du conteneur.

mkdir -p /opt/labo/anythingllm/storage

AnythingLLM utilise un compte non privilégié dans son conteneur. Le répertoire de stockage doit donc être accessible à l'utilisateur correspondant, dont l'UID et le GID sont normalement fixés à 1000 dans l'image officielle.

Attribuons le répertoire de stockage à cet utilisateur. Cette opération évite les erreurs d'écriture dans la base de données et les fichiers de l'application.

chown -R 1000:1000 /opt/labo/anythingllm/storage

Cette commande modifie les propriétaires des fichiers de ce répertoire. Elle ne doit pas être appliquée à l'ensemble de /opt/labo, car les autres services possèdent leurs propres données et contraintes.

2. Vérifier les réseaux Docker

AnythingLLM doit pouvoir communiquer avec deux composants distincts : Traefik, pour l'accès HTTPS, et Ollama, pour l'exécution des modèles. Nous allons donc utiliser les réseaux Docker déjà prévus dans notre architecture.

Vérifions la présence du réseau proxy, utilisé par Traefik. Nous ne devons pas le recréer s'il existe déjà.

docker network inspect proxy

Vérifions également le réseau labo-ia, prévu pour les communications entre les composants IA.

docker network inspect labo-ia

Les deux commandes doivent renvoyer les informations des réseaux. Si l'un d'eux n'existe pas, arrêtons-nous pour vérifier la configuration des étapes précédentes avant de le créer ou de modifier les réseaux existants.

3. Préparer le nom de domaine

AnythingLLM sera accessible par un sous-domaine dédié. Dans les exemples de cet article, nous utiliserons anything.votre-domaine.be. Remplaçons cette valeur par le sous-domaine réel choisi pour notre installation.

Dans la configuration DNS du domaine, créons ou vérifions un enregistrement qui dirige ce sous-domaine vers l'adresse IP publique du VPS. La résolution DNS doit être correcte avant de tester l'accès HTTPS.

Nous utiliserons le résolveur de certificats Let's Encrypt déjà configuré dans Traefik sous le nom le. Il n'est pas nécessaire de réinstaller Traefik ni de créer un second résolveur.

4. Créer le fichier Compose

Nous allons utiliser l'image Docker officielle d'AnythingLLM. Le conteneur sera relié aux réseaux proxy et labo-ia. Aucun port applicatif ne sera publié directement sur le VPS : Traefik assurera l'accès depuis le navigateur.

Ouvrons le fichier Compose du service dans Nano. Si le fichier n'existe pas, l'éditeur permettra de le créer.

nano /opt/labo/anythingllm/compose.yaml

Copions la configuration suivante. Elle définit le conteneur, son stockage persistant, les réseaux et les labels nécessaires au routage HTTPS.

Configuration complète. Le routeur Traefik utilise le domaine choisi, l'entrée HTTPS websecure et le résolveur le. Le port interne 3001 correspond au port d'écoute d'AnythingLLM.

Le réseau proxy permet à Traefik d'atteindre l'application. Le réseau labo-ia permettra à AnythingLLM de joindre Ollama via son nom de service Docker.

services:
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    container_name: anythingllm
    restart: unless-stopped

```
cap_add:
  - SYS_ADMIN

environment:
  STORAGE_DIR: /app/server/storage

volumes:
  - ./storage:/app/server/storage

networks:
  - proxy
  - labo-ia

labels:
  - "traefik.enable=true"
  - "traefik.docker.network=proxy"
  - "traefik.http.routers.anythingllm.rule=Host(`anything.votre-domaine.be`)"
  - "traefik.http.routers.anythingllm.entrypoints=websecure"
  - "traefik.http.routers.anythingllm.tls=true"
  - "traefik.http.routers.anythingllm.tls.certresolver=le"
  - "traefik.http.services.anythingllm.loadbalancer.server.port=3001"
```

networks:
proxy:
external: true

labo-ia:
external: true

Dans ce fichier, remplaçons impérativement anything.votre-domaine.be par le nom de domaine réel avant le démarrage. Vérifions également que le résolveur de certificats utilisé dans notre installation Traefik s'appelle bien le.

Dans Nano, enregistrons le fichier avec Ctrl+O, validons avec Entrée, puis quittons avec Ctrl+X.

Pourquoi aucun bloc ports ? Le navigateur contacte Traefik sur le port HTTPS public. Traefik transmet ensuite la requête à AnythingLLM sur le réseau Docker. Nous évitons ainsi de publier directement le port 3001 sur Internet.

5. Vérifier et démarrer AnythingLLM

Avant le démarrage, vérifions que Docker Compose accepte la configuration. Cette commande permet notamment de repérer une erreur de syntaxe YAML ou un problème dans les paramètres du service.

Exécutons les commandes suivantes depuis le répertoire d'AnythingLLM. La première valide et affiche la configuration interprétée.

cd /opt/labo/anythingllm
docker compose config

Si la configuration est valide et que le domaine a été remplacé, démarrons le service.

Docker télécharge l'image si nécessaire, puis crée et démarre le conteneur en arrière-plan.

docker compose up -d

Vérifions l'état du conteneur.

Le service anythingllm doit apparaître comme démarré. Un conteneur en cours d'exécution ne garantit cependant pas encore que l'application a terminé son initialisation.

docker compose ps

En cas de problème, consultons les journaux du conteneur.

Les journaux permettent de repérer une erreur de démarrage, un problème de droits sur le stockage ou une difficulté d'initialisation de la base de données.

docker compose logs --tail=100 anythingllm

6. Accéder à l'interface Web

Lorsque le conteneur a terminé son initialisation, ouvrons le domaine configuré dans un navigateur: https://anything.votre-domaine.be

Remplaçons évidemment ce domaine par le sous-domaine réel. Le navigateur doit afficher l'interface d'AnythingLLM avec une connexion HTTPS valide.

Au premier lancement, suivons l'assistant de configuration proposé par l'application. Les options exactes peuvent varier selon la version de l'image. Nous allons ensuite configurer le fournisseur de modèle pour utiliser Ollama.

7. Connecter AnythingLLM à Ollama

AnythingLLM ne doit pas utiliser localhost pour joindre Ollama. Dans un conteneur Docker, cette adresse désigne le conteneur lui-même, et non celui d'Ollama.

Comme les deux services partagent le réseau Docker labo-ia, AnythingLLM peut joindre Ollama en utilisant le nom du service Docker et son port interne.

Dans les paramètres d'AnythingLLM, ouvrons la configuration du fournisseur de modèles de langage, puis sélectionnons Ollama. Dans le champ de l'adresse du serveur, utilisons l'adresse interne suivante.

http://ollama:11434

Cette adresse suppose que le conteneur Ollama porte bien le nom réseau ollama et qu'il est connecté au réseau labo-ia. Elle ne doit pas être remplacée par http://127.0.0.1:11434 dans la configuration d'AnythingLLM.

Sélectionnons ensuite le modèle installé à l'étape précédente, qwen3:1.7b, si la version utilisée apparaît dans la liste des modèles proposés. Enregistrons les paramètres et vérifions qu'AnythingLLM peut communiquer avec Ollama.

À distinguer : le modèle de langage génère les réponses. Le modèle d'embedding transforme les textes en représentations numériques utiles à la recherche documentaire. Ces deux fonctions sont distinctes. Nous vérifierons les paramètres d'embedding avant de construire notre système RAG.

8. Effectuer un premier test

Nous allons vérifier qu'AnythingLLM peut réellement interroger le modèle installé dans Ollama. Créons ou ouvrons un espace de travail selon les options proposées par l'interface. Dans la fenêtre de discussion, saisissons une question simple, par exemple : « Explique en deux phrases le rôle d'un reverse proxy. »

Si le modèle renvoie une réponse, le chemin entre l'interface AnythingLLM et le moteur Ollama fonctionne. Ce test ne valide pas encore l'importation documentaire ni le RAG, qui feront l'objet d'une étape ultérieure.

Si aucune réponse n'apparaît, vérifions d'abord que le conteneur Ollama fonctionne et que le modèle est présent. Contrôlons ensuite que les deux conteneurs partagent bien le réseau labo-ia.

Sur le VPS, cette commande permet de vérifier les conteneurs du service Ollama et leur état.

docker ps --filter name=ollama

Nous pouvons également vérifier les réseaux auxquels le conteneur AnythingLLM est connecté.

docker inspect anythingllm --format '{{json .NetworkSettings.Networks}}'

La sortie doit montrer les réseaux attendus, notamment labo-ia pour la communication avec Ollama et proxy pour le routage par Traefik.

9. Ce que nous avons construit

AnythingLLM fonctionne maintenant comme un service indépendant sur notre VPS. Traefik assure son accès Web en HTTPS, tandis que le réseau Docker interne permet à l'interface de communiquer avec Ollama.

Les données de l'application sont conservées dans un répertoire persistant. Le conteneur peut donc être recréé sans que les données stockées dans ce répertoire soient automatiquement supprimées.

Nous disposons désormais d'une interface pour interroger notre modèle. La prochaine étape consistera à installer Qdrant, puis à mettre en place la recherche documentaire et le RAG afin d'associer des connaissances spécialisées aux capacités générales du modèle.

À retenir

AnythingLLM fournit l'interface Web, Ollama exécute le modèle, et Traefik centralise l'accès HTTPS. Les réseaux Docker organisent leurs communications sans imposer la publication de tous les ports sur Internet.

Nous avons préparé la base de notre environnement IA. Avant d'ajouter des documents et de construire le RAG, nous devrons vérifier le fonctionnement du fournisseur de langage et choisir une configuration d'embedding adaptée à nos ressources.

Table des matières

Les autres publications de cette section

0:00
0:00
Défiler vers le haut