Pular para o conteúdo
OmniRoute source

OmniRoute — Deployment Guide on VM with Cloudflare (Português (Brasil))

Item Mínimo Recomendado
CPU 1 vCPU 2 vCPU
RAM 1 GB 2 GB
Disco SSD de 10 GB SSD de 25 GB
SO Ubuntu 22.04 LTS Ubuntu 24.04 LTS
Domínio Registrado na Cloudflare —
Docker Docker Engine 24+ Docker 27+

Provedores testados: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail.


No provedor de VPS de sua preferência:

  • Escolha o Ubuntu 24.04 LTS
  • Selecione o plano mínimo (1 vCPU / 1 GB de RAM)
  • Defina uma senha forte para o usuário root ou configure uma chave SSH
  • Anote o IP público (por exemplo, 203.0.113.10)
Janela do terminal
ssh root@203.0.113.10
Janela do terminal
apt update && apt upgrade -y
Janela do terminal
# Instale as dependências
apt install -y ca-certificates curl gnupg
# Adicione o repositório oficial do Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "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/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Janela do terminal
apt install -y nginx
Janela do terminal
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP (redirecionamento)
ufw allow 443/tcp # HTTPS
ufw enable

Dica: Para obter o máximo de segurança, restrinja as portas 80 e 443 apenas aos IPs da Cloudflare. Consulte a seção Segurança avançada.


Janela do terminal
mkdir -p /opt/omniroute
Janela do terminal
cat > /opt/omniroute/.env << 'EOF'
# === Segurança ===
JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEY
INITIAL_PASSWORD=YourSecurePassword123!
API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEY
STORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEY
STORAGE_ENCRYPTION_KEY_VERSION=v1
MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALT
OMNIROUTE_WS_BRIDGE_SECRET=REPLACE-WITH-WS-BRIDGE-SECRET # OBRIGATÓRIO em produção: usado pela ponte WS do Codex Responses
# === Aplicativo ===
PORT=20128
NODE_ENV=production
HOSTNAME=0.0.0.0
DATA_DIR=/app/data
APP_LOG_TO_FILE=true
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=false
# === URLs (altere para o seu domínio) ===
# URL base interna de servidor para servidor, usada por tarefas agendadas e autorrequisições.
BASE_URL=http://127.0.0.1:20128
# URL voltada ao navegador, usada para callbacks OAuth, links do painel e URLs públicas geradas.
NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com
# Substituição explícita e opcional da origem pública para URLs geradas de ativos públicos.
# OMNIROUTE_PUBLIC_BASE_URL=https://llms.seudominio.com
# === Sincronização com a nuvem (opcional) ===
# CLOUD_URL=https://cloud.omniroute.online
# NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online
EOF

⚠️ IMPORTANTE: Gere chaves secretas exclusivas! Use openssl rand -hex 32 para cada chave.

Janela do terminal
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:latest
Janela do terminal
docker ps | grep omniroute
docker logs omniroute --tail 20

A saída deve exibir: [DB] SQLite database ready e listening on port 20128.


No painel da Cloudflare:

  1. Acesse SSL/TLS → Origin Server
  2. Clique em Create Certificate
  3. Mantenha os valores padrão (15 anos, *.yourdomain.com)
  4. Copie o Origin Certificate e a Private Key
Janela do terminal
mkdir -p /etc/nginx/ssl
# Cole o certificado
nano /etc/nginx/ssl/origin.crt
# Cole a chave privada
nano /etc/nginx/ssl/origin.key
chmod 600 /etc/nginx/ssl/origin.key
Janela do terminal
cat > /etc/nginx/sites-available/omniroute << 'NGINX'
# Servidor padrão — bloqueia o acesso direto via IP
server {
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 — HTTPS
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name llms.yourdomain.com; # Altere para o seu domínio
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;
# Suporte a WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# SSE (Server-Sent Events) — respostas de IA em streaming
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
# Redirecionamento de HTTP → HTTPS
server {
listen 80;
listen [::]:80;
server_name llms.yourdomain.com;
return 301 https://$server_name$request_uri;
}
NGINX

Mantenha os tempos limite de streaming do proxy reverso alinhados às variáveis de ambiente de tempo limite do OmniRoute. Se você aumentar FETCH_TIMEOUT_MS / STREAM_IDLE_TIMEOUT_MS, aumente proxy_read_timeout / proxy_send_timeout para acima do mesmo limite.

O OmniRoute usa NEXT_PUBLIC_BASE_URL como a origem canônica voltada ao navegador para callbacks de OAuth e links públicos gerados. As gravações autenticadas do painel usam solicitações de mesma origem com proteção CSRF vinculada à sessão, portanto, não exigem uma URL base pública estática. Os cabeçalhos X-Forwarded-* acima ainda são metadados de roteamento úteis, mas não substituem a definição explícita da URL pública quando o OAuth ou os links gerados para o navegador precisarem dela. Habilite OMNIROUTE_TRUST_PROXY somente se o OmniRoute não estiver diretamente acessível aos clientes e o seu proxy remover/recriar os cabeçalhos encaminhados recebidos.

Janela do terminal
# Remova a configuração padrão
rm -f /etc/nginx/sites-enabled/default
# Habilite o OmniRoute
ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
# Teste e recarregue
nginx -t && systemctl reload nginx

No painel da Cloudflare → DNS:

Tipo Nome Conteúdo Proxy
A llms 203.0.113.10 (IP da VM) ✅ Com proxy

Em SSL/TLS → Visão geral:

  • Modo: Completo (Estrito)

Em SSL/TLS → Certificados de borda:

  • Sempre usar HTTPS: ✅ Ativado
  • Versão mínima do TLS: TLS 1.2
  • Regravações automáticas de HTTPS: ✅ Ativadas
Janela do terminal
curl -sI https://llms.seudominio.com/health
# Deve retornar HTTP/2 200

Janela do terminal
docker pull diegosouzapw/omniroute:latest
docker stop omniroute && docker rm omniroute
docker run -d --name omniroute --restart unless-stopped \
--env-file /opt/omniroute/.env \
-p 20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
Janela do terminal
docker logs -f omniroute # Fluxo em tempo real
docker logs omniroute --tail 50 # Últimas 50 linhas
Janela do terminal
# Copiar os dados do volume para o host
docker cp omniroute:/app/data ./backup-$(date +%F)
# Ou compactar o volume inteiro
docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data
Janela do terminal
docker stop omniroute
docker 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 omniroute

Janela do terminal
cat > /etc/nginx/cloudflare-ips.conf << 'CF'
# Intervalos IPv4 da Cloudflare — atualize periodicamente
# 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;
CF

Adicione o seguinte ao nginx.conf, dentro do bloco http {}:

include /etc/nginx/cloudflare-ips.conf;
Janela do terminal
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# Verificar o status
fail2ban-client status sshd
Janela do terminal
# Impedir o acesso externo direto à porta 20128
iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP
iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
# Tornar as regras persistentes
apt install -y iptables-persistent
netfilter-persistent save

Para acesso remoto por meio do Cloudflare Workers (sem expor a VM diretamente):

Janela do terminal
# No repositório local
cd omnirouteCloud
npm install
npx wrangler login
npx wrangler deploy

Consulte também TUNNELS_GUIDE.md para obter o passo a passo do Cloudflare Tunnel incluído no repositório. O worker independente em omnirouteCloud/ está localizado em um repositório complementar separado.


Porta Serviço Acesso
22 SSH Público (com fail2ban)
80 nginx HTTP Redirecionamento → HTTPS
443 nginx HTTPS Via proxy da Cloudflare
20128 OmniRoute Somente localhost (via nginx)

Para implantações em instâncias VPS pequenas (1 GB de RAM ou menos):

  • Desative os serviços em segundo plano — defina OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1 para ignorar o agendador, o servidor MCP e as tarefas periódicas de manutenção. Consulte docs/reference/ENVIRONMENT.md.
  • Use o modo WAL do SQLite — habilitado por padrão, reduz o pico de uso de memória durante leituras simultâneas.
  • Limite o heap do V8 — defina OMNIROUTE_MEMORY_MB (por exemplo, 512) para que o ambiente de execução não calibre um limite maior que o da VM. Consulte docs/reference/ENVIRONMENT.md.
  • O controle de admissão de cargas pesadas é dimensionado automaticamente de acordo com o limite do heap – depois que OMNIROUTE_MEMORY_MB é definido conforme indicado acima, o orçamento de bytes de ingestão (OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES) é derivado desse mesmo limite. Assim, uma VM com memória limitada já recebe um orçamento menor para solicitações simultâneas sem necessidade de ajustes adicionais; as solicitações excedentes recebem uma resposta 503 que permite nova tentativa, com Retry-After, em vez de competir por memória. Defina o limite legado de contagem de solicitações OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT somente se você precisar de um limite rígido adicional.
  • Evite executar next build na VPS — faça a compilação localmente e implante a saída independente (.next/standalone/).
  • Monitore com top / free -m — em uma VM de 1 GB, o OmniRoute normalmente usa de 200 a 400 MB de RSS quando está ocioso.

Código-fonte do OmniRoute (a58000c7685f)

HagiCode

HagiCode é um ambiente de programação com agentes, fluxos estruturados, execução multiagente e visualizações Hero Dungeon.

Transforme ideias em software útil com um fluxo de trabalho com agentes mais inteligente, rápido e agradável.

Interface principal do HagiCode no tema claro
  • SmartFluxos estruturados transformam intenções em um caminho executável da ideia à entrega.
  • EfficientFluxos multiagente mantêm pesquisa, implementação e revisão em andamento simultaneamente.
  • FunO Hero Dungeon torna longas sessões de programação mais visuais e colaborativas.
Acessar HagiCode