disclosure-bureau/docs/adrs/ADR-005-self-hosted-by-default.md
Luiz Gustavo eaf282c535
Some checks failed
CI / Web — typecheck + lint + build (push) Failing after 40s
CI / Scripts — Python smoke (push) Failing after 3s
CI / Web — npm audit (push) Failing after 29s
CI / Retrieval — golden set (Recall@5 + MRR) (push) Failing after 3s
W2: rerank opt-in, analyze_image_region tool, RAG eval, graph cleanup, ADRs
- TD#8 hybrid.ts: rerank_strategy {always|when_top_k_gt|never} + threshold
  (default skips rerank for top_k ≤ 15; chat tool uses threshold 10)
- O11 vision.ts + tools.ts: analyze_image_region tool — sharp-crops the
  bbox, claude CLI reads the temp PNG via Read tool, Sonnet vision answers
- TD#12 /graph: SigmaGraph replaces ForceGraphCanvas; react-force-graph-2d
  uninstalled (-37 transitive deps); force-graph-canvas.tsx deleted
- TD#27 messages/route.ts gatherContext slice sizes via CTX_* env vars
- TD#22 tests/rag/: golden.yaml (15 queries) + run.py (Recall@k + MRR +
  negative-pass rate) + baseline.json + CI job in .forgejo/workflows/ci.yml
- docs/adrs/: ADR-001..005 published from systems-atelier deliverables

Verified live on disclosure.top: top_k=5 path skips rerank (6.7s embed-only,
was 12-15s with rerank); rerank=always still available on demand.
First RAG baseline: Recall@5 = 0.2083, MRR = 0.25, Negative pass = 1.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 19:20:09 -03:00

90 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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