OmniRoute — Deployment Guide on VM with Cloudflare (Español)
Requisitos previos
Sección titulada «Requisitos previos»| Elemento | Mínimo | Recomendado |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| Disco | 10 GB SSD | 25 GB SSD |
| SO | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
| Dominio | Registrado en Cloudflare | — |
| Docker | Docker Engine 24+ | Docker 27+ |
Proveedores probados: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail.
1. Configurar la máquina virtual
Sección titulada «1. Configurar la máquina virtual»1.1 Crear la instancia
Sección titulada «1.1 Crear la instancia»En su proveedor de VPS preferido:
- Elija Ubuntu 24.04 LTS
- Seleccione el plan mínimo (1 vCPU / 1 GB RAM)
- Establezca una contraseña segura para root o configure una clave SSH
- Anote la IP pública (p. ej.,
203.0.113.10)
1.2 Conectarse mediante SSH
Sección titulada «1.2 Conectarse mediante SSH»ssh root@203.0.113.101.3 Actualizar el sistema
Sección titulada «1.3 Actualizar el sistema»apt update && apt upgrade -y1.4 Instalar Docker
Sección titulada «1.4 Instalar Docker»# Instalar dependenciasapt install -y ca-certificates curl gnupg
# Añadir el repositorio oficial de Dockerinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpgchmod a+r /etc/apt/keyrings/docker.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $ (. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/nullapt updateapt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin1.5 Instalar nginx
Sección titulada «1.5 Instalar nginx»apt install -y nginx1.6 Configurar el firewall (UFW)
Sección titulada «1.6 Configurar el firewall (UFW)»ufw default deny incomingufw default allow outgoingufw allow 22/tcp # SSHufw allow 80/tcp # HTTP (redirección)ufw allow 443/tcp # HTTPSufw enableConsejo: Para obtener la máxima seguridad, restrinja los puertos 80 y 443 únicamente a las IP de Cloudflare. Consulte la sección Seguridad avanzada.
2. Instalar OmniRoute
Sección titulada «2. Instalar OmniRoute»2.1 Crear el directorio de configuración
Sección titulada «2.1 Crear el directorio de configuración»mkdir -p /opt/omniroute2.2 Crear el archivo de variables de entorno
Sección titulada «2.2 Crear el archivo de variables de entorno»cat > /opt/omniroute/.env << 'EOF'# === Seguridad ===JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEYINITIAL_PASSWORD=YourSecurePassword123!API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEYSTORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEYSTORAGE_ENCRYPTION_KEY_VERSION=v1MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALTOMNIROUTE_WS_BRIDGE_SECRET=REPLACE-WITH-WS-BRIDGE-SECRET # OBLIGATORIO en producción: utilizado por el puente WS de Codex Responses
# === Aplicación ===PORT=20128NODE_ENV=productionHOSTNAME=0.0.0.0DATA_DIR=/app/dataAPP_LOG_TO_FILE=trueAUTH_COOKIE_SECURE=trueREQUIRE_API_KEY=false
# === URL (cámbielas por su dominio) ===# URL base interna de servidor a servidor para tareas programadas y solicitudes internas.BASE_URL=http://127.0.0.1:20128# URL orientada al navegador utilizada para devoluciones de llamada de OAuth, enlaces del panel y URL públicas generadas.NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com# Sustitución explícita opcional del origen público para las URL de recursos públicos generadas.# OMNIROUTE_PUBLIC_BASE_URL=https://llms.seudominio.com
# === Sincronización en la nube (opcional) ===# CLOUD_URL=https://cloud.omniroute.online# NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.onlineEOF⚠️ IMPORTANTE: ¡Genere claves secretas únicas! Utilice
openssl rand -hex 32para cada clave.
2.3 Iniciar el contenedor
Sección titulada «2.3 Iniciar el contenedor»docker pull diegosouzapw/omniroute:latest
docker run -d \ --name omniroute \ --restart unless-stopped \ --env-file /opt/omniroute/.env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest2.4 Verificar que esté en ejecución
Sección titulada «2.4 Verificar que esté en ejecución»docker ps | grep omniroutedocker logs omniroute --tail 20Debería mostrar: [DB] SQLite database ready y listening on port 20128.
3. Configurar nginx (proxy inverso)
Sección titulada «3. Configurar nginx (proxy inverso)»3.1 Generar el certificado SSL (origen de Cloudflare)
Sección titulada «3.1 Generar el certificado SSL (origen de Cloudflare)»En el panel de Cloudflare:
- Ve a SSL/TLS → Servidor de origen
- Haz clic en Crear certificado
- Mantén los valores predeterminados (15 años, *.yourdomain.com)
- Copia el Certificado de origen y la Clave privada
mkdir -p /etc/nginx/ssl
# Pega el certificadonano /etc/nginx/ssl/origin.crt
# Pega la clave privadanano /etc/nginx/ssl/origin.key
chmod 600 /etc/nginx/ssl/origin.key3.2 Configuración de Nginx
Sección titulada «3.2 Configuración de Nginx»cat > /etc/nginx/sites-available/omniroute << 'NGINX'# Servidor predeterminado — bloquea el acceso directo mediante IPserver { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/nginx/ssl/origin.crt; ssl_certificate_key /etc/nginx/ssl/origin.key; server_name _; return 444;}
# OmniRoute — HTTPSserver { listen 443 ssl; listen [::]:443 ssl; server_name llms.yourdomain.com; # Cámbialo por tu dominio
ssl_certificate /etc/nginx/ssl/origin.crt; ssl_certificate_key /etc/nginx/ssl/origin.key; ssl_protocols TLSv1.2 TLSv1.3;
client_max_body_size 100M;
location / { proxy_pass http://127.0.0.1:20128; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
# Compatibilidad con WebSocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
# SSE (eventos enviados por el servidor) — respuestas de IA en streaming proxy_buffering off; proxy_cache off; proxy_read_timeout 600s; proxy_send_timeout 600s; }}
# Redirección de HTTP → HTTPSserver { listen 80; listen [::]:80; server_name llms.yourdomain.com; return 301 https://$server_name$request_uri;}NGINXMantén los tiempos de espera del flujo del proxy inverso alineados con las variables de entorno de tiempo de espera de OmniRoute. Si aumentas
FETCH_TIMEOUT_MS / STREAM_IDLE_TIMEOUT_MS, aumenta proxy_read_timeout / proxy_send_timeout
por encima del mismo umbral.
OmniRoute usa NEXT_PUBLIC_BASE_URL como el origen canónico visible para el navegador para las
devoluciones de llamada de OAuth y los enlaces públicos generados. Las escrituras autenticadas del panel usan solicitudes del mismo origen
junto con protección CSRF vinculada a la sesión, por lo que no requieren una URL base pública estática. Los
encabezados X-Forwarded-* anteriores siguen siendo metadatos de enrutamiento útiles, pero no sustituyen
la configuración de la URL pública explícita cuando OAuth o los enlaces generados para el navegador la necesitan. Habilita
OMNIROUTE_TRUST_PROXY únicamente si los clientes no pueden acceder directamente a OmniRoute y tu proxy
elimina/reconstruye los encabezados reenviados entrantes.
3.3 Habilitar y probar
Sección titulada «3.3 Habilitar y probar»# Elimina la configuración predeterminadarm -f /etc/nginx/sites-enabled/default
# Habilita OmniRouteln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
# Prueba y recarganginx -t && systemctl reload nginx4. Configurar el DNS de Cloudflare
Sección titulada «4. Configurar el DNS de Cloudflare»4.1 Añadir un registro DNS
Sección titulada «4.1 Añadir un registro DNS»En el panel de Cloudflare → DNS:
| Tipo | Nombre | Contenido | Proxy |
|---|---|---|---|
| A | llms |
203.0.113.10 (IP de la VM) |
✅ Con proxy |
4.2 Configurar SSL
Sección titulada «4.2 Configurar SSL»En SSL/TLS → Información general:
- Modo: Completo (estricto)
En SSL/TLS → Certificados perimetrales:
- Usar siempre HTTPS: ✅ Activado
- Versión mínima de TLS: TLS 1.2
- Reescrituras HTTPS automáticas: ✅ Activadas
4.3 Pruebas
Sección titulada «4.3 Pruebas»curl -sI https://llms.seudominio.com/health# Debe devolver HTTP/2 2005. Operaciones y mantenimiento
Sección titulada «5. Operaciones y mantenimiento»Actualizar a una nueva versión
Sección titulada «Actualizar a una nueva versión»docker pull diegosouzapw/omniroute:latestdocker stop omniroute && docker rm omniroutedocker run -d --name omniroute --restart unless-stopped \ --env-file /opt/omniroute/.env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latestVer los registros
Sección titulada «Ver los registros»docker logs -f omniroute # Flujo en tiempo realdocker logs omniroute --tail 50 # Últimas 50 líneasCopia de seguridad manual de la base de datos
Sección titulada «Copia de seguridad manual de la base de datos»# Copiar los datos del volumen al hostdocker cp omniroute:/app/data ./backup-$(date +%F)
# O comprimir el volumen completodocker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /dataRestaurar desde una copia de seguridad
Sección titulada «Restaurar desde una copia de seguridad»docker stop omniroutedocker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /"docker start omniroute6. Seguridad avanzada
Sección titulada «6. Seguridad avanzada»Restringir nginx a las IP de Cloudflare
Sección titulada «Restringir nginx a las IP de Cloudflare»cat > /etc/nginx/cloudflare-ips.conf << 'CF'# Rangos IPv4 de Cloudflare — actualizar periódicamente# https://www.cloudflare.com/ips-v4/set_real_ip_from 173.245.48.0/20;set_real_ip_from 103.21.244.0/22;set_real_ip_from 103.22.200.0/22;set_real_ip_from 103.31.4.0/22;set_real_ip_from 141.101.64.0/18;set_real_ip_from 108.162.192.0/18;set_real_ip_from 190.93.240.0/20;set_real_ip_from 188.114.96.0/20;set_real_ip_from 197.234.240.0/22;set_real_ip_from 198.41.128.0/17;set_real_ip_from 162.158.0.0/15;set_real_ip_from 104.16.0.0/13;set_real_ip_from 104.24.0.0/14;set_real_ip_from 172.64.0.0/13;set_real_ip_from 131.0.72.0/22;real_ip_header CF-Connecting-IP;CFAñada lo siguiente a nginx.conf dentro del bloque http {}:
include /etc/nginx/cloudflare-ips.conf;Instalar fail2ban
Sección titulada «Instalar fail2ban»apt install -y fail2bansystemctl enable fail2bansystemctl start fail2ban
# Comprobar el estadofail2ban-client status sshdBloquear el acceso directo al puerto de Docker
Sección titulada «Bloquear el acceso directo al puerto de Docker»# Impedir el acceso externo directo al puerto 20128iptables -I DOCKER-USER -p tcp --dport 20128 -j DROPiptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
# Hacer persistentes las reglasapt install -y iptables-persistentnetfilter-persistent save7. Desplegar en Cloudflare Workers (opcional)
Sección titulada «7. Desplegar en Cloudflare Workers (opcional)»Para acceder de forma remota mediante Cloudflare Workers (sin exponer directamente la VM):
# En el repositorio localcd omnirouteCloudnpm installnpx wrangler loginnpx wrangler deployConsulte también TUNNELS_GUIDE.md para ver la guía paso a paso de Cloudflare Tunnel incluida en el repositorio. El worker independiente omnirouteCloud/ se encuentra en un repositorio complementario separado.
Resumen de puertos
Sección titulada «Resumen de puertos»| Puerto | Servicio | Acceso |
|---|---|---|
| 22 | SSH | Público (con fail2ban) |
| 80 | nginx HTTP | Redirección → HTTPS |
| 443 | nginx HTTPS | Mediante el proxy de Cloudflare |
| 20128 | OmniRoute | Solo localhost (mediante nginx) |
Optimización para poca memoria / VPS pequeños
Sección titulada «Optimización para poca memoria / VPS pequeños»Para implementaciones en instancias VPS pequeñas (1 GB de RAM o menos):
- Deshabilite los servicios en segundo plano — establezca
OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1para omitir el programador, el servidor MCP y las tareas periódicas de mantenimiento. Consultedocs/reference/ENVIRONMENT.md. - Use el modo WAL de SQLite — está habilitado de forma predeterminada y reduce el uso máximo de memoria durante las lecturas simultáneas.
- Limite el heap de V8 — establezca
OMNIROUTE_MEMORY_MB(p. ej.,512) para que el entorno de ejecución no calcule un límite superior al de la máquina virtual. Consultedocs/reference/ENVIRONMENT.md. - La admisión de cargas pesadas se ajusta automáticamente según el límite del heap – una vez establecido
OMNIROUTE_MEMORY_MBcomo se indica arriba, el presupuesto de bytes de entrada (OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES) se deriva de ese mismo límite, por lo que una máquina virtual con memoria limitada obtiene automáticamente un presupuesto menor de solicitudes simultáneas sin ajustes adicionales; las solicitudes excedentes reciben un503reintentable conRetry-After, en lugar de competir por la memoria. Establezca el límite heredado por número de solicitudesOMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHTsolo si necesita un límite estricto adicional. - Evite ejecutar
next builden el VPS — compile localmente e implemente la salida independiente (.next/standalone/). - Supervise con
top/free -m— OmniRoute suele utilizar entre 200 y 400 MB de RSS en reposo en una máquina virtual de 1 GB.
HagiCode
HagiCode es un espacio de trabajo de programación con agentes, flujos estructurados, ejecución multiagente y vistas de Hero Dungeon.
Convierte ideas en software útil con un flujo de trabajo con agentes más inteligente, rápido y ameno.

- SmartLos flujos estructurados convierten la intención en un itinerario ejecutable desde la idea hasta la entrega.
- EfficientLos flujos multiagente permiten avanzar en paralelo con la investigación, implementación y revisión.
- FunHero Dungeon hace que las largas sesiones de programación sean visuales y colaborativas.