Jan Server is de zelf te hosten helft van het Jan-project: een set Go-microservices die een OpenAI-compatibele API blootstellen, met MCP-toolintegratie, Keycloak-authenticatie en een Kong-gateway ervoor. Het is geen enkele container, en dat zie je terug in de deployment.
Het goede nieuws is dat het project een installatiewizard meelevert die de configuratie voor je schrijft. De belangrijkste beslissing die je daarbij neemt, is waar de inference draait.
Voordat je begint
- Een VPS met minstens 8 GB RAM โ het door het project opgegeven minimum, met 12 GB aanbevolen voor de volledige set diensten
- Een schone Linux-installatie (Ubuntu 24.04 LTS is een verstandige standaardkeuze)
- Docker Engine en Docker Compose v2
makeengit- Een domeinnaam als je TLS wilt, wat je wilt voor alles buiten een test
De meeste goedkope VPS-plannen zijn 4 GB en voldoen niet. Deze halen wel de ondergrens:
| Provider | Plan | vCPU / RAM / Schijf | Prijs | Link |
|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB | 5.50 EUR/mnd excl. btw | Contabo |
| Hetzner Cloud | CX33 | 4 / 8 GB / 80 GB NVMe | 8.49 EUR/mnd excl. btw | Hetzner Cloud |
| DigitalOcean | 8 GB droplet-tier | 8 GB | huidig tarief checken | DigitalOcean |
| Vultr | 8 GB instance-tier | 8 GB | huidig tarief checken | Vultr |
| Linode | 8 GB shared-tier | 8 GB | huidig tarief checken | Linode |
Voor een uitgebreider overzicht van deze plannen, zie onze VPS-vergelijking.
Stap 1: Verbinden en dependencies installeren
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
Controleer of je Compose v2 hebt, want het compose-bestand van Jan Server gebruikt de include:-sleutel die v1 niet begrijpt:
docker compose version
Stap 2: Repository klonen
Anders dan bij de meeste zelf-hosted apps schrijf je hier geen eigen docker-compose.yml. Het compose-bestand van de repository trekt fragmenten binnen voor infrastructuur, de API-diensten, MCP-tools, de webapp en inference.
git clone https://github.com/janhq/server.git
cd server
Stap 3: Installatiewizard uitvoeren
make quickstart
De wizard schrijft รฉรฉn root-.env en start daarna Compose. Er worden drie dingen gevraagd:
- LLM-provider โ lokale vLLM, die modellen downloadt en een GPU verwacht, of een remote OpenAI-compatibel endpoint, waarvoor geen van beide nodig is. Kies op een standaard VPS voor het remote endpoint.
- MCP-zoekprovider โ Serper heeft een API-sleutel nodig, SearXNG draait lokaal zonder sleutel, of je schakelt zoeken uit en houdt de MCP-toolsdienst toch actief.
- Media API โ schakel hem in voor uploads, of laat hem uit voor de kleinste runtime.
Kun je de wizard niet interactief draaien, kopieer dan de template en vul die zelf in:
cp .env.template .env
nano .env
make setup
make setup controleert dependencies, maakt mappen aan en haalt de basisimages op zonder iets te starten.
Stap 4: Stack starten
make up-full
Zodra de containers stabiel draaien, heb je:
| Dienst | Poort | Doel |
|---|---|---|
| API Gateway (Kong) | 8000 | Het toegangspunt voor alles |
| LLM API | 8080 | OpenAI-compatibele chat completions |
| Response API | 8082 | Meerstaps tool-orkestratie |
| Media API | 8285 | Uploads en media-IDโs |
| MCP Tools | 8091 | Zoeken, scraping, code-uitvoering |
| Web chat UI | 3001 | De browserclient |
| Keycloak | 8085 | Authenticatieconsole |
API-documentatie is te vinden op http://your-vps-ip:8000/api/swagger/index.html.
Stap 5: Beveiligen voordat je het blootstelt
Dit is de stap die je niet mag overslaan. Twee standaardinstellingen zijn onveilig op een publieke server:
- De Keycloak-console wordt geleverd met
admin/admin. Wijzig dit meteen op poort 8085. Keycloak geeft de tokens uit die Kong valideert, dus deze ene inlog beschermt het hele API-oppervlak. - Alleen poort 8000 mag van buitenaf bereikbaar zijn. Kong handhaaft de JWT- en API-key-controles; de poorten van de diensten erachter doen dat niet. Bind de rest aan localhost of blokkeer ze in de firewall.
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
Termineer daarna TLS met Caddy, Traefik of Nginx en proxy naar poort 8000. Een ongeauthenticeerd LLM-endpoint op het publieke internet laten staan, zorgt ervoor dat iemand anders het vindt en gebruikt, meestal binnen een paar dagen.
Inference lokaal draaien
Heb je toch voor lokale vLLM gekozen, dan definieert het inference-fragment twee profielen. Het GPU-profiel draait vllm/vllm-openai:v0.11.2 met janhq/Jan-v1-4B als standaardmodel en reserveert een NVIDIA-device, dus het start niet op een gewone VPS. Het CPU-profiel draait zonder GPU en is echt bruikbaar om te testen, maar token-generatie op gedeelde vCPUโs is traag genoeg dat je het niet voor gebruikers wilt inzetten.
GPU-capaciteit huren en Jan Server daarnaar laten wijzen als remote endpoint is meestal goedkoper dan een GPU-server die tussen prompts door stil staat.
Dagelijks beheer
Bijwerken naar een nieuwere release:
git pull
docker compose pull
make up-full
Maak back-ups van het Postgres-volume en je root-.env. De .env bevat de secrets die de wizard genereerde, en een database terugzetten zonder dat bestand levert sessies op die je niet kunt ontsleutelen.
Bekijk wat een dienst aan het doen is met docker compose logs -f llm-api, en vervang dat door de dienst die je wilt controleren.
Veelvoorkomende problemen
| Symptoom | Oorzaak |
|---|---|
include is not a valid compose key | Docker Compose v1 is geรฏnstalleerd; je hebt v2 nodig |
| Containers worden tijdens het opstarten gestopt | Onder 8 GB RAM wordt de stack OOM-killed |
| Elke API-aanroep geeft 401 terug | Requests komen direct op een servicepoort binnen in plaats van via Kong op 8000 |
| vLLM-container wordt nooit healthy | Het GPU-profiel is actief op een host zonder NVIDIA-device |
Jan Server vraagt meer van een VPS dan een typische zelf-hosted app, vooral omdat het zijn eigen gateway, identity provider en database meebrengt in plaats van aan te nemen dat je die al hebt. Ga uit van 8 GB, zet Kong achter TLS, en wijzig het Keycloak-wachtwoord voordat je iets anders doet.
Frequently asked questions
Heb ik een GPU nodig om Jan Server zelf te hosten op een VPS?
Niet als je een remote OpenAI-compatibel endpoint kiest wanneer de installatiewizard naar je LLM-provider vraagt. De VPS draait dan alleen de API-, orkestratie- en auth-diensten. De lokale vLLM-optie heeft een GPU-profiel dat een NVIDIA-kaart verwacht en een CPU-profiel dat zonder GPU werkt, maar veel trager.
Waarom accepteert de Keycloak-console admin als zowel gebruikersnaam als wachtwoord?
Dat is de standaardinlog die bij de compose-setup wordt meegeleverd, en dat is prima op een laptop maar niet op een publieke server. Wijzig het voordat je een poort naar het internet opent, want het Keycloak-realm beschermt elke API-route achter de Kong-gateway.
Welke poort zet ik achter mijn reverse proxy?
Poort 8000, de Kong API-gateway. Dat is het gedocumenteerde toegangspunt en het handhaaft de JWT- en API-key-controles vรณรณr de losse diensten. Poorten van afzonderlijke diensten direct publiceren zou aanroepers de gateway en de bijbehorende authenticatie volledig laten omzeilen.