---
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`
