Construída para privacidade, confiabilidade e portabilidade multi-cloud. Cada decisão arquitetural reflete um trade-off deliberado entre simplicidade, segurança e controle operacional.
Internet
│
▼
┌─────────────────┐
│ Cloudflare │
│ Edge (TLS) │
└────────┬────────┘
│ Tunnel (outbound-only)
▼
┌───────────────────────────────────┐
│ VM · GCP / Azure / AWS │
│ │
│ ┌──────────┐ ┌───────────────┐ │
│ │ allerac │ │ PostgreSQL │ │
│ │ app │ │ + pgvector │ │
│ └──────────┘ └───────────────┘ │
│ │
│ ┌──────────┐ ┌───────────────┐ │
│ │ Ollama │ │ Prometheus │ │
│ │ (LLM) │ │ Loki Grafana│ │
│ └──────────┘ └───────────────┘ │
│ │
│ ┌────────────────────────────┐ │
│ │ Telegram Bot · Webhook │ │
│ └────────────────────────────┘ │
└───────────────────────────────────┘
▲
│ git push → deploy
GitHub ActionsTodo o tráfego público é roteado pelo Cloudflare Tunnel (cloudflared). O túnel cria uma conexão criptografada apenas de saída da VM para o edge da Cloudflare — nenhuma porta de entrada é aberta no firewall, nenhum IP público precisa ser exposto para a aplicação.
O stack de monitoramento roda inteiramente na VM ao lado da aplicação — sem dependência de serviço externo. Logs e métricas ficam na máquina, sem custo extra, e funcionam mesmo sem acesso à internet.
Ollama executa inferência LLM diretamente na VM. Nenhum prompt, conversa ou dado de usuário é enviado a provedores externos de IA salvo configuração explícita. Este é o fundamento do modelo de privacidade: a IA roda onde os dados vivem. Os modelos são baixados uma vez e armazenados em volume Docker persistente, sobrevivendo a deploys e reinicializações.
O container da aplicação é completamente stateless — pode ser parado, reconstruído e reiniciado a qualquer momento sem perda de dados. Todo estado persistente vive em volumes Docker externos.
Toda a infraestrutura é definida em Terraform, dividida entre três clouds (GCP, Azure, AWS) com estrutura idêntica. Trocar de cloud é um terraform apply no diretório alvo. Registros DNS são gerenciados pelo Terraform e apontam para IDs de Cloudflare Tunnel — trocar de cloud atualiza o DNS automaticamente.
Cada VM roda um runner auto-hospedado do GitHub Actions, rotulado por cloud (gcp, azure, aws). Deploys são disparados por pushes na main e rodam diretamente na VM alvo — sem serviço CI externo. O serviço webhook recebe eventos do GitHub, valida assinaturas HMAC-SHA256 e dispara o script de atualização, que baixa o código mais recente e reinicia apenas os containers que mudaram.
O stack usa perfis do Docker Compose para se adaptar ao ambiente sem manter arquivos compose separados. O mesmo docker-compose.yml roda corretamente em um laptop de desenvolvedor, uma VM GCP, uma VM Azure e uma instância EC2 da AWS — sem modificações.