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
- Object storage S3-compatible (AWS S3 o Cloudflare R2). Adapter detrás de un puerto.
- Claves:
organizationId/...— nunca un bucket plano sin prefijo de tenant. - Uploads vía URL firmada o stream por API; el browser no usa credenciales root.
- Postgres guarda metadatos + key, no el binario.
- 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.