Платформа для збору коштів для некомерційних організацій
Мультитенантна SaaS-платформа для університетів і некомерційних організацій для проведення фандрайзингових кампаній із відстеженням пожертв у реальному часі, амбасадорськими програмами, налаштовуваним брендингом і масштабованістю корпоративного рівня на Kubernetes.
🔒 Приватна / клієнтська робота — робочий сайт і код під NDA. Радо розповім про архітектуру та свою роль під час дзвінка.
Огляд проєкту
Повнофункціональна платформа для збору коштів, що дає організаціям змогу запускати та керувати фандрейзинговими кампаніями. Система підтримує ізоляцію мультитенантності з окремими базами даних для кожної організації, стрічки пожертв у реальному часі через Server-Sent Events, сторінки амбасадорів для збору коштів, налаштовувані челенджі та white-label брендинг — усе це керується через адмінку Wagtail CMS.
Ключові можливості
- Мультитенантна архітектура зі спільною основною БД та окремими базами даних пожертв для кожної організації
- Стрічка пожертв у реальному часі на базі SSE-мікросервісів (FastAPI та Rust/Axum) із pub/sub через Redis
- Програма амбасадорів — персональні сторінки збору коштів з індивідуальними цілями та таблицями лідерів
- Термометри кампаній, обмежені в часі челенджі та призначення на конкретні цілі
- White-label брендинг для кожної організації (логотипи, кольори, шрифти, кастомні домени)
- SSO-автентифікація через OIDC (Google, Azure AD, Okta)
- Фонові завдання Celery для агрегації статистики та прогрівання кешу
- Виявлення ботів та обмеження частоти на SSE-з'єднаннях
- Розподілене трасування за допомогою OpenTelemetry та Jaeger
- Набір наскрізних тестів на Playwright
Архітектура
Багатосервісний стек: Django/Gunicorn для веб-рівня, FastAPI/Hypercorn та Rust/Axum для асинхронного SSE-стрімінгу через HTTP/2, воркери Celery для фонової обробки, MySQL для мультитенантного зберігання та Redis для кешування й pub/sub. Медіа надаються з Azure Blob Storage за CDN. Розгорнуто в Kubernetes через Helm з автомасштабуванням, бюджетами переривання подів (pod disruption budgets) та health-пробами. Продуктивність оптимізовано з 70+ запитів до 9 на складних сторінках кампаній завдяки усуненню N+1 та багаторівневому кешуванню.