OmniRoute — Deployment Guide on VM with Cloudflare (Português (Brasil))
Pré-requisitos
Seção intitulada “Pré-requisitos”| 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.
1. Configure a VM
Seção intitulada “1. Configure a VM”1.1 Crie a instância
Seção intitulada “1.1 Crie a instância”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)
1.2 Conecte-se via SSH
Seção intitulada “1.2 Conecte-se via SSH”ssh root@203.0.113.101.3 Atualize o sistema
Seção intitulada “1.3 Atualize o sistema”apt update && apt upgrade -y1.4 Instale o Docker
Seção intitulada “1.4 Instale o Docker”# Instale as dependênciasapt install -y ca-certificates curl gnupg
# Adicione o repositório oficial do 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 Instale o nginx
Seção intitulada “1.5 Instale o nginx”apt install -y nginx1.6 Configure o firewall (UFW)
Seção intitulada “1.6 Configure o firewall (UFW)”ufw default deny incomingufw default allow outgoingufw allow 22/tcp # SSHufw allow 80/tcp # HTTP (redirecionamento)ufw allow 443/tcp # HTTPSufw enableDica: 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.
2. Instale o OmniRoute
Seção intitulada “2. Instale o OmniRoute”2.1 Crie o diretório de configuração
Seção intitulada “2.1 Crie o diretório de configuração”mkdir -p /opt/omniroute2.2 Crie o arquivo de variáveis de ambiente
Seção intitulada “2.2 Crie o arquivo de variáveis de ambiente”cat > /opt/omniroute/.env << 'EOF'# === Segurança ===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 # OBRIGATÓRIO em produção: usado pela ponte WS do Codex Responses
# === Aplicativo ===PORT=20128NODE_ENV=productionHOSTNAME=0.0.0.0DATA_DIR=/app/dataAPP_LOG_TO_FILE=trueAUTH_COOKIE_SECURE=trueREQUIRE_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.onlineEOF⚠️ IMPORTANTE: Gere chaves secretas exclusivas! Use
openssl rand -hex 32para cada chave.
2.3 Inicie o contêiner
Seção intitulada “2.3 Inicie o contêiner”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 Verifique se está em execução
Seção intitulada “2.4 Verifique se está em execução”docker ps | grep omniroutedocker logs omniroute --tail 20A saída deve exibir: [DB] SQLite database ready e listening on port 20128.
3. Configure o nginx (Proxy Reverso)
Seção intitulada “3. Configure o nginx (Proxy Reverso)”3.1 Gere o certificado SSL (Cloudflare Origin)
Seção intitulada “3.1 Gere o certificado SSL (Cloudflare Origin)”No painel da Cloudflare:
- Acesse SSL/TLS → Origin Server
- Clique em Create Certificate
- Mantenha os valores padrão (15 anos, *.yourdomain.com)
- Copie o Origin Certificate e a Private Key
mkdir -p /etc/nginx/ssl
# Cole o certificadonano /etc/nginx/ssl/origin.crt
# Cole a chave privadanano /etc/nginx/ssl/origin.key
chmod 600 /etc/nginx/ssl/origin.key3.2 Configuração do Nginx
Seção intitulada “3.2 Configuração do Nginx”cat > /etc/nginx/sites-available/omniroute << 'NGINX'# Servidor padrão — bloqueia o acesso direto via 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; # 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 → HTTPSserver { listen 80; listen [::]:80; server_name llms.yourdomain.com; return 301 https://$server_name$request_uri;}NGINXMantenha 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.
3.3 Habilite e teste
Seção intitulada “3.3 Habilite e teste”# Remova a configuração padrãorm -f /etc/nginx/sites-enabled/default
# Habilite o OmniRouteln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
# Teste e recarreguenginx -t && systemctl reload nginx4. Configurar o DNS da Cloudflare
Seção intitulada “4. Configurar o DNS da Cloudflare”4.1 Adicionar registro DNS
Seção intitulada “4.1 Adicionar registro DNS”No painel da Cloudflare → DNS:
| Tipo | Nome | Conteúdo | Proxy |
|---|---|---|---|
| A | llms |
203.0.113.10 (IP da VM) |
✅ Com proxy |
4.2 Configurar o SSL
Seção intitulada “4.2 Configurar o SSL”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
4.3 Testes
Seção intitulada “4.3 Testes”curl -sI https://llms.seudominio.com/health# Deve retornar HTTP/2 2005. Operações e manutenção
Seção intitulada “5. Operações e manutenção”Atualizar para uma nova versão
Seção intitulada “Atualizar para uma nova versão”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:latestVisualizar logs
Seção intitulada “Visualizar logs”docker logs -f omniroute # Fluxo em tempo realdocker logs omniroute --tail 50 # Últimas 50 linhasBackup manual do banco de dados
Seção intitulada “Backup manual do banco de dados”# Copiar os dados do volume para o hostdocker cp omniroute:/app/data ./backup-$(date +%F)
# Ou compactar o volume inteirodocker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /dataRestaurar a partir do backup
Seção intitulada “Restaurar a partir do backup”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. Segurança avançada
Seção intitulada “6. Segurança avançada”Restringir o nginx aos IPs da Cloudflare
Seção intitulada “Restringir o nginx aos IPs da Cloudflare”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;CFAdicione o seguinte ao nginx.conf, dentro do bloco http {}:
include /etc/nginx/cloudflare-ips.conf;Instalar o fail2ban
Seção intitulada “Instalar o fail2ban”apt install -y fail2bansystemctl enable fail2bansystemctl start fail2ban
# Verificar o statusfail2ban-client status sshdBloquear o acesso direto à porta do Docker
Seção intitulada “Bloquear o acesso direto à porta do Docker”# Impedir o acesso externo direto à porta 20128iptables -I DOCKER-USER -p tcp --dport 20128 -j DROPiptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
# Tornar as regras persistentesapt install -y iptables-persistentnetfilter-persistent save7. Implantar no Cloudflare Workers (Opcional)
Seção intitulada “7. Implantar no Cloudflare Workers (Opcional)”Para acesso remoto por meio do Cloudflare Workers (sem expor a VM diretamente):
# No repositório localcd omnirouteCloudnpm installnpx wrangler loginnpx wrangler deployConsulte 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.
Resumo de Portas
Seção intitulada “Resumo de Portas”| 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) |
Otimização para Pouca Memória / VPS Pequena
Seção intitulada “Otimização para Pouca Memória / VPS Pequena”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=1para ignorar o agendador, o servidor MCP e as tarefas periódicas de manutenção. Consultedocs/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. Consultedocs/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 resposta503que permite nova tentativa, comRetry-After, em vez de competir por memória. Defina o limite legado de contagem de solicitaçõesOMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHTsomente se você precisar de um limite rígido adicional. - Evite executar
next buildna 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.
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.

- 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.