Arquitetura Geral — Sinapses IA¶
Projeto: Sinapses IA — Infraestrutura e Monitoramento com Caddy + Zabbix
Data: Abril 2026
Autor: Arthur Jahn (Tech Lead)
Status: Versão 1.0
1. Diagrama de Fluxo¶
Internet
↓
[DNS: *.sinapsesia.com.br → 172.174.236.146]
[DNS: *.hm.sinapsesia.com.br → 172.174.236.146]
↓
[vm-assurance-llm: Caddy — Proxy Reverso + TLS]
├─→ zabbix.sinapsesia.com.br → zabbix-web:8080 (local)
├─→ docs.sinapsesia.com.br → mkdocs:8000 (local)
├─→ registry.sinapsesia.com.br → registry:5000 (local)
├─→ {app}.hm.sinapsesia.com.br → vm-sandbox:PORTA (privado)
├─→ {app}.sinapsesia.com.br → vm-llm2:PORTA (privado)
└─→ sinapses.sinapsesia.com.br → vm-about:PORTA (privado)
[vm-assurance-llm-sandbox] → Zabbix Agent → vm-assurance-llm:10051
[vm-assurance-llm2] → Zabbix Agent → vm-assurance-llm:10051
[vm-assurance-llm-about] → Zabbix Agent → vm-assurance-llm:10051
Comunicação entre VMs¶
| Origem | Destino | Protocolo | Porta |
|---|---|---|---|
| Caddy (vm-llm) | vm-sandbox | HTTP | porta interna do serviço |
| Caddy (vm-llm) | vm-llm2 | HTTP | porta interna do serviço |
| Caddy (vm-llm) | vm-about | HTTP | porta interna do serviço |
| Zabbix Agent (vm-sandbox) | Zabbix Server (vm-llm) | TCP | 10051 |
| Zabbix Agent (vm-llm2) | Zabbix Server (vm-llm) | TCP | 10051 |
| Zabbix Agent (vm-about) | Zabbix Server (vm-llm) | TCP | 10051 |
2. Configuração do Caddy¶
O Caddy utiliza um Caddyfile para definir rotas e gerenciar certificados TLS automaticamente via Let's Encrypt (ACME HTTP-01).
Estrutura do Caddyfile¶
{
email admin@sinapsesia.com.br
}
zabbix.sinapsesia.com.br {
reverse_proxy zabbix-web:8080
}
docs.sinapsesia.com.br {
reverse_proxy mkdocs:8000
}
registry.sinapsesia.com.br {
request_body { max_size 10GB }
reverse_proxy registry:5000
}
# Homolog — adicionar um bloco por app implantado no vm-sandbox
# analyze.hm.sinapsesia.com.br {
# reverse_proxy <IP_PRIVADO_VM_SANDBOX>:<PORTA>
# }
Headers X-Forwarded¶
Para preservar o IP e protocolo original do cliente:
reverse_proxy backend:port {
header_up X-Forwarded-For {http.request.remote}
header_up X-Forwarded-Proto {http.request.proto}
header_up X-Forwarded-Host {http.request.host}
}
Express.js
Para aplicações Node.js/Express, adicionar app.set('trust proxy', 1) para que req.ip retorne o IP correto.
3. Docker Compose por VM¶
vm-assurance-llm (Caddy + Zabbix + Registry + MkDocs)¶
Estrutura de diretórios no servidor:
/opt/infra/vm-llm/
├── docker-compose.yml
├── Caddyfile
├── .env
├── auth/
│ └── htpasswd # gerado pelo setup.sh
└── data/
├── caddy/
├── registry/
└── zabbix/
├── db/
├── alertscripts/
└── externalscripts/
Serviços:
| Serviço | Imagem | Porta (interna) |
|---|---|---|
caddy |
caddy:2-alpine |
80, 443 (público) |
mkdocs |
squidfunk/mkdocs-material |
8000 |
registry |
registry:2 |
5000 |
zabbix-server |
zabbix/zabbix-server-mysql:7.2-alpine-latest |
10051 |
zabbix-web |
zabbix/zabbix-web-nginx-mysql:7.2-alpine-latest |
8080 |
zabbix-db |
mysql:8.0 |
3306 |
zabbix-agent |
zabbix/zabbix-agent2:7.2-alpine-latest |
— |
vm-assurance-llm-sandbox (Homologação)¶
Docker Compose de infraestrutura contém apenas o Zabbix Agent 2.
Cada aplicação homologada possui seu próprio docker-compose.yml em apps/{nome-do-app}/.
Estrutura:
/opt/infra/vm-sandbox/
├── docker-compose.yml # apenas zabbix-agent
├── .env
└── apps/
├── sinapses-hm/
│ ├── docker-compose.yml
│ └── .env
├── recruit-hm/
│ ├── docker-compose.yml
│ └── .env
└── bpmn-hm/
├── docker-compose.yml
└── .env
vm-assurance-llm2 (Produção — Projetos Lovable)¶
/opt/infra/vm-llm2/
├── docker-compose.yml # apenas zabbix-agent
├── .env
└── apps/
├── analyze/
└── recruit/
vm-assurance-llm-about (Produção — Sinapses IA)¶
4. Segurança de Portas¶
Princípio: Least Privilege¶
Cada VM expõe apenas as portas estritamente necessárias.
vm-assurance-llm¶
# Público
80:80 HTTP (ACME challenge)
443:443 HTTPS
# Localhost only
127.0.0.1:3306:3306 MySQL (Zabbix DB)
# Rede privada (VNet)
10051:10051 Zabbix Server (agentes de outros VMs)
vm-assurance-llm-sandbox, vm-llm2, vm-about¶
Regras de Firewall (UFW)¶
# vm-assurance-llm
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from <SUBNET_PRIVADA> to any port 10051
ufw default deny incoming
# Outros VMs
ufw allow 22/tcp
ufw default deny incoming
5. Referências¶
6. Changelog¶
| Versão | Data | Descrição |
|---|---|---|
| 1.0 | Abril 2026 | Documentação inicial |
Confidencial — Assurance IT