Saltar a contenido

Despliegue de Cortex Server en Railway

Esta guía cubre el despliegue de Cortex Server (modo PostgreSQL self-hosted single-tenant + Streamable MCP + web UI embebida) en Railway.app usando la imagen del GitHub Container Registry público (ghcr.io).


1. Arquitectura en Railway

┌───────────────────────────────────────────────────────────┐
│                      RAILWAY PROJECT                      │
├───────────────────────────────────────────────────────────┤
│ 1. PostgreSQL Service (Postgres 16)                       │
│    • Relational database with RLS enabled.                │
│                                                           │
│ 2. Cortex Server Service (ghcr.io/lleontor705/cortex)     │
│    • HippoRAG + Adaptive-RAG + LightRAG + CRAG.           │
│    • REST /api/*, MCP Streamable /mcp, and the embedded   │
│      web UI at / on one published port.                   │
│                                                           │
│ 3. Ollama Service (Optional - Internal Service)           │
│    • Private local embeddings via *.railway.internal      │
└───────────────────────────────────────────────────────────┘

No hay un servicio web separado. El mismo contenedor sirve la UI, la API y MCP en el puerto configurado por CORTEX_HTTP_PORT, así que un único dominio público es suficiente.


2. Despliegue con la CLI de Railway

Puedes conectar el servicio directamente a la imagen publicada de GHCR:

railway service source connect --image ghcr.io/lleontor705/cortex:latest --service cortex-server

Railway inyecta su propia variable PORT, que Cortex no lee. Configura CORTEX_HTTP_PORT explícitamente y apunta el dominio público del servicio a ese puerto; tanto la UI embebida como la API responden en él.


3. Variables de entorno en Railway

A. Variables del Cortex Server

Variable Descripción / Recomendación Ejemplo
CORTEX_HTTP_PORT Puerto HTTP en el que escucha el servidor (UI, API y MCP lo comparten) 7438
CORTEX_HTTP_HOST Host al que hacer bind 0.0.0.0
CORTEX_HTTP_TOKEN Token de autenticación secreto para API/MCP cortex_admin_secret_token_12345
CORTEX_HTTP_ALLOWED_ORIGINS Orígenes CORS permitidos; la UI embebida es same-origin, así que solo importa para otros clientes de navegador https://cortex-server-production.up.railway.app
CORTEX_SERVER_STORAGE_DRIVER Driver de persistencia postgres
CORTEX_SERVER_STORAGE_DSN DSN para el rol de runtime no privilegiado (cortex_app, con RLS) postgresql://cortex_app:password@postgres.railway.internal:5432/railway?sslmode=require
CORTEX_SERVER_STORAGE_MIGRATION_DSN DSN para el rol de migración privilegiado (cortex_migration) postgresql://cortex_migration:password@postgres.railway.internal:5432/railway
CORTEX_SERVER_TENANT_ID Constante de despliegue: UUID del tenant único 00000000-0000-0000-0000-000000000001
CORTEX_SERVER_WORKSPACE_ID Constante de despliegue: UUID del workspace por defecto 00000000-0000-0000-0000-000000000002
CORTEX_SERVER_PRINCIPAL_SUBJECT Constante de despliegue: subject del principal sintético del bearer 00000000-0000-0000-0000-000000000003
CORTEX_EMBEDDING_PROVIDER Proveedor de embeddings ollama / openai / openai-compatible / none
CORTEX_EMBEDDING_MODEL Modelo de embeddings qwen3-embedding:4b / text-embedding-3-small
CORTEX_EMBEDDING_BASE_URL URL del proveedor de embeddings http://ollama.railway.internal:11434
CORTEX_SERVER_RAILWAY_INTERNAL_EMBEDDING_HOST Hostname privado autorizado para HTTP interno ollama.railway.internal
CORTEX_LLM_PROVIDER Proveedor LLM del servidor openai / anthropic / google
CORTEX_LLM_MODEL Modelo LLM gpt-4o-mini / claude-3-5-sonnet
CORTEX_EMBEDDING_API_KEY Credencial para el proveedor de embeddings sk-...
CORTEX_LLM_BASE_URL URL base del proveedor LLM (opcional) https://api.openai.com/v1
CORTEX_LLM_API_KEY Credencial para el proveedor LLM sk-...

B. Clave de acceso a la web UI

La UI embebida no necesita variables en build-time. Resuelve su origen de API en runtime (el servidor Go sirve /config.js), así que la UI es same-origin por defecto.

En el primer arranque el servidor acuña una clave de acceso web y la imprime una sola vez en los logs de deploy:

cortex: web https://<domain>/
cortex: web key file /home/cortex/.cortex/web.key
cortex: web access key ctx_...

Abre el dominio público del servicio y pega esa clave una vez para desbloquear la superficie. La clave es independiente de CORTEX_HTTP_TOKEN: nunca autentica /api/*, y el bearer de la API nunca desbloquea la UI. Consulta embedded-web.md para el ciclo de vida completo.

Adjunta un volumen de Railway montado en /home/cortex/.cortex para que web.key sobreviva a los redeployes. Sin volumen, cada sistema de ficheros nuevo acuña una nueva clave (impresa otra vez en los logs) y los navegadores deben pegarla de nuevo.


4. Conectar asistentes de IA a Cortex en Railway

Una vez que tu servicio esté desplegado en Railway, puedes conectar tus asistentes de IA:

A. Claude Desktop / Claude Code (claude.json / config.json)

{
  "mcpServers": {
    "cortex-remote": {
      "url": "https://cortex-server.up.railway.app/mcp",
      "headers": {
        "Authorization": "Bearer cortex_admin_secret_token_12345"
      }
    }
  }
}

B. Cursor / Windsurf / OpenCode (opencode.json)

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cortex": {
      "type": "remote",
      "url": "https://cortex-server.up.railway.app/mcp",
      "headers": {
        "Authorization": "Bearer cortex_admin_secret_token_12345"
      }
    }
  }
}

5. Diagnóstico y monitorización

Diagnóstico CLI

# Diagnose the live Railway server
CORTEX_HTTP_TOKEN="cortex_admin_secret_token_12345" cortex doctor --server https://cortex-server.up.railway.app

URLs de health y UI

  • GET https://cortex-server.up.railway.app/health (devuelve {"status":"ok"}).
  • https://cortex-server.up.railway.app/ sirve el shell de la web UI embebida; pega la clave de acceso web para desbloquearla.