Jan Server est la moitié auto-hébergeable du projet Jan : un ensemble de microservices Go qui exposent une API compatible OpenAI, avec intégration d’outils MCP, une authentification Keycloak et une passerelle Kong devant le tout. Ce n’est pas un conteneur unique, et le déploiement s’en ressent.
La bonne nouvelle, c’est que le projet fournit un assistant d’installation qui écrit la configuration à votre place. La principale décision à prendre pendant cette étape concerne l’endroit où tourne l’inférence.
Avant de commencer
- Un VPS avec au moins 8 Go de RAM — le minimum indiqué par le projet, 12 Go étant recommandés pour l’ensemble des services
- Une installation Linux propre (Ubuntu 24.04 LTS est un choix raisonnable)
- Docker Engine et Docker Compose v2
makeetgit- Un nom de domaine si vous voulez du TLS, ce qui est le cas dès que vous dépassez le simple test
La plupart des offres VPS bon marché sont à 4 Go et ne suffisent pas. Voici celles qui franchissent le plancher :
| Hébergeur | Offre | vCPU / RAM / Disque | Prix | Lien |
|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 Go / 100 Go | 5,50 EUR/mois HT | Contabo |
| Hetzner Cloud | CX33 | 4 / 8 Go / 80 Go NVMe | 8,49 EUR/mois HT | Hetzner Cloud |
| DigitalOcean | Palier droplet 8 Go | 8 Go | tarif à vérifier | DigitalOcean |
| Vultr | Palier instance 8 Go | 8 Go | tarif à vérifier | Vultr |
| Linode | Palier partagé 8 Go | 8 Go | tarif à vérifier | Linode |
Pour un comparatif plus détaillé de ces offres, consultez notre comparatif VPS.
Étape 1 : se connecter et installer les dépendances
ssh user@your-vps-ip
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose-v2 make git
sudo systemctl enable --now docker
Vérifiez que vous avez bien Compose v2, car le fichier compose de Jan Server utilise la clé include:, que v1 ne comprend pas :
docker compose version
Étape 2 : cloner le dépôt
Contrairement à la plupart des applications auto-hébergées, vous n’écrivez pas ici votre propre docker-compose.yml. Le fichier compose du dépôt assemble des fragments pour l’infrastructure, les services API, les outils MCP, l’application web et l’inférence.
git clone https://github.com/janhq/server.git
cd server
Étape 3 : lancer l’assistant d’installation
make quickstart
L’assistant écrit un unique .env à la racine puis démarre Compose. Il pose trois questions :
- Fournisseur LLM — vLLM en local, qui télécharge des modèles et attend un GPU, ou un point de terminaison distant compatible OpenAI, qui ne demande ni l’un ni l’autre. Sur un VPS standard, choisissez le point de terminaison distant.
- Fournisseur de recherche MCP — Serper nécessite une clé API, SearXNG tourne en local sans clé, ou vous pouvez désactiver la recherche tout en gardant le service d’outils MCP.
- Media API — activez-la pour les téléversements, ou laissez-la désactivée pour l’empreinte la plus légère.
Si vous ne pouvez pas lancer l’assistant en mode interactif, copiez le modèle et remplissez-le à la place :
cp .env.template .env
nano .env
make setup
make setup vérifie les dépendances, crée les répertoires et récupère les images de base sans rien démarrer.
Étape 4 : démarrer la stack
make up-full
Une fois les conteneurs stabilisés, vous disposez de :
| Service | Port | Rôle |
|---|---|---|
| API Gateway (Kong) | 8000 | Le point d’entrée pour tout |
| LLM API | 8080 | Complétions de chat compatibles OpenAI |
| Response API | 8082 | Orchestration d’outils multi-étapes |
| Media API | 8285 | Téléversements et identifiants média |
| MCP Tools | 8091 | Recherche, extraction web, exécution de code |
| Web chat UI | 3001 | Le client navigateur |
| Keycloak | 8085 | Console d’authentification |
La documentation de l’API est servie sur http://your-vps-ip:8000/api/swagger/index.html.
Étape 5 : sécuriser avant d’exposer
C’est l’étape à ne pas sauter. Deux réglages par défaut sont dangereux sur un serveur public :
- La console Keycloak est livrée avec
admin/admin. Changez cela immédiatement sur le port 8085. Keycloak émet les jetons que Kong valide, donc cet unique identifiant protège toute la surface de l’API. - Seul le port 8000 doit être accessible depuis l’extérieur. Kong impose les vérifications JWT et clé API ; les ports des services derrière lui ne le font pas. Liez le reste à localhost ou bloquez-les au niveau du pare-feu.
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
Terminez ensuite le TLS avec Caddy, Traefik ou Nginx et redirigez vers le port 8000. Laisser un point de terminaison LLM non authentifié sur l’internet public conduit à ce qu’il soit trouvé et utilisé par quelqu’un d’autre, généralement en quelques jours.
Faire tourner l’inférence en local
Si vous avez choisi vLLM en local, le fragment d’inférence définit deux profils. Le profil GPU exécute vllm/vllm-openai:v0.11.2 avec janhq/Jan-v1-4B comme modèle par défaut et réserve un périphérique NVIDIA, donc il ne démarrera pas sur un VPS classique. Le profil CPU fonctionne sans GPU et reste vraiment utilisable pour des tests, mais la génération de tokens sur des vCPU partagés est assez lente pour qu’on évite de l’exposer à des utilisateurs.
Louer de la capacité GPU et y pointer Jan Server comme point de terminaison distant revient généralement moins cher qu’un serveur GPU qui reste inactif entre deux requêtes.
Exploitation au quotidien
Mettre à jour vers une nouvelle version :
git pull
docker compose pull
make up-full
Sauvegardez le volume Postgres et votre .env à la racine. Le .env contient les secrets générés par l’assistant, et restaurer une base sans lui laisse des sessions que vous ne pouvez pas déchiffrer.
Vérifiez ce que fait un service avec docker compose logs -f llm-api, en remplaçant par le service qui vous intéresse.
Problèmes courants
| Symptôme | Cause |
|---|---|
include is not a valid compose key | Docker Compose v1 est installé ; il faut v2 |
| Les conteneurs sont tués au démarrage | Sous 8 Go de RAM, la stack est tuée par OOM |
| Chaque appel API renvoie 401 | Les requêtes atteignent directement un port de service plutôt que Kong sur le 8000 |
| Le conteneur vLLM ne devient jamais sain | Le profil GPU est actif sur un hôte sans périphérique NVIDIA |
Jan Server demande plus à un VPS qu’une application auto-hébergée classique, surtout parce qu’il apporte sa propre passerelle, son fournisseur d’identité et sa base de données plutôt que de supposer que vous les avez déjà. Dimensionnez pour 8 Go, mettez Kong derrière du TLS, et changez le mot de passe Keycloak avant toute autre chose.
Frequently asked questions
Faut-il un GPU pour auto-héberger Jan Server sur un VPS ?
Pas si vous choisissez un point de terminaison distant compatible OpenAI quand l'assistant d'installation demande votre fournisseur LLM. Le VPS ne fait alors tourner que l'API, l'orchestration et les services d'authentification. L'option vLLM en local propose un profil GPU qui attend une carte NVIDIA et un profil CPU qui fonctionne sans GPU, mais à vitesse bien plus faible.
Pourquoi la console Keycloak accepte-t-elle admin comme identifiant et comme mot de passe ?
C'est l'identifiant par défaut fourni par la configuration Compose, acceptable sur un ordinateur portable mais pas sur un serveur public. Changez-le avant d'ouvrir le moindre port vers internet, car c'est le realm Keycloak qui protège chaque route API derrière la passerelle Kong.
Quel port faut-il placer derrière mon reverse proxy ?
Le port 8000, celui de la passerelle API Kong. C'est le point d'entrée documenté, et il impose les vérifications JWT et clé API devant chaque service. Publier directement les ports des services permettrait de contourner entièrement la passerelle et son authentification.