Jan Server es la mitad autoalojable del proyecto Jan: un conjunto de microservicios en Go que exponen una API compatible con OpenAI, con integración de herramientas MCP, autenticación mediante Keycloak y una puerta de enlace Kong por delante. No es un contenedor único, y el despliegue lo refleja.
La buena noticia es que el proyecto incluye un asistente de configuración que escribe la configuración por ti. La decisión principal que tomas durante el proceso es dónde se ejecuta la inferencia.
Antes de empezar
- Un VPS con al menos 8 GB de RAM — el mínimo indicado por el proyecto, con 12 GB recomendados para el conjunto completo de servicios
- Una instalación limpia de Linux (Ubuntu 24.04 LTS es una opción sensata)
- Docker Engine y Docker Compose v2
makeygit- Un nombre de dominio si quieres TLS, algo necesario para cualquier cosa más allá de una prueba
La mayoría de VPS baratos son de 4 GB y no sirven. Estos superan el suelo:
| Proveedor | Plan | vCPU / RAM / Disco | Precio | Enlace |
|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB | 5.50 EUR/mes sin IVA | Contabo |
| Hetzner Cloud | CX33 | 4 / 8 GB / 80 GB NVMe | 8.49 EUR/mes sin IVA | Hetzner Cloud |
| DigitalOcean | nivel de droplet de 8 GB | 8 GB | consulta la tarifa actual | DigitalOcean |
| Vultr | nivel de instancia de 8 GB | 8 GB | consulta la tarifa actual | Vultr |
| Linode | nivel compartido de 8 GB | 8 GB | consulta la tarifa actual | Linode |
Para un desglose más completo de estos planes, consulta nuestra comparativa de VPS.
Paso 1: Conéctate e instala las dependencias
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
Confirma que tienes Compose v2, porque el fichero compose de Jan Server usa la clave include:, que v1 no entiende:
docker compose version
Paso 2: Clona el repositorio
A diferencia de la mayoría de apps autoalojadas, aquí no escribes tu propio docker-compose.yml. El fichero compose del repositorio incorpora fragmentos para la infraestructura, los servicios de API, las herramientas MCP, la app web y la inferencia.
git clone https://github.com/janhq/server.git
cd server
Paso 3: Ejecuta el asistente de configuración
make quickstart
El asistente escribe un único .env en la raíz y luego arranca Compose. Pregunta tres cosas:
- Proveedor de LLM — vLLM en local, que descarga modelos y espera una GPU, o un endpoint remoto compatible con OpenAI, que no necesita ninguna de las dos cosas. En un VPS estándar, elige el endpoint remoto.
- Proveedor de búsqueda MCP — Serper necesita una clave de API, SearXNG se ejecuta en local sin ninguna, o puedes desactivar la búsqueda y aun así conservar el servicio de herramientas MCP.
- Media API — actívala para subidas de archivos, o déjala apagada para el runtime más ligero.
Si no puedes ejecutar el asistente de forma interactiva, copia la plantilla y rellénala tú mismo:
cp .env.template .env
nano .env
make setup
make setup comprueba las dependencias, crea los directorios y descarga las imágenes base sin arrancar nada.
Paso 4: Arranca la pila
make up-full
Una vez que los contenedores se estabilizan, tienes:
| Servicio | Puerto | Función |
|---|---|---|
| API Gateway (Kong) | 8000 | El punto de entrada para todo |
| LLM API | 8080 | Chat completions compatibles con OpenAI |
| Response API | 8082 | Orquestación de herramientas multi-paso |
| Media API | 8285 | Subidas e IDs de media |
| MCP Tools | 8091 | Búsqueda, scraping, ejecución de código |
| Web chat UI | 3001 | El cliente de navegador |
| Keycloak | 8085 | Consola de autenticación |
La documentación de la API se sirve en http://your-vps-ip:8000/api/swagger/index.html.
Paso 5: Asegúralo antes de exponerlo
Este es el paso que no debes saltarte. Dos valores por defecto son inseguros en un servidor público:
- La consola de Keycloak viene con
admin/admin. Cámbialo de inmediato en el puerto 8085. Keycloak emite los tokens que Kong valida, así que esta única credencial protege toda la superficie de la API. - Solo el puerto 8000 debería ser accesible desde fuera. Kong aplica las comprobaciones de JWT y clave de API; los puertos de servicio detrás de él no lo hacen. Vincula el resto a localhost o bloquéalos en el firewall.
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
Después, termina el TLS con Caddy, Traefik o Nginx y haz proxy al puerto 8000. Dejar un endpoint de LLM sin autenticación en internet hace que alguien lo encuentre y lo use, normalmente en cuestión de días.
Ejecutar la inferencia en local
Si elegiste vLLM en local, el fragmento de inferencia define dos perfiles. El perfil de GPU ejecuta vllm/vllm-openai:v0.11.2 con janhq/Jan-v1-4B como modelo por defecto y reserva un dispositivo NVIDIA, así que no arrancará en un VPS típico. El perfil de CPU funciona sin GPU y es realmente utilizable para pruebas, pero la generación de tokens en vCPU compartidas es lo bastante lenta como para no quererlo delante de usuarios reales.
Alquilar capacidad de GPU y apuntar Jan Server a ella como endpoint remoto suele salir más barato que tener un servidor con GPU parado entre peticiones.
Operación del día a día
Actualizar a una versión más reciente:
git pull
docker compose pull
make up-full
Haz copia de seguridad del volumen de Postgres y de tu .env raíz. El .env guarda los secretos que generó el asistente, y restaurar una base de datos sin él te deja con sesiones que no puedes descifrar.
Comprueba qué está haciendo un servicio con docker compose logs -f llm-api, sustituyendo por el servicio que te interese.
Problemas comunes
| Síntoma | Causa |
|---|---|
include no es una clave válida de compose | Tienes instalado Docker Compose v1; necesitas v2 |
| Los contenedores se matan durante el arranque | Con menos de 8 GB de RAM, la pila recibe un OOM-kill |
| Todas las llamadas a la API devuelven 401 | Las peticiones llegan directamente a un puerto de servicio en vez de a Kong en el 8000 |
| El contenedor de vLLM nunca queda healthy | El perfil de GPU está activo en un host sin dispositivo NVIDIA |
Jan Server exige más a un VPS que una app autoalojada típica, sobre todo porque trae su propia puerta de enlace, proveedor de identidad y base de datos en vez de asumir que ya los tienes. Dimensiona para 8 GB, pon Kong detrás de TLS, y cambia la contraseña de Keycloak antes que nada.
Frequently asked questions
¿Necesito una GPU para autoalojar Jan Server en un VPS?
No, si eliges un endpoint remoto compatible con OpenAI cuando el asistente de configuración pregunte por tu proveedor de LLM. El VPS entonces solo ejecuta los servicios de API, orquestación y autenticación. La opción de vLLM en local tiene un perfil de GPU que espera una tarjeta NVIDIA y un perfil de CPU que funciona sin ella a mucha menos velocidad.
¿Por qué la consola de Keycloak acepta admin como usuario y como contraseña?
Esa es la credencial por defecto que trae la configuración de compose, y está bien en un portátil pero no en un servidor público. Cámbiala antes de abrir cualquier puerto a internet, porque el realm de Keycloak es lo que protege cada ruta de la API detrás de la puerta de enlace Kong.
¿Qué puerto debo poner detrás de mi proxy inverso?
El puerto 8000, la puerta de enlace de API Kong. Es el punto de entrada documentado y aplica las comprobaciones de JWT y clave de API delante de los servicios individuales. Publicar los puertos de los servicios directamente permitiría a quien llame saltarse por completo la puerta de enlace y su autenticación.