Jan Server ist die selbst hostbare Hälfte des Jan-Projekts: eine Reihe von Go-Microservices, die eine OpenAI-kompatible API bereitstellen, mit MCP-Tool-Integration, Keycloak-Authentifizierung und einem vorgeschalteten Kong-Gateway. Es ist kein einzelner Container, und das Deployment spiegelt das wider.
Die gute Nachricht: Das Projekt liefert einen Einrichtungsassistenten mit, der die Konfiguration für Sie schreibt. Die wichtigste Entscheidung dabei ist, wo die Inferenz läuft.
Bevor Sie beginnen
- Einen VPS mit mindestens 8 GB RAM — dem vom Projekt angegebenen Minimum, empfohlen werden 12 GB für den vollständigen Satz an Diensten
- Eine saubere Linux-Installation (Ubuntu 24.04 LTS ist eine vernünftige Wahl)
- Docker Engine und Docker Compose v2
makeundgit- Einen Domainnamen, falls Sie TLS wollen — was Sie für alles außer einem Test wollen sollten
Die meisten günstigen VPS-Pläne haben 4 GB und reichen nicht aus. Diese hier erreichen die Grenze:
| Anbieter | Plan | vCPU / RAM / Festplatte | Preis | Link |
|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB | 5,50 EUR/Monat zzgl. MwSt. | Contabo |
| Hetzner Cloud | CX33 | 4 / 8 GB / 80 GB NVMe | 8,49 EUR/Monat zzgl. MwSt. | Hetzner Cloud |
| DigitalOcean | 8-GB-Droplet-Tarif | 8 GB | aktuellen Preis prüfen | DigitalOcean |
| Vultr | 8-GB-Instanz-Tarif | 8 GB | aktuellen Preis prüfen | Vultr |
| Linode | 8-GB-Shared-Tarif | 8 GB | aktuellen Preis prüfen | Linode |
Eine ausführlichere Aufschlüsselung dieser Pläne finden Sie in unserem VPS-Vergleich.
Schritt 1: Verbinden und Abhängigkeiten installieren
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
Bestätigen Sie, dass Sie tatsächlich Compose v2 haben, denn die Compose-Datei von Jan Server nutzt den Schlüssel include:, den v1 nicht kennt:
docker compose version
Schritt 2: Repository klonen
Anders als bei den meisten selbst gehosteten Apps schreiben Sie hier keine eigene docker-compose.yml. Die Compose-Datei des Repositorys zieht Fragmente für Infrastruktur, die API-Dienste, MCP-Tools, die Web-App und die Inferenz hinzu.
git clone https://github.com/janhq/server.git
cd server
Schritt 3: Den Einrichtungsassistenten ausführen
make quickstart
Der Assistent schreibt eine einzelne .env im Root-Verzeichnis und startet danach Compose. Er fragt drei Dinge ab:
- LLM-Anbieter — lokales vLLM, das Modelle herunterlädt und eine GPU erwartet, oder ein entfernter OpenAI-kompatibler Endpunkt, der beides nicht braucht. Wählen Sie auf einem Standard-VPS den entfernten Endpunkt.
- MCP-Suchanbieter — Serper braucht einen API-Key, SearXNG läuft lokal ohne einen, oder Sie deaktivieren die Suche und behalten trotzdem den MCP-Tools-Dienst.
- Media API — aktivieren Sie sie für Uploads, oder lassen Sie sie aus für die kleinstmögliche Laufzeitumgebung.
Können Sie den Assistenten nicht interaktiv ausführen, kopieren Sie stattdessen die Vorlage und befüllen Sie sie:
cp .env.template .env
nano .env
make setup
make setup prüft Abhängigkeiten, legt Verzeichnisse an und zieht die Basis-Images, ohne etwas zu starten.
Schritt 4: Den Stack starten
make up-full
Sobald sich die Container eingependelt haben, stehen Ihnen zur Verfügung:
| Dienst | Port | Zweck |
|---|---|---|
| API-Gateway (Kong) | 8000 | Der Einstiegspunkt für alles |
| LLM API | 8080 | OpenAI-kompatible Chat Completions |
| Response API | 8082 | Mehrstufige Tool-Orchestrierung |
| Media API | 8285 | Uploads und Medien-IDs |
| MCP Tools | 8091 | Suche, Scraping, Codeausführung |
| Web-Chat-UI | 3001 | Der Browser-Client |
| Keycloak | 8085 | Authentifizierungskonsole |
Die API-Dokumentation wird unter http://your-vps-ip:8000/api/swagger/index.html bereitgestellt.
Schritt 5: Absichern, bevor Sie es exponieren
Diesen Schritt sollten Sie nicht überspringen. Zwei Standardeinstellungen sind auf einem öffentlichen Server unsicher:
- Die Keycloak-Konsole wird mit
admin/adminausgeliefert. Ändern Sie das sofort unter Port 8085. Keycloak stellt die Tokens aus, die Kong validiert — diese eine Zugangsdaten schützt also die gesamte API-Oberfläche. - Nur Port 8000 sollte von außen erreichbar sein. Kong erzwingt die JWT- und API-Key-Prüfungen, die dahinterliegenden Dienst-Ports tun das nicht. Binden Sie den Rest an localhost oder blockieren Sie ihn per Firewall.
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
Terminieren Sie TLS anschließend mit Caddy, Traefik oder Nginx und leiten Sie an Port 8000 weiter. Ein unauthentifizierter LLM-Endpunkt im offenen Internet wird gefunden und von jemand anderem genutzt — meist innerhalb weniger Tage.
Inferenz lokal betreiben
Haben Sie lokales vLLM gewählt, definiert das Inferenz-Fragment zwei Profile. Das GPU-Profil betreibt vllm/vllm-openai:v0.11.2 mit janhq/Jan-v1-4B als Standardmodell und reserviert ein NVIDIA-Gerät — es startet also nicht auf einem typischen VPS. Das CPU-Profil läuft ohne GPU und eignet sich durchaus zum Testen, aber die Token-Generierung auf geteilten vCPUs ist so langsam, dass Sie es keinen Nutzern vorsetzen sollten.
GPU-Kapazität zu mieten und Jan Server als entfernten Endpunkt darauf zeigen zu lassen, ist meist günstiger als ein GPU-Server, der zwischen Prompts untätig herumsteht.
Betrieb im Alltag
Auf eine neuere Version aktualisieren:
git pull
docker compose pull
make up-full
Sichern Sie das Postgres-Volume und Ihre .env im Root-Verzeichnis. Die .env enthält die vom Assistenten generierten Secrets, und stellen Sie eine Datenbank ohne sie wieder her, bleiben Sitzungen zurück, die Sie nicht entschlüsseln können.
Prüfen Sie, was ein Dienst gerade tut, mit docker compose logs -f llm-api, wobei Sie den jeweiligen Dienst einsetzen, der Sie interessiert.
Häufige Probleme
| Symptom | Ursache |
|---|---|
include ist kein gültiger Compose-Schlüssel | Docker Compose v1 ist installiert; Sie brauchen v2 |
| Container werden beim Start beendet | Unter 8 GB RAM wird der Stack per OOM-Killer beendet |
| Jeder API-Aufruf liefert 401 | Anfragen treffen direkt einen Dienst-Port statt Kong auf 8000 |
| Der vLLM-Container wird nie healthy | Das GPU-Profil ist auf einem Host ohne NVIDIA-Gerät aktiv |
Jan Server verlangt mehr von einem VPS als eine typische selbst gehostete App, vor allem weil es sein eigenes Gateway, seinen eigenen Identity-Provider und seine eigene Datenbank mitbringt, statt vorauszusetzen, dass Sie diese schon haben. Dimensionieren Sie für 8 GB, legen Sie Kong hinter TLS, und ändern Sie vor allem anderen das Keycloak-Passwort.
Frequently asked questions
Brauche ich eine GPU, um Jan Server selbst auf einem VPS zu hosten?
Nicht, wenn Sie im Einrichtungsassistenten bei der Frage nach dem LLM-Anbieter einen entfernten OpenAI-kompatiblen Endpunkt wählen. Der VPS betreibt dann nur noch API-, Orchestrierungs- und Auth-Dienste. Die lokale vLLM-Option hat ein GPU-Profil, das eine NVIDIA-Karte erwartet, und ein CPU-Profil, das ohne GPU läuft, aber deutlich langsamer ist.
Warum akzeptiert die Keycloak-Konsole admin als Benutzername und Passwort zugleich?
Das sind die Standardzugangsdaten, mit denen das Compose-Setup ausgeliefert wird — auf einem Laptop unproblematisch, auf einem öffentlichen Server aber nicht. Ändern Sie sie, bevor Sie irgendeinen Port ins Internet öffnen, denn der Keycloak-Realm schützt jede API-Route hinter dem Kong-Gateway.
Welchen Port sollte ich hinter meinen Reverse Proxy legen?
Port 8000, das Kong-API-Gateway. Das ist der dokumentierte Einstiegspunkt, und er erzwingt die JWT- und API-Key-Prüfungen vor den einzelnen Diensten. Würden Sie die Dienst-Ports direkt veröffentlichen, könnten Aufrufer das Gateway und dessen Authentifizierung komplett umgehen.