Files
arnes/spec/sdd/decisions/002-almacenamiento-avatar.md
rikrdo 3ff9b70e4c refactor: complete bootstrap of ARNES agent harness framework
- Add complete agent harness structure with 8 roles (leader, triager, architect, implementer, reviewer, security, qa, documenter)
- Implement strict workflow with 9 stages and mandatory gates
- Add comprehensive verification script and runtime status tracking
- Create artifact-based evidence system with contracts and schemas
- Add agent policy matrix with permissions and anti-cheat rules
- Include test suite (44 tests passing) and CI-ready structure
- Add documentation: README, HOWTO, CHECKPOINTS, templates
- Configure model routing policies and token-aware task assignment
- Add BDD/SDD specification guides and feature templates
- Include starter pack for quick project onboarding

All verification checks pass. Framework ready for production use.
2026-05-17 23:25:35 +02:00

2.3 KiB

ADR-002: Almacenamiento de Avatares

Estado

Aceptado

Fecha

2026-05-06

Contexto

Los usuarios pueden subir avatares personalizados. Necesitamos decidir dónde y cómo almacenar las imágenes de perfil para optimizar costo, rendimiento y mantenimiento.

Decisión

Usar Storage Service externo (S3-compatible) con URLs firmadas para avatares.

Justificación

  1. Simplicidad: No requerimos procesar imágenes en nuestro servidor
  2. Costo: S3-like storage es económico ($0.023/GB)
  3. CDN: Los avatares se sirven desde CDN automáticamente
  4. Seguridad: URLs firmadas con expiración evitan hotlinking
  5. Mantenimiento: No requiere gestión de sistema de archivos

Consecuencias

Positivas

  • No hay infraestructura de archivos que mantener
  • Escalabilidad automática
  • URLs firmadas = más seguridad
  • Cache CDN = mejor performance

Negativas

  • Dependencia de proveedor externo
  • Costo de storage + egress
  • Latencia extra por redirect a CDN

🔄 Neutrales

  • Requiere configuración de CORS

Alternativas Consideradas

Opción A: Almacenamiento local en servidor

  • Pros: Sin dependencia externa, rápido para lecturas
  • Contras: No escala horizontalmente, requiere backup, problemas de disco
  • Razón de descarte: No escala bien con múltiples instancias

Opción B: Base de datos como BLOB

  • Pros: Todo en un lugar, transacciones integradas
  • Contras: PostgreSQL no optimizado para archivos grandes, backup lento
  • Razón de descarte: degrada performance de DB, backups muy pesados

Opción C: Servicio dedicado de imágenes (Cloudinary/Imgix)

  • Pros: Transformación de imágenes, CDN incluido, optimización automática
  • Contras: Más costoso ($50+/mes), vendor lock-in
  • Razón de descarte: Over-engineering para avatares simples

Implementación

  1. Cliente sube imagen a /api/v1/profile/upload (multipart)
  2. Servicio valida tipo (jpg/png/webp) y tamaño (<5MB)
  3. Servicio sube a S3 con nombre avatars/{user_id}/{timestamp}.{ext}
  4. Servicio genera URL firmada (7 días validez)
  5. URL se guarda en campo avatar_url del perfil

Notas

  • Considerar WebP en el futuro para optimización
  • Implementar cleanup de avatares huérfanos (job semanal)

Relacionado con

  • Feature F-002
  • Componente: UserProfileService