Ir para o conteúdo

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)

/opt/infra/vm-about/
├── docker-compose.yml   # apenas zabbix-agent
├── .env
└── apps/
    └── sinapses/

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

# Nenhuma porta pública
# Portas de aplicação vinculadas a localhost
127.0.0.1:<PORTA>:<PORTA>

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