💾 Backup de memória — DB SQLite + skills
A pasta ~/.hermes/ guarda tudo: memory.db (SQLite), skills/, profiles/, config.yaml e snapshots/. Backup correto é um tarball cifrado com snapshot consistente do SQLite — não use cp direto enquanto o agente está rodando.
# 1. Snapshot consistente do banco (não trava escritas)
$ sqlite3 ~/.hermes/memory.db "VACUUM INTO '/tmp/memory-snap.db'"
# 2. Empacotar tudo (substitui memory.db pela cópia consistente)
$ DEST=~/backups/hermes-backup-$(date +%Y%m%d).tgz
$ tar --exclude='./logs' --exclude='./snapshots' \
--transform="s|memory.db|memory.db.live|" \
-czf "$DEST" -C ~/.hermes . \
-C /tmp memory-snap.db
# 3. Cifrar com age (chave pública do destinatário)
$ age -r age1ql3z7hjy54... -o "$DEST.age" "$DEST"
$ shred -u "$DEST" # remove o tarball claro
# 4. Enviar para storage externo
$ rclone copy "$DEST.age" remote:hermes-backups/
💡 Dica — backup automático via cron
Coloque em crontab -e:
# Backup diário 03:00, mantém 14 dias
0 3 * * * /usr/local/bin/hermes-backup.sh >> ~/.hermes/logs/backup.log 2>&1
No macOS use launchd. No Windows, Task Scheduler. Para servidor, prefira systemd timer com OnCalendar=daily.
🔄 Recuperação — Restaurar em outra máquina
Backup não testado = backup que não existe. Restaure pelo menos uma vez por trimestre em máquina limpa e rode hermes doctor. Abaixo, o caminho completo de restore num host novo (laptop quebrou, migrou pro servidor, está montando um par dev/prod).
Instalar a mesma versão
pipx install hermes-agent==0.9.7
Skills do backup podem depender de APIs específicas da versão. Sempre alinhe a versão antes do restore.
Decifrar e extrair
age -d -i ~/.age/key.txt backup.tgz.age | tar -xz -C ~/.hermes
Restaure dentro de ~/.hermes/ recém-criado, com permissões 700 (chmod 700 ~/.hermes).
Reconfigurar segredos
API keys NÃO devem vir no backup. Refaça via pass / 1Password / Vault.
Esse é o motivo de separar segredos do diretório de dados: backup pode viajar; segredos não.
Sanity check
hermes doctor && hermes memory stats && hermes skills list
Confira que # de conversas, skills e perfis batem com a origem. Se bater, restore validado.
🔐 Gestão de API keys — Rotação e secrets manager
Chaves em .env versionado por engano é o incidente mais comum de IA generativa em 2025-2026. Tire keys do disco em claro. Use um gerenciador de segredos e injete em runtime.
✓ O que FAZER
- ✓Rotar keys a cada 90 dias (calendário recorrente).
- ✓Usar
pass,op(1Password CLI), Vault ou AWS Secrets Manager. - ✓Keys com escopo mínimo (uma key por projeto).
- ✓Rodar
gitleaks detectem pre-commit. - ✓Logar somente os últimos 4 caracteres da key.
✗ O que NÃO fazer
- ✗Commitar
.env(mesmo em repo privado). - ✗Compartilhar a key no Slack/Discord.
- ✗Usar a mesma key em dev, staging e prod.
- ✗Postar saída de
envem screenshot. - ✗Reutilizar a key depois de "achar que vazou".
# Com pass (password-store)
$ pass insert hermes/openrouter
$ export OPENROUTER_API_KEY="$(pass hermes/openrouter)"
$ hermes chat
# Com 1Password CLI
$ op signin
$ op run --env-file=.env.template -- hermes chat
# .env.template usa: OPENROUTER_API_KEY=op://Personal/openrouter/credential
# Wrapper reusável
$ cat > ~/bin/hermes-secure <<'EOF'
#!/usr/bin/env bash
export OPENROUTER_API_KEY="$(pass hermes/openrouter)"
export ANTHROPIC_API_KEY="$(pass hermes/anthropic)"
exec hermes "$@"
EOF
$ chmod +x ~/bin/hermes-secure
⚠️ Atenção — key vazada é incidente
Se a key foi commitada, postada ou apareceu em log público, o relógio começou. Revogue antes de qualquer outra coisa: OpenRouter → Settings → Keys → Revoke. Anthropic → Console → API Keys → Revoke. Não tente "limpar o histórico do git" sem antes revogar — atacantes monitoram pushes em real time.
🛡️ Isolamento — sandbox e containers
Agente com acesso a shell + arquivos + internet é uma arma poderosa e uma superfície de ataque enorme. Prompt injection via documento/site pode tentar roubar arquivos ou exfiltrar dados. Isolamento contém o estrago.
🛡️ Camadas de isolamento (do mais leve ao mais forte)
- •Workdir restrito: tools só leem/escrevem dentro de
~/work/hermes/. - •firejail / bubblewrap: sandbox no nível do processo (Linux).
- •Container Docker/Podman: filesystem, rede e usuário isolados.
- •VM efêmera: microVM (Firecracker) ou Lima — máxima contenção.
- •Allowlist de domínios: network namespace + proxy só libera APIs conhecidas.
# Docker isolado, sem rede além das APIs necessárias
$ docker run --rm -it \
--name hermes-sbx \
-v ~/.hermes:/root/.hermes \
-v $(pwd):/work:ro \
--workdir /work \
--cap-drop ALL \
--security-opt no-new-privileges \
--read-only --tmpfs /tmp \
--env-file <(pass hermes/env) \
ghcr.io/nousresearch/hermes-agent:0.9.7 hermes chat
# firejail (rápido, Linux desktop)
$ firejail --net=none --whitelist=~/.hermes --whitelist=~/work \
--read-only=/etc --caps.drop=all hermes chat
📊 Monitoramento — Métricas, alertas, custos
Você só gerencia o que mede. Hermes expõe métricas via /metrics (Prometheus) quando rodando em modo serviço, e o comando hermes stats dá um snapshot pontual. Combine com alertas de custo no painel do provedor.
📊 Checklist mínimo de monitoramento
- Custo OpenRouter / Anthropic mensal — alerta em 70% do budget.
- # de skills instaladas — anomalia se aumentar sozinho.
- # de sessões / dia — baseline ajuda a detectar abuso.
- Latência p95 — alerta se subir > 2× a média móvel de 7 dias.
- Taxa de erro por tool — alerta se > 5% em janela de 15 min.
- Tokens/sessão p99 — picos podem indicar loop ou prompt injection.
- Tamanho do memory.db — cresce muito rápido = compactar.
# Exemplo de regra Prometheus (alertmanager)
groups:
- name: hermes
rules:
- alert: HermesHighErrorRate
expr: rate(hermes_tool_errors_total[15m]) / rate(hermes_tool_calls_total[15m]) > 0.05
for: 10m
annotations:
summary: "Taxa de erro de tools > 5% por 10 minutos"
- alert: HermesDailyCostBudget
expr: sum(increase(hermes_provider_cost_usd[24h])) > 25
annotations:
summary: "Custo diário ultrapassou US$ 25"
💡 Dica — alertas leves via ntfy
Para projetos pessoais sem Grafana/PagerDuty, um script cron que dispara push pro ntfy.sh quando o custo diário passa de US$ 5 já evita a fatura-surpresa. curl -d "Hermes US$ 7 hoje" ntfy.sh/seu-topico.
🚨 Incident response — Quando dá ruim
Em incidente, decisão lenta custa. Playbook escrito vira piloto automático. Os quatro cenários mais comuns no Hermes: key vazada, fatura disparada, loop infinito, memória corrompida.
Key vazada (commit, post, screenshot)
Contenção em < 5 minutos
1. Revogar a key no painel do provedor. 2. Emitir nova key, guardar em secret manager. 3. Buscar uso anômalo nas últimas 24h. 4. Só depois, rebase do git ou remoção do post.
Fatura disparada (10× do baseline)
Conter primeiro, investigar depois
1. Pausar / revogar a key. 2. Rodar hermes stats --since=24h e jq nos logs por correlation_id mais caro. 3. Identificar se foi loop, abuse, ou skill nova. 4. Aplicar limite (rate-limit) e voltar.
Loop infinito de tools
Sintoma: agente chama a mesma tool sem parar
1. Ctrl-C ou hermes kill <sess_id>. 2. Ativar HERMES_DEBUG=1 e reproduzir. 3. Setar max_tool_iterations: 8 em config.yaml. 4. Pedir issue no repo se for bug do core.
Memória corrompida (DB lock, integrity check falhou)
Sintoma: database disk image is malformed
1. hermes stop. 2. Tentar sqlite3 memory.db ".recover" | sqlite3 memory-recovered.db. 3. Se falhar, restaurar do último backup. 4. Rodar hermes doctor antes de voltar a usar.
💡 Dica — post-mortem blame-free
Depois de cada incidente acima de 30 minutos, escreva 1 página: o que aconteceu, impacto, linha do tempo, causa raiz, ações de prevenção. Sem nomes, sem culpados. Vire pasta no repo (docs/postmortems/) e revisite trimestralmente.
✅ Resumo do Módulo
Próximo módulo:
4.3 — 💰 Custo, billing e otimização. Dashboard OpenRouter, alertas de budget, escolha de modelo por tarefa, prompt caching e fallback dinâmico. Redução típica de 60-80% no gasto mensal.