ADR-029 — Object storage

Architecture decision record — status: Accepted.

Source: docs/adr/ADR-029-object-storage.md

ADR-029: Object storage

Estado

Accepted — 2026-08-23

Contexto

V1 guarda CSV originales, posibles adjuntos de invoice y, si hace falta, .eml. No es un CDN de fotos de menú (caso IVPrior).

Decisión

  1. Object storage S3-compatible (AWS S3 o Cloudflare R2). Adapter detrás de un puerto.
  2. Claves: organizationId/... — nunca un bucket plano sin prefijo de tenant.
  3. Uploads vía URL firmada o stream por API; el browser no usa credenciales root.
  4. Postgres guarda metadatos + key, no el binario.
  5. Local: MinIO o filesystem adapter para make local-up (se elige en el slice de storage).

Alternativas

Solo Postgres BYTEA: se descarta (backups, tamaño de CSV/eml).

Consecuencias

  • Primer scaffold puede diferir el adapter si no hay uploads aún (CSV pegado/parseado en request). El puerto debe existir antes del primer upload.