VPS Dev — inventário técnico¶
Último snapshot: 2026-07-31 (pós-desligamento Luiz). Fonte:
docker ps -a,docker inspect,crontab,systemctl,docker network inspect, logs ao vivo — TODOS coletados do sistema real, nada inferido. Snapshot bruto:/tmp/vps-dev-inventory.mdna VPS + cópia local emC:/tmp/vps-dev-inventory.md.
O que é¶
VPS Hostinger em 2.24.117.172 (srv1692513, KVM2 Ubuntu 24.04.4, kernel 6.8, Docker + containerd + monarx-agent scanner de segurança da Hostinger). Chamada "Dev" por convenção histórica — na prática hospeda produção informal (fora do Coolify) de sistema herdado do cliente GCI-GO + POC de agenda Cadencia + Motor Autônomo do framework + laboratório pessoal do Felipe.
O snapshot antigo em docs/snapshots/vps-dev-2026-05-25.md afirmava "sem cron, sem systemd customizado, ambiente puro pra sessões SSH". Está desatualizado — desde jun/26 acumulou cron + systemd + 4 stacks Docker + cloudflared tunnel expondo endpoints públicos.
Contexto pós-desligamento Luiz (30/07/2026)¶
Duas coisas mudaram no dia D:
- User
luizinerte — sem chave SSH, sem senha, sem grupos privilegiados (removido desudoedocker, sudoers NOPASSWD deletado). Home/home/luiz/preservado (Felipe pediu "só corte o acesso"). Backup em/root/luiz-preserve/(304KB — bash_history, .config, PROCESSO-PR-DEPLOY-VERCEL.md, 2 patches: DEV-1465 QR prep e DEV-1614 snapshot-completo). - User
renandeletado (userdel -r). Backup em/root/renan-preserve/(104KB — bash_history, .config, patch cadencia-docs-cli.md).
Colaterais do desligamento: - pkill -9 -u luiz seguido de reboot manual causou downtime ~15min dos containers rodando na VPS Dev. Nada oficial da Cadencia caiu — Master intocada. Todos os containers com restart=unless-stopped subiram sozinhos. - Compose files físicos SUMIRAM com o userdel -r luiz: lara/docker-compose.yml (vivia em /home/luiz/projetos/gci-go/lara/) e agenda-spike/docker-compose.yml (vivia em /tmp/claude-*/scratchpad/). Containers rodam (Docker daemon guarda config em /var/lib/docker/), mas se cair não há como docker compose up — precisa reconstituir via docker inspect. Runbook em runbook-recuperar-compose.md. - Sudoers /etc/sudoers.d/luiz (NOPASSWD:ALL) foi criado quando Luiz recuperou acesso nos 18min entre kill e reboot (achando que era invasão) — removido. - Cron luiz-state (/opt/luiz-state/luiz_state_cron.sh, 21h40 dias úteis) ficou órfão — precisa desligar ou reescrever. - Systemd pd-syslog.service roda --users luiz — vai começar a errar em silêncio agora que Luiz é inerte.
4 stacks Docker ativas + 1 histórica¶
| Stack | Containers | Status | Responsável | Doc |
|---|---|---|---|---|
| Lara GCI-GO | lara-api, lara-worker, lara-postgres, lara-redis | Up (modo degradado — sem ecuro-middleware nem confirmation-queue-api) | Cliente PD encerrado; 3 tenants Sorria Goiás continuam processando reconcile | stack-lara-gci-go.md |
| Cadencia Agenda spike | cadencia-agenda-app (Easy!Appointments), cadencia-agenda-mysql | Up (POC do Luiz virou de facto produção — DEV-1364 previa Easy!Appointments como provider agenda Lara) | Felipe (herdado do Luiz) | stack-cadencia-agenda.md |
| PD Motor Autônomo | pd-motor | Up (sobe OFF por default — kill switch soberano) | Felipe (framework oficial) | stack-pd-motor.md |
| Hermes Agent | (rodaria hermes, network_mode: host) | Compose existe, container não está rodando agora | Third-party Nous Research (lab pessoal Felipe) | stack-hermes-agent.md |
| ~~Attemys/Nexo (Luiz)~~ | 9 containers em 3 stacks (attemys-verify-f4c1/f4e0/f4e1-{nats,redis,postgres}) | Exited (parados desde o pkill) | Ex-projeto pessoal do Luiz (COM-98 Done) | Safe deletar |
Cloudflared Tunnel — porta única de entrada pública¶
cloudflared.service (systemd, active) expõe portas locais via Cloudflare sem abrir a VPS pra internet direta. Peça central da arquitetura da VPS Dev — sem ele nenhum endpoint funciona externamente.
5 hostnames configurados no tunnel: | Hostname | Local | Status container | Uso | |---|---|---|---| | lara.cadencia.ia.br | 127.0.0.1:8095 | ✅ lara-api UP | Webhook WhatsApp Sorria Goiás | | queue.cadencia.ia.br | 127.0.0.1:3000 | ❌ sem container | Era confirmation-queue-api — sumiu | | ecuro.cadencia.ia.br | 127.0.0.1:8099 | ❌ sem container | Era ecuro-middleware — sumiu | | ue.cadencia.ia.br | 127.0.0.1:5173 | ❌ sem container | Vite dev server — abandonado | | testes.cadencia.ia.br | localhost:3000 | ❌ sem container | Env de testes — abandonado |
Detalhe completo + token + como recuperar: cloudflared-tunnel.md.
Portas listening (host)¶
:22 sshd
:8085 docker-proxy → cadencia-agenda-app:80 (Easy!Appointments UI)
:8095 docker-proxy → lara-api:8090 (Lara FastAPI)
Nada em :3000, :5173, :8099 — endpoints do tunnel apontam pra portas sem serviço.
Cron + systemd — automação viva¶
Ver detalhe em crons-e-services.md. Resumo:
Cron root (2 entries): - daily-brief (/opt/daily-brief/brief.py, 11h00 e 21h30 dias úteis) — Stamper Gestão async fase 3a - luiz-state (/opt/luiz-state/luiz_state_cron.sh, 21h40 dias úteis) — órfão (DEV-866, snapshot dev do Luiz)
Cron felipe (7 entries): - sync-dev-docs (/opt/sync-dev-docs.py, 23h) - cadencia-autofix (/home/felipe/cadencia-autofix/run.sh, 15min, flock=1) — CAD-689 pega own:agente in-progress - health-dev (/home/felipe/health-dev/dev_selfreport.py, 10min) - pos-briefing (/home/felipe/pos-briefing-trigger.sh, 5min de cada hora 8h-22h) — CSE-97 dry-run transcrição Fireflies - motor-notify (_core/motor_notify_cron.sh, 10min) - stale-claim-reaper (_core/stale_claim_reaper_cron.sh, hourly) — DEV-1344 libera claims own:agente órfãos, 2 estágios cap 5/run
Systemd (2 customizados): - cloudflared.service — tunnel Cloudflare (crítico) - pd-syslog.service — pd-syslog --users luiz (vai errar agora que luiz é inerte)
Docker resources¶
18 volumes locais (docker volume ls), sendo os persistentes conhecidos: cadencia-agenda-mysql-data, lara-redis-data, lara-postgres-data. Demais são anônimos (Attemys e outros).
16 networks (3 são attemys-verify-* da stack parada + cadencia-agenda-network, lara-internal, pd-motor_default, pd-shared).
Índice de docs¶
| Doc | Sobre |
|---|---|
architecture.md | Diagrama C4 mermaid — como as peças se ligam |
cloudflared-tunnel.md | Tunnel Cloudflare + 5 hostnames expostos |
stack-lara-gci-go.md | 4 containers Lara (cliente encerrado) + ENV vars mascarados |
stack-cadencia-agenda.md | Spike Easy!Appointments do Luiz (POC DEV-1364) |
stack-pd-motor.md | Motor Autônomo (link pra _core/deploy/motor/) |
stack-hermes-agent.md | Hermes Agent Nous Research (third-party, lab pessoal) |
crons-e-services.md | Cron root/felipe + systemd customizados |
paths-e-storage.md | /home/felipe/, /opt/, /root/*-preserve/, /var/lib/docker/ |
runbook-recuperar-compose.md | Reconstituir compose files perdidos via docker inspect |
Regras absolutas VPS Dev¶
- Nunca
pkill -u <user>semdocker psantes. Container rodando com--user <uid>no host morre com pkill do uid, mesmo com o Docker daemon como root. Aprendido em 30/07/2026. - Compose files em
/tmp/são efêmeros — reboot apaga./tmp/claude-*/scratchpad/*/docker-compose.ymlé caminho de morte lenta. Se um compose for pra sobreviver, mover pra/home/felipe/compose/ou/opt/compose/. - Cloudflared tunnel é a única porta pública (fora do SSH). Firewall UFW default
DENYincoming. Nunca abrir porta em0.0.0.0sem passar pelo tunnel — expõe direto na internet. monarx-agent(systemd) pode adicionar regras UFW automáticas bloqueando IPs suspeitos. Se SSH cair após várias tentativas do mesmo IP externo, checarsudo ufw status verbose— pode ter regra explícitaDENY IN <ip>.
Refs¶
- Snapshot anterior (desatualizado):
docs/snapshots/vps-dev-2026-05-25.md _core/VPS-ACCESS.md— como conectar (chaves SSH, sudo, troubleshoot)_core/REPO-MAP.md— mapa completo de repos_core/deploy/motor/compose.yml— compose oficial do Motortimes/produto/cadencia/docs/architecture/lara.md— arquitetura Lara Cadencia (a nova, na Master — não confundir com a GCI-GO daqui)times/produto/cadencia/docs/features/lara/agendamento.md— spec agendamento Lara (contexto pra entender o spike Easy!Appointments)times/produto/consultorias/encerrados/gci-go/— STATE + PRD + EPICs do cliente encerradostamper/skills/{ligar,desligar,logar}-motor/— skills operar Motor Autônomo- Sessão do desligamento (30/07):
sessions-log/2026-07-30/comercial-desligamento-*.md