Plataforma de recaudación de fondos para organizaciones sin fines de lucro
Plataforma SaaS multiinquilino para que universidades y organizaciones sin fines de lucro gestionen campañas de recaudación de fondos con seguimiento de donaciones en tiempo real, programas de embajadores, personalización de marca y escalabilidad de nivel empresarial en Kubernetes.
🔒 Trabajo privado / de cliente — el sitio en vivo y el código están bajo NDA. Con gusto explico la arquitectura y mi rol en una llamada.
Descripción general del proyecto
Una plataforma de recaudación de fondos con todas las funciones que permite a las organizaciones lanzar y gestionar campañas de recaudación. El sistema admite aislamiento multiinquilino con bases de datos por organización, feeds de donaciones en tiempo real mediante Server-Sent Events, páginas de recaudación de embajadores, retos configurables y marca blanca, todo gestionado a través de un panel de administración de Wagtail CMS.
Características principales
- Arquitectura multiinquilino con una base de datos principal compartida y bases de datos de donaciones por organización
- Feed de donaciones en tiempo real impulsado por microservicios SSE (FastAPI y Rust/Axum) con pub/sub de Redis
- Programa de embajadores: páginas de recaudación personales con objetivos individuales y tablas de clasificación
- Termómetros de campaña, retos con tiempo limitado y designaciones de causas
- Marca blanca por organización (logotipos, colores, tipografías, dominios personalizados)
- Autenticación SSO mediante OIDC (Google, Azure AD, Okta)
- Tareas en segundo plano con Celery para la agregación de estadísticas y el precalentamiento de la caché
- Detección de bots y limitación de velocidad en las conexiones SSE
- Trazabilidad distribuida con OpenTelemetry y Jaeger
- Conjunto de pruebas de extremo a extremo con Playwright
Arquitectura
Pila multiservicio: Django/Gunicorn para la capa web, FastAPI/Hypercorn y Rust/Axum para el streaming SSE asíncrono sobre HTTP/2, workers de Celery para el procesamiento en segundo plano, MySQL para el almacenamiento multiinquilino y Redis para la caché y el pub/sub. Los archivos multimedia se sirven desde Azure Blob Storage detrás de una CDN. Desplegada en Kubernetes mediante Helm con autoescalado, presupuestos de interrupción de pods y sondas de estado. Rendimiento optimizado de más de 70 consultas a solo 9 en páginas de campaña complejas mediante la eliminación de N+1 y el almacenamiento en caché multicapa.