🇺🇸🇧🇷🇫🇷
🇺🇸🇧🇷🇫🇷
Blog

Rodando o OpenClaw em um ambiente remoto

April 1, 2026
Se 2026 acabar sendo o ano em que agentes de IA deixarão de ser apenas demos para se tornar ferramentas operacionais de verdade, o OpenClaw merece estar nessa conversa. E não digo isso no sentido de buzzword. Digo em um sentido prático, de engenharia: o OpenClaw reúne mensageria, ferramentas, automação, memória e fluxos de trabalho do dia a dia em um único sistema. Ainda assim, este texto não é sobre hype. É sobre prática. Mais especificamente, é sobre como eu configurei o OpenClaw para o meu próprio uso, o que funcionou bem, o que não funcionou tão bem e o que aprendi ao longo de cerca de um mês usando-o em uma arquitetura remota, em vez do modelo mais simples em que tudo roda na mesma máquina. Quando digo “arquitetura remota”, quero dizer que o assistente roda inteiramente em um host remoto e é acessado pela rede, em vez de compartilhar a mesma máquina com o usuário. Rodar o OpenClaw localmente é simples. Mas eu não queria um assistente que existisse apenas na máquina que, por acaso, estivesse aberta na minha frente. Eu queria algo que pudesse acessar de qualquer lugar, com um controle de acesso forte, e com uma fronteira de isolamento entre o host e o runtime do assistente para não precisar fingir que ambos pertencem à mesma zona de confiança. Essa decisão parece simples. Na prática, ela muda completamente o provisionamento, pois muitas ferramentas modernas de IA ainda assumem tacitamente um setup local. Para começar, esse setup reflete uma escolha pragmática: eu já tenho um home lab. Então, para mim, usar o hardware que eu já tinha era simplesmente mais econômico do que subir um VPS e pagar todo mês para ter uma “máquina isolada” só para o assistente. Se a capacidade de computação, armazenamento e rede já existe em uma infraestrutura que eu controlo, faz mais sentido reaproveitá-la. Mas o custo foi só parte da decisão. Um setup em home lab também me deu algumas vantagens adicionais:
  • controle mais direto sobre o host, a rede e o modelo de isolamento
  • mais liberdade para experimentar diferentes formas de isolar componentes e rotear o tráfego entre eles
  • nenhuma necessidade de adaptar o setup a imagens ou políticas genéricas de provedores
  • um ambiente mais limpo para integrar o sistema com outras ferramentas e serviços hospedados na minha própria infraestrutura (self-hosted) no futuro
Também existe uma razão mais ampla pela qual esse caso de uso importa. Nem todo mundo quer, por padrão, rodar um sistema de IA em infraestrutura alugada de terceiros. Algumas pessoas já têm ambientes bastante capazes, então um VPS nem sempre é a escolha mais óbvia. E, em alguns contextos corporativos, a questão nem é custo — é governança. Dependendo do ambiente, equipes podem se preocupar com coisas como:
  • por onde transitam os dados conversacionais e operacionais
  • se ferramentas internas deveriam rodar em infraestrutura externa
  • até que ponto o host pode ser integrado aos controles de rede existentes
  • quanto controle existe sobre isolamento, logging e exposição
Isso não faz de um VPS uma escolha ruim. Para muita gente, é o caminho mais rápido e simples. Mas não é o único caminho viável; em alguns casos, não é nem uma opção. É por isso que acho esse tipo de provisionamento interessante de documentar. Ele mostra o que acontece quando você trata o OpenClaw menos como um app descartável e mais como uma peça de infraestrutura que você quer usar. Estou rodando o OpenClaw em Docker, e a estrutura principal está no Compose abaixo.
version: "3.9"

services:
  openclaw:
    image: ${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest}
    container_name: openclaw
    environment:
      HOME: /home/node
      TERM: xterm-256color

      # Required (recommended to set)
      OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}

      # Optional
      OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: ${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS:-}
      CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY:-}
      CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY:-}
      CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE:-}
    volumes:
      - openclaw-data:/home/node
      - openclaw-shared:/mnt/shared
      # Sandbox isolation (optional) - only enable if you know you want allow OpenClaw to control the local Docker engine
      # - /var/run/docker.sock:/var/run/docker.sock
    init: true
    restart: unless-stopped
    command:
      [
        "node",
        "dist/index.js",
        "gateway",
        "--bind",
        "${OPENCLAW_GATEWAY_BIND:-lan}",
        "--port",
        "18789"
      ]
    # No published ports: access via Cloudflare Tunnel only
    networks:
      - openclaw_net
    healthcheck:
      test:
        [
          "CMD",
          "node",
          "-e",
          "const http=require('http');const req=http.get('http://127.0.0.1:18789/healthz',r=>process.exit(r.statusCode===200?0:1));req.on('error',()=>process.exit(1));"
        ]
      interval: 30s
      timeout: 5s
      retries: 10
      start_period: 60s

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: openclaw-cloudflare-tunnel
    # Easiest: share the gateway network namespace and point ingress to 127.0.0.1:18789
    network_mode: "service:openclaw"
    depends_on:
      - openclaw
    command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN} --no-tls-verify
    restart: unless-stopped

networks:
  openclaw_net:
    driver: bridge
    internal: false
    attachable: false

volumes:
  openclaw-data:
    external: true
  openclaw-shared:
    external: true
Existem duas escolhas de design aqui que fazem bastante diferença. O volume openclaw-data é o que impede o OpenClaw de virar algo descartável toda vez que o container é recriado. Montado em /home/node, ele preserva o estado de trabalho entre reinicializações e atualizações. Na prática, isso significa que workspace, notas, memória e configuração continuam existindo mesmo que o contêiner não exista mais. Isso importa porque o OpenClaw não é só um serviço stateless. Ele funciona muito mais como um ambiente operacional. Se você quiser continuidade, memória e contexto acumulado ao longo do tempo, precisa de armazenamento persistente. O volume openclaw-shared cumpre outro papel importante. Eu uso ele como uma área compartilhada entre mim e o OpenClaw. É ali que ficam os arquivos onde trabalhamos juntos, em vez de tratar o assistente como um sistema fechado. No meu caso, isso funciona bem porque eu uso um NAS. Portanto o mesmo volume é montado tanto no OpenClaw quanto na minha máquina local, por isso o “compartilhamento”, nesse caso, é literal. O melhor exemplo disso é o Obsidian. Foi com essa configuração que o OpenClaw deixou de ser apenas um assistente remoto e passou a fazer parte de um ambiente de trabalho compartilhado. Na prática:
  • eu e o OpenClaw escrevemos e refinamos anotações juntos
  • organizamos material de pesquisa
  • mantemos listas de papers
  • conectamos a memória do assistente com minha base de conhecimento
Esse é um dos motivos pelos quais o home lab funciona tão bem para mim. O assistente deixa de ser um endpoint e passa a ser parte do ambiente. A parte mais simples de todo o setup foi colocar o OpenClaw atrás do Cloudflare Tunnel e do Cloudflare Access.
Visualização do túnel Cloudflare
Isso resolveu praticamente tudo o que queria:
  • acesso remoto de qualquer lugar
  • nenhuma porta exposta diretamente na internet
  • autenticação baseada em identidade
  • uma postura de segurança muito mais limpa
Ou seja: exposição não foi o problema difícil. O túnel do Cloudflare resolveu essa questão de forma bastante elegante. Não tem nada de particularmente exótico aqui, e isso é excelente. O que gosto é que fica claro quais são as partes que realmente importam:
  • o runtime do OpenClaw é isolado
  • o estado é persistente por construção
  • os dados compartilhados ficam em um volume montado para essa finalidade
  • não há portas abertas diretamente acessíveis pela Internet
  • a exposição é feita através de um túnel implementado pelo Cloudflare
  • o healthcheck acontece dentro do próprio serviço
Isso cria uma base operacional sólida. O OpenClaw usa o comando onboard para fazer a configuração inicial do sistema. Em vez de configurar cada parte manualmente, esse comando centraliza as principais etapas em um só lugar. Em geral, isso inclui:
  • escolher e configurar um provedor de modelo (via chave de API ou autenticação)
  • inicializar o workspace e o estado local
  • configurar o Gateway (endereço de bind, porta e autenticação)
  • opcionalmente habilitar canais como Telegram e outros
Em um setup local simples, isso normalmente é feito uma única vez pela CLI interativa:
openclaw onboard
O comando pede as informações necessárias e grava a configuração localmente (geralmente em ~/.openclaw/), deixando o ambiente pronto para o runtime subir com tudo configurado. Apesar de o OpenClaw suportar um modo não interativo, eu acabei usando o onboarding interativo. O principal motivo foi autenticação. Autenticação via OAuth não pode ser totalmente pré-configurada por variáveis de ambiente da mesma forma que chaves de API, então usar o wizard acaba sendo o caminho viável nesse caso. Eu queria especificamente usar o fluxo de OAuth do ChatGPT porque esse uso é coberto pela minha assinatura do ChatGPT. Se eu usasse uma API key diretamente, estaria tratando isso como infraestrutura cobrada à parte, o que não era o que gostaria. Esse fluxo é, por definição, interativo. Durante o onboarding, o OpenClaw abre um login no navegador e espera que você copie a URL de callback de volta para a CLI para concluir a autenticação. Esse também é o caminho oficialmente suportado para acesso via assinatura do Codex:
openclaw onboard --auth-choice openai-codex
O processo foi bem direto:
  • copiar a URL fornecida pelo OpenClaw
  • abrir no navegador local
  • concluir o login
  • copiar a URL de callback de volta para o OpenClaw
Depois disso, a autenticação via OpenAI OAuth funcionou, e o runtime passou a conseguir usar openai-codex/gpt-5.4. Diferentes canais podem ser configurados diretamente durante o onboarding. No meu caso, escolhi Telegram e Discord. A configuração em si é simples e já está documentada aqui, então não vou repetir o passo a passo. O importante é que a mensageria já entra como parte da configuração inicial, em vez de ser algo adicionado depois. Depois de configurado:
  • mensagens enviadas via Telegram passam a ser tratadas como entrada do assistente
  • as respostas retornam pelo mesmo canal
  • dá para interagir com o sistema sem depender da interface web
Em um setup remoto, isso vira uma forma conveniente de usar o sistema sem precisar abrir uma sessão autenticada completa toda vez. Uma observação rápida sobre o WhatsApp Você também pode ver referências a integrações com WhatsApp. Diferentemente do Telegram, que oferece uma API de bot estável e bem suportada, o WhatsApp tem regras mais rígidas para automação. Algumas integrações dependem de métodos não oficiais. Nesses casos, contas podem ser sinalizadas ou até banidas por violar os termos de uso da plataforma. Usar a API oficial do WhatsApp Business resolve isso, mas traz mais complexidade e algumas restrições operacionais. Para o meu caso, o Telegram acabou sendo a opção mais simples e confiável. Esse foi um dos pontos de atrito do setup. No meu setup, o gateway não estava funcionando apenas como um relay de mensagens na frente de um ambiente de execução mais completo. Na prática, ele era o próprio runtime operacional. Não havia um container separado, com o CLI para ficar responsável pela execução das tarefas. Isso significa que a própria instância do gateway precisava:
  • executar comandos
  • acessar arquivos
  • navegar na web
  • lidar com tarefas de configuração
  • se comportar como um agente de verdade, e não apenas como uma interface de chat
Por padrão, o perfil de ferramentas ativo se comportava mais como um perfil voltado à mensageria. Isso provavelmente faz sentido em provisionamentos mais tradicionais, com responsabilidades separadas. Mas, nesse setup, deixou o sistema incompleto. A solução foi trocar manualmente o perfil de ferramentas para full no arquivo de configuração.
Configurações brutas do perfil de ferramentas
O painel de controle simplesmente não funcionou para essa mudança específica. A única solução foi editar a configuração diretamente no modo manual.
Painel de agentes perfil de ferramentas
Depois de recarregar, tudo passou a funcionar como esperado. Depois que a parte remota estava resolvida, o que mais passou a importar não foi o setup. Foi o uso no dia a dia. É aí que o OpenClaw deixa de ser interessante e passa a ser útil. Aqui, a palavra-chave é skill. Skill é um procedimento reutilizável para o agente: basicamente um workflow que pode incluir instruções, convenções, referências e contexto específico, para que o assistente execute tarefas recorrentes com mais consistência. Em outras palavras, em vez de reexplicar o mesmo processo toda vez, você ensina ao sistema como quer que uma determinada classe de tarefas seja executada e deixa esse padrão se manter. Isso pode ser algo pontual e prático, como regras de formatação ou de escrita, ou algo mais operacional, como a forma de conduzir um fluxo recorrente de pesquisa ou produção de conteúdo. E é isso que transforma o sistema de um assistente genérico em algo moldado ao seu jeito de trabalhar. O que fez o setup realmente funcionar para mim foi a combinação de um workspace persistente com algumas skills bem alinhadas com a forma como eu trabalho. Os mais úteis até agora têm sido aqueles ligados a trabalho de pesquisa, fluxos de escrita e também suporte operacional do dia a dia. Na prática, isso significa coisas como:
  • trabalhar com minha base de conhecimento no Obsidian por meio de um diretório compartilhado
  • escrever e refinar notas ou ideias de posts diretamente no lugar, em vez de ficar copiando conteúdo de um lado para outro
  • usar skills específicas para fluxos recorrentes, em vez de reexplicar a mesma tarefa toda vez
  • manter uma memória local leve e o contexto operacional dentro do workspace do OpenClaw
É nesse ponto que o sistema começa a mostrar seu valor. Em vez de refazer trabalho, ele começa a reutilizar estrutura como base. Aos poucos, a gente vai moldando o comportamento dele em torno desses workflows recorrentes, fazendo com que essa personalização persista no tempo. Outro ponto que fez bastante diferença foi o uso de cron jobs do OpenClaw. Foi aí que o OpenClaw começou a parecer menos algo que eu “uso quando solicitado” e mais algo que poderia deixar rodando meus workflows de forma autônoma. Quando as tarefas são agendadas, o sistema deixa de ser reativo, e passa a ser uma infraestrutura operacional. Isso importa porque boa parte do trabalho útil não é interativo. Algumas tarefas precisam acontecer no momento certo, outras precisam se repetir, e outras são simplesmente tarefas de manutenção que são fáceis de esquecer quando tudo depende de acionamento manual. No meu caso, isso inclui briefs recorrentes, tarefas de verificação e a curadoria de artigos de pesquisa de alto impacto. Um bom exemplo é uma tarefa cron que faz o processamento de artigos de alto impacto. Quando um artigo é relevante o suficiente para acionar esse processamento, a automação direciona o fluxo de execução para um script spider.js que expande a rede de citações e retroalimenta os resultados de volta para uma "watchlist" de artigos/autores importantes. Dessa forma, um único artigo interessante passa a ser uma porta de entrada para uma pesquisa mais ampla sobre autores, laboratórios ou grupos de pesquisa que podem merecer mais atenção ao longo do tempo.
Workflow cron job artigos de alto impacto
O mais interessante é que não se trata apenas de automação no sentido de executar um script em intervalos definidos. Isso cria continuidade operacional dentro do sistema. Uma tarefa agendada pode avaliar, verificar, enriquecer e reinserir os resultados em um workflow mais amplo, sem exigir intervenção manual em cada etapa. A combinação de estado persistente, arquivos compartilhados e tarefas agendadas muda a natureza do sistema. Ele começa a se comportar menos como uma demo e mais como um pequeno control plane para workflows pessoais. A primeira coisa que eu diria é que a configuração foi mais simples do que parecia, dada a topologia que foi implementada. A arquitetura de um sistema em camadas com host remoto, isolação de container, túnel, camada de identidade e um runtime de agente por trás disso, poderia soar complexo. Na prática, acabou ficando apenas uma composição de componentes bem familiares, onde cada camada tem uma responsabilidade clara, e nenhuma delas se comporta de forma "inusitada". A segunda coisa que eu diria é que a escolha do modelo importa muito mais do que eu esperava. Antes de optar pelo OpenAI via Codex, passei cerca de uma semana testando o Gemini da Google, porque tinha visto bons comentários em relação a custo benefício. Estimei que o custo ficaria em torno de 5 USD por mês para o meu uso. Ledo engano! No fim, acabou me custando €37,94 para o meu uso específico, e sinceramente a qualidade não justificou esse custo. Felizmente, a OpenAI tinha acabado de lançar openai-codex/gpt-5.4, e isso me caiu como uma luva. Para esse setup, foi claramente uma opção melhor tanto em qualidade quanto em previsibilidade de custo. Na prática, ele se mostrou mais consistente, deixando a experiência geral muito mais adequada à forma como eu gostaria de usar o OpenClaw. Se alguém me perguntasse hoje o que eu recomendaria, a resposta seria "GPT-5.4 via Codex", sem hesitar. Essa é provavelmente a forma mais honesta de resumir. Depois que o modelo de provisionamento ficou claro, o OpenClaw em si não foi especialmente difícil de usar e de adaptar. Aparadas as arestas iniciais, a experiência de uso tem sido genuinamente positiva. É justamente essa experiência positiva que me faz achar que esse projeto merece realmente atenção. Até mesmo em um setup um pouco fora do comum, ele já foi prático o suficiente para se tornar útil rapidamente. A parte interessante desse setup nunca foi entender como provisionar o OpenClaw de maneira remota, deixando-o seguro, utilizável e operacional, quando grande parte do ecossistema ainda assume tacitamente que tudo roda em um único laptop. Esse é mais um motivo pelo qual eu acho que ferramentas como o OpenClaw são importantes. Elas trazem de volta para a discussão algumas questões reais de engenharia. Agora eu quero ir além com esse setup em algumas direções. Uma área que me interessa particularmente é a arquitetura multiagente. Rodar um único assistente já é bem útil, mas um modelo ainda mais interessante seria um sistema de agentes especializados cooperando entre si, com fronteiras bem definidas entre eles. Na prática, isso significa rodar múltiplos servidores MCP no meu cluster, cada um responsável por uma classe específica de tarefas, em vez de depender de um único runtime genérico. Outra direção é tratar código e skills gerados por IA como artefatos. Em vez de deixá-los dentro do workspace interno do assistente, quero versioná-los e revisá-los como qualquer outro código. Integrar isso ao meu setup no GitLab permitiria um modelo mais colaborativo: o agente pode gerar e modificar artefatos, mas eu posso intervir, editar, revisar e moldar esses resultados diretamente. O objetivo é não ficar passivamente usando o sistema, mas cooperar ativamente com ele por meio desses artefatos compartilhados e versionados. Essas direções apontam para uma mudança mais ampla: de interagir com um assistente para operar um sistema. Também pretendo dedicar mais tempo a testar o NemoClaw, para entender melhor o que ele busca ser na prática. Essa comparação deve ficar mais interessante à medida que o ecossistema evoluir. Além disso, quero integrar mais controle e monitoramento à minha instância do OpenClaw usando um stack de EDR open-source. Isso provavelmente vai merecer um post próprio quando eu tiver algo mais concreto. E essas questões ficarão cada vez mais relevantes à medida que os agentes deixarem de ser demos e passarem a fazer parte da infraestrutura. E essa transição já está acontecendo.