Containers
Podman
Execute o OpenClaw Gateway em um contêiner Podman sem root, gerenciado pelo seu usuário atual não root.
O modelo previsto é:
- O Podman executa o contêiner do gateway.
- Sua CLI
openclawdo host é o plano de controle. - O estado persistente fica no host em
~/.openclawpor padrão. - O gerenciamento diário usa
openclaw --container <name> ...em vez desudo -u openclaw,podman execou um usuário de serviço separado.
Pré-requisitos
- Podman em modo sem root
- CLI do OpenClaw instalada no host
- Opcional:
systemd --userse você quiser inicialização automática gerenciada por Quadlet - Opcional:
sudosomente se você quiserloginctl enable-linger "$(whoami)"para persistência de inicialização em um host headless
Início rápido
Configuração única
Na raiz do repositório, execute ./scripts/podman/setup.sh.
Inicie o contêiner do Gateway
Inicie o contêiner com ./scripts/run-openclaw-podman.sh launch.
Execute o onboarding dentro do contêiner
Execute ./scripts/run-openclaw-podman.sh launch setup e abra http://127.0.0.1:18789/.
Gerencie o contêiner em execução pela CLI do host
Defina OPENCLAW_CONTAINER=openclaw e use comandos openclaw normais pelo host.
Detalhes da configuração:
./scripts/podman/setup.shcriaopenclaw:localno seu armazenamento Podman sem root por padrão, ou usaOPENCLAW_IMAGE/OPENCLAW_PODMAN_IMAGEse você definir um deles.- Ele cria
~/.openclaw/openclaw.jsoncomgateway.mode: "local"se estiver ausente. - Ele cria
~/.openclaw/.envcomOPENCLAW_GATEWAY_TOKENse estiver ausente. - Para inicializações manuais, o auxiliar lê apenas uma pequena lista permitida de chaves relacionadas ao Podman em
~/.openclaw/.enve passa variáveis de ambiente de runtime explícitas ao contêiner; ele não entrega o arquivo de ambiente completo ao Podman.
Configuração gerenciada por Quadlet:
./scripts/podman/setup.sh --quadlet
O Quadlet é uma opção somente para Linux porque depende de serviços de usuário do systemd.
Você também pode definir OPENCLAW_PODMAN_QUADLET=1.
Variáveis de ambiente opcionais de build/configuração:
OPENCLAW_IMAGEouOPENCLAW_PODMAN_IMAGE-- usa uma imagem existente/baixada em vez de criaropenclaw:localOPENCLAW_DOCKER_APT_PACKAGES-- instala pacotes apt extras durante o build da imagemOPENCLAW_EXTENSIONS-- pré-instala dependências de plugins durante o buildOPENCLAW_INSTALL_BROWSER-- pré-instala Chromium e Xvfb para automação de navegador (defina como1para habilitar)
Início do contêiner:
./scripts/run-openclaw-podman.sh launch
O script inicia o contêiner como seu uid/gid atual com --userns=keep-id e monta por bind o estado do OpenClaw no contêiner.
Onboarding:
./scripts/run-openclaw-podman.sh launch setup
Em seguida, abra http://127.0.0.1:18789/ e use o token de ~/.openclaw/.env.
Padrão da CLI do host:
export OPENCLAW_CONTAINER=openclaw
Então comandos como estes serão executados automaticamente dentro desse contêiner:
openclaw dashboard --no-open
openclaw gateway status --deep # inclui varredura extra de serviço
openclaw doctor
openclaw channels login
No macOS, a máquina do Podman pode fazer o navegador parecer não local para o gateway. Se a Control UI relatar erros de autenticação de dispositivo após a inicialização, use as orientações de Tailscale em Podman e Tailscale.
Podman e Tailscale
Para HTTPS ou acesso remoto pelo navegador, siga a documentação principal do Tailscale.
Observação específica do Podman:
- Mantenha o host de publicação do Podman em
127.0.0.1. - Prefira
tailscale servegerenciado pelo host em vez deopenclaw gateway --tailscale serve. - No macOS, se o contexto de autenticação de dispositivo do navegador local não for confiável, use acesso via Tailscale em vez de soluções alternativas de túnel local ad hoc.
Veja:
Systemd (Quadlet, opcional)
Se você executou ./scripts/podman/setup.sh --quadlet, a configuração instala um arquivo Quadlet em:
~/.config/containers/systemd/openclaw.container
Comandos úteis:
- Iniciar:
systemctl --user start openclaw.service - Parar:
systemctl --user stop openclaw.service - Status:
systemctl --user status openclaw.service - Logs:
journalctl --user -u openclaw.service -f
Após editar o arquivo Quadlet:
systemctl --user daemon-reload
systemctl --user restart openclaw.service
Para persistência de inicialização em hosts via SSH/headless, habilite lingering para seu usuário atual:
sudo loginctl enable-linger "$(whoami)"
Configuração, ambiente e armazenamento
- Diretório de configuração:
~/.openclaw - Diretório do workspace:
~/.openclaw/workspace - Arquivo de token:
~/.openclaw/.env - Auxiliar de inicialização:
./scripts/run-openclaw-podman.sh
O script de inicialização e o Quadlet montam por bind o estado do host no contêiner:
OPENCLAW_CONFIG_DIR->/home/node/.openclawOPENCLAW_WORKSPACE_DIR->/home/node/.openclaw/workspace
Por padrão, esses são diretórios do host, não estado anônimo do contêiner, então
openclaw.json, auth-profiles.json por agente, estado de canal/provedor,
sessões e workspace sobrevivem à substituição do contêiner.
A configuração do Podman também semeia gateway.controlUi.allowedOrigins para 127.0.0.1 e localhost na porta publicada do gateway, para que o dashboard local funcione com o bind não loopback do contêiner.
Variáveis de ambiente úteis para o inicializador manual:
OPENCLAW_PODMAN_CONTAINER-- nome do contêiner (openclawpor padrão)OPENCLAW_PODMAN_IMAGE/OPENCLAW_IMAGE-- imagem a executarOPENCLAW_PODMAN_GATEWAY_HOST_PORT-- porta do host mapeada para a porta18789do contêinerOPENCLAW_PODMAN_BRIDGE_HOST_PORT-- porta do host mapeada para a porta18790do contêinerOPENCLAW_PODMAN_PUBLISH_HOST-- interface do host para portas publicadas; o padrão é127.0.0.1OPENCLAW_GATEWAY_BIND-- modo de bind do gateway dentro do contêiner; o padrão élanOPENCLAW_PODMAN_USERNS--keep-id(padrão),autoouhost
O inicializador manual lê ~/.openclaw/.env antes de finalizar os padrões de contêiner/imagem, então você pode persistir esses valores ali.
Se você usar um OPENCLAW_CONFIG_DIR ou OPENCLAW_WORKSPACE_DIR fora do padrão, defina as mesmas variáveis tanto para os comandos ./scripts/podman/setup.sh quanto para comandos posteriores ./scripts/run-openclaw-podman.sh launch. O inicializador local do repositório não persiste substituições de caminho personalizadas entre shells.
Observação sobre Quadlet:
- O serviço Quadlet gerado mantém intencionalmente um formato padrão fixo e reforçado: portas publicadas em
127.0.0.1,--bind landentro do contêiner e namespace de usuáriokeep-id. - Ele fixa
OPENCLAW_NO_RESPAWN=1,Restart=on-failureeTimeoutStartSec=300. - Ele publica tanto
127.0.0.1:18789:18789(gateway) quanto127.0.0.1:18790:18790(bridge). - Ele lê
~/.openclaw/.envcomo umEnvironmentFilede runtime para valores comoOPENCLAW_GATEWAY_TOKEN, mas não consome a lista permitida de substituições específicas do Podman do inicializador manual. - Se você precisar de portas de publicação personalizadas, host de publicação personalizado ou outras flags de execução de contêiner, use o inicializador manual ou edite
~/.config/containers/systemd/openclaw.containerdiretamente, depois recarregue e reinicie o serviço.
Comandos úteis
- Logs do contêiner:
podman logs -f openclaw - Parar contêiner:
podman stop openclaw - Remover contêiner:
podman rm -f openclaw - Abrir URL do dashboard pela CLI do host:
openclaw dashboard --no-open - Saúde/status via CLI do host:
openclaw gateway status --deep(sonda RPC + varredura extra de serviço)
Solução de problemas
- Permissão negada (EACCES) na configuração ou no workspace: O contêiner é executado com
--userns=keep-ide--user <your uid>:<your gid>por padrão. Garanta que os caminhos de configuração/workspace do host sejam propriedade do seu usuário atual. - Início do Gateway bloqueado (
gateway.mode=localausente): Garanta que~/.openclaw/openclaw.jsonexista e definagateway.mode="local".scripts/podman/setup.shcria isso se estiver ausente. - Comandos da CLI do contêiner atingem o destino errado: Use
openclaw --container <name> ...explicitamente, ou exporteOPENCLAW_CONTAINER=<name>no seu shell. openclaw updatefalha com--container: Esperado. Recrie/baixe a imagem e reinicie o contêiner ou o serviço Quadlet.- O serviço Quadlet não inicia: Execute
systemctl --user daemon-reloade depoissystemctl --user start openclaw.service. Em sistemas headless, talvez você também precise desudo loginctl enable-linger "$(whoami)". - SELinux bloqueia montagens bind: Deixe o comportamento padrão de montagem como está; o inicializador adiciona
:Zautomaticamente no Linux quando SELinux está em modo enforcing ou permissive.