--- adr: ADR-005 title: Self-hosted by default — managed SaaS exige excecao escrita; politica de excecoes vigentes status: accepted date: 2026-05-23 deciders: sa-principal, sa-platform-lead project: disclosure-bureau --- ## Context O `systems-atelier` declara no manifest: > "Open-source e self-hosted em VPS por padrao. SaaS/managed exige excecao escrita e justificada." O Disclosure Bureau implementa essa politica em maioria mas mantem dependencias externas que precisam ser **explicitas** para nao virarem dette tecnica oculta: | Dependencia externa | Categoria | Justificativa | |---|---|---| | OpenRouter (chat sincrono) | LLM proxy | Tier free 0 USD; tool calling funciona; sem alternativa OSS local com mesma qualidade + multi-modelo | | Anthropic Claude (vision + investigator) | LLM | Sonnet 4.6 vision para PDF + agente investigador. Sem OSS equivalente em qualidade vision. | | Claude Code OAuth Max 20x | LLM (quota) | Quota gratis ja paga. Mesmo provider, canal alternativo. | | Spacemail (SMTP) | Email transactional | Magic-link envio. SES self-host overkill para volume baixo. | | Let's Encrypt (TLS) | PKI | Padrao da industria. CertResolver via Traefik. | | war.gov source PDFs | Data source | E o corpus em si — nao auto-substituivel. | | GitHub (deploy artifacts) | Code host | Pode migrar para Forgejo/Gitea self-host (Q3 2026 review). | | Hetzner / similar VPS | IaaS | Infra fisica; nao se evita. | E o que **NAO** entra (self-host adotado): - Postgres (Supabase) — self-host. - GoTrue, PostgREST, Realtime, Storage, Imgproxy, Studio, Kong — self-host. - BGE-M3 + Reranker — self-host (embed-service). - Meilisearch — self-host. - Traefik — self-host. - Sentry — **decisao W1**: avaliar Glitchtip self-host vs Sentry cloud free tier. ## Decision **Politica formal:** 1. **Default: self-host.** Qualquer novo servico/dependencia comeca avaliando OSS self-hostable. 2. **Excecao escrita** em ADR quando: - Sem alternativa OSS com qualidade aceitavel (criterio claro), OU - Custo de operar self-host > custo direto SaaS × 12 meses, OU - Restricao legal/compliance especifica. 3. **Excecoes vigentes** listadas na tabela acima. Cada uma precisa ser: - Sem state critico do projeto (exemplo: dados podem ser exportados a qualquer momento; nao ha lock-in). - Substituivel em <4 semanas de trabalho (plano de saida documentado). 4. **Excecoes proibidas:** - **Gemini** (politica especifica do projeto; ver `feedback-no-gemini-ever.md` memoria). - Banco de dados managed (RDS, Supabase Cloud paid) — corpus precisa estar 100% sob controle. - LLM gateway pagas alem de OpenRouter free tier sem ADR especifico. - CDN com state (Vercel KV, Cloudflare D1) — viola "data soberania". 5. **Periodicamente:** revisar lista de excecoes (semestre). Revisar se equilibrio mudou (ex: Glitchtip amadureceu? Forgejo viavel?). ## Consequences **Positivas:** - Soberania de dados sobre corpus desclassificado (motivo central do projeto). - Custo recorrente baixo (~10 EUR/mes VPS + $0 OpenRouter free + $30-110/mes LLM agentic). - Sem dependencia de business decisions de fornecedor (Vercel mudar tier, Supabase Cloud aumentar preco). **Negativas:** - Mais operacao (10 containers no VPS, monitorados manualmente). - Atualizacoes de seguranca por nossa conta (Trivy em CI mitiga). - Backup/DR e nosso problema (W5+ adicionar backup strategy). ## Verification - `docker-compose.yml` lista todos os servicos do data plane self-host. Confirmado. - Lista de excecoes nesta ADR. Confirmar trimestralmente. - Plano de saida documentado para cada excecao: - OpenRouter -> Mistral.ai self-host (>= 70B local com GPU) em 2-4 semanas. - Anthropic -> Llama local (BAIXA qualidade hoje; 2027+). - Spacemail SMTP -> Postfix self-host em 1 dia. - GitHub -> Forgejo self-host em 1 semana. ## Future review triggers - Volume de chat > 10k/dia: avaliar movido para Mistral/Groq self-host. - Quota Anthropic Max 20x saturada constantemente: avaliar adicionar API key paid OU mover para local model. - Sentry cloud free tier estoura: instalar Glitchtip imediatamente. - Auditoria seguranca pediu zero-trust extra: provisionar VPS dedicado para investigator-runtime em rede separada. ## References - `systems-atelier/business.yaml` (manifest do business) - Memoria do projeto: `feedback-no-gemini-ever.md`, `user-plan-max-20x.md` - `infra/disclosure-stack/docker-compose.yml`