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

4.3 KiB
Raw Permalink Blame History

adr title status date deciders project
ADR-005 Self-hosted by default — managed SaaS exige excecao escrita; politica de excecoes vigentes accepted 2026-05-23 sa-principal, sa-platform-lead 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