Instalador/ambiente para um VPS rodar vários coding agents (harnesses), cada um na sua própria imagem Docker, mais o Gbrain (camada de memória/MCP) num serviço separado, pronto para acesso externo a partir dos seus PCs de desenvolvimento.
| Harness | Serviço | Comando interno |
|---|---|---|
| Claude Code | claude |
claude |
| OpenAI Codex CLI | codex |
codex |
| Google Antigravity | antigravity |
agy |
| Cursor Agent | cursor-agent |
cursor-agent |
| OpenCode (MiniMax) | opencode |
opencode |
| Gbrain (servidor) | gbrain + gbrain-db + caddy |
gbrain serve --http |
Cada harness é independente: sobe sob demanda, tem volume próprio de config/auth, e todos compartilham um volume workspace (/workspace).
- Docker Engine + Docker Compose v2 (no VPS).
- Node.js ≥ 18 no host — só para o launcher (
harness). Opcional. - Para o Gbrain externo: um domínio com registro DNS A apontando para o IP do VPS, e portas 80/443 livres.
cp .env.example .env
# edite .env: OPENAI_API_KEY, MINIMAX_API_KEY, GBRAIN_DOMAIN, ACME_EMAIL, POSTGRES_PASSWORD...
# (opcional) launcher TUI no host:
cd launcher && npm install && npm link # expõe o comando `harness`
cd ..Há um instalador que provisiona o ambiente na máquina atual ou num VPS via SSH. O núcleo é o install.sh (bash puro, roda no alvo); o front-end é o launcher (harness install ou menu → Instalar).
Núcleo install.sh (roda no alvo — local ou, no modo remoto, dentro do VPS):
bash install.sh --provision-docker --server # instala Docker se faltar, builda, sobe o Gbrain
bash install.sh --dry-run # só mostra o que faria
# flags: --provision-docker --server --no-build --yes --dry-runModo remoto (harness install → Remoto): você informa um perfil (label, IP, usuário, porta, caminho da chave SSH, diretório no VPS), e o launcher:
- testa a conexão SSH;
- pergunta como levar o
.env— copiar o seu.envlocal pelo canal SSH ou criar do.env.exampleno VPS p/ editar lá; - mostra os comandos exatos (rsync/tar + ssh) e pede confirmação (ou
--dry-run); - transfere o projeto (
rsync, com fallbacktarpor SSH) e rodainstall.shno VPS.
Os perfis ficam em .servers.json (gitignored; guarda só o caminho da chave, nunca o conteúdo). Depois, use o VPS assim:
ssh -t USER@IP 'cd multi-harness && docker compose run --rm claude'
ssh -t USER@IP 'cd multi-harness && docker compose --profile server up -d'Segurança: o SSH usa a sua chave (-i <caminho>), que nunca é lida nem transmitida por nós; get.docker.com | sh só roda no VPS com sua confirmação; .env e .servers.json são gitignored e só trafegam pelo canal SSH cifrado.
São TUIs interativas — use docker compose run (sob demanda), não up:
docker compose run --rm claude # Claude Code
docker compose run --rm codex # Codex
docker compose run --rm antigravity # agy
docker compose run --rm cursor-agent # Cursor Agent
docker compose run --rm opencode # OpenCode (MiniMax)
docker compose run --rm claude --version # checagem rápidaOu pelo launcher:
harness # menu interativo
harness claude # direto
harness --listO login é por harness, no primeiro uso, e fica salvo no volume de config (persiste entre execuções):
- Claude Code —
/loginna sessão (fluxo por código/navegador). - Codex —
codex login(ou API key). - Antigravity — abre URL de Google Sign-In; em sessão remota ele imprime a URL para você abrir no PC. (Sem keyring no container, cai no fallback em arquivo, persistido no volume.)
- Cursor Agent —
cursor-agent login. - OpenCode — não precisa login: usa a MiniMax via
opencode.json. DefinaMINIMAX_API_KEYno.env(injetada no 1º boot) ou edite depois~/.config/opencode/opencode.jsonno volumeopencode-config(campoapiKey).
| Volume | Conteúdo |
|---|---|
claude-config, codex-config, antigravity-config, cursor-config, opencode-config |
config + auth de cada harness (/home/dev) |
workspace |
código/dados compartilhados (/workspace) |
gbrain-data |
brain do Gbrain (system of record, ~/.gbrain) |
gbrain-db-data |
dados do Postgres/pgvector |
caddy-data, caddy-config |
certificados TLS do Caddy |
Quer ver o
workspacedireto no host? Troque o volume nomeado por um bind, ex.:- ./workspace:/workspace.
gbrain serve --http é Postgres-only (por isso o serviço gbrain-db com pgvector). O Caddy publica o servidor no seu domínio com HTTPS automático (Let's Encrypt). Auth: bearer token e OAuth 2.1 (dashboard /admin).
docker compose --profile server up -d # gbrain-db -> gbrain -> caddy
docker compose logs -f gbrain # veja "listening :3131" + admin bootstrap token (OAuth)Verifique o TLS/descoberta OAuth:
curl https://SEU_DOMINIO/.well-known/oauth-authorization-serverCrie um token e conecte (precisa do CLI gbrain no seu PC):
docker compose exec gbrain gbrain auth create "laptop" # imprime gbrain_xxxxx
# no seu PC:
gbrain connect https://SEU_DOMINIO/mcp --token gbrain_xxx --install # Claude Code
gbrain connect https://SEU_DOMINIO/mcp --token gbrain_xxx --agent codex --install # CodexPelo launcher: Gbrain: criar token / connect (gera o token e monta o comando pronto).
Embeddings: o Gbrain indexa com a OpenAI (
text-embedding-3-large). SemOPENAI_API_KEY, ele sobe sem embeddings (--no-embedding) e você habilita depois colocando a key no.enve reiniciando o serviço.
Os harnesses já trazem os pré-requisitos (node, npm, npx, git, agent-skills). Tudo que você instalar persiste no volume de config do harness. Use o helper ou o launcher:
plugins/install.sh --list # combinações disponíveis
plugins/install.sh claude superpowers # imprime comandos p/ colar na sessão do Claude
plugins/install.sh claude gstack # executa no container (git clone + setup)
plugins/install.sh opencode openspec # roda openspec init em /workspace| Plugin | O que é | Harnesses |
|---|---|---|
| Gstack | 23 skills opinativas (CEO/PM/QA/Eng) | Claude |
| Agent Skills | catálogo multi-agente (wizard) | Claude, Codex, Cursor, OpenCode, Antigravity |
| Headroom | compressão de contexto (skill/MCP/hook) | Claude, Codex, Cursor, OpenCode |
| Superpowers | framework de skills (brainstorm/plan/TDD) | Claude (+ demais manual) |
| Ponytail | persona "lazy senior dev" (código mínimo) | Claude, Codex, OpenCode, Antigravity, Cursor |
| OpenSpec | spec-driven dev (gera AGENTS.md) |
todos (por-projeto em /workspace) |
Modos: run (executa no container), session (cole na sessão do Claude/Codex, ex. /plugin …), manual (passo de edição/cópia). Veja plugins/manifest.json.
- Harnesses:
docker compose build --no-cache <serviço>(puxa a versão mais nova do instalador). - Gbrain: ele não tem tag semver estável; o
gbrain/Dockerfilefixa um commit SHA (GBRAIN_REF). Para subir de versão, atualize o SHA e rebuild:docker compose build gbrain.
- Gbrain + Postgres self-hosted: validado — o Gbrain seleciona o engine Postgres automaticamente quando
DATABASE_URLestá no ambiente (o compose monta a partir dosPOSTGRES_*). Não precisa de Supabase nem de passo demigrate. Postgres é obrigatório para o servidor HTTP e para bearer tokens. - Gbrain é jovem (mudanças frequentes) — por isso o pin por commit (
GBRAIN_REFnogbrain/Dockerfile). Versão validada aqui:0.42.53.0. - Comandos
/plugin …(Superpowers/Ponytail no Claude/Codex) exigem a sessão interativa do harness; o helper imprime o que colar. - Os builds baixam instaladores externos (Anthropic, OpenAI, Google, Cursor, OpenCode, Gbrain) — exigem rede e podem mudar.
docker-compose.yml # harnesses (profile harness) + gbrain/db/caddy (profile server)
.env.example # placeholders
harnesses/<x>/Dockerfile # 1 imagem por harness
gbrain/ # Dockerfile + entrypoint (bun + gbrain)
caddy/Caddyfile # reverse proxy + TLS
plugins/manifest.json # catálogo plugin -> comando por harness
plugins/install.sh # helper de instalação
launcher/bin/harness.js # TUI no host