Case study · Backend infrastructure
Notification Pipeline System
Centralised notification infrastructure that receives application events and delivers them through multiple communication providers — with API-key authentication, asynchronous processing, delivery tracking and monitoring built in.
Why it exists
Notification logic tends to spread: provider-specific code ends up inside every application that needs to send an email, SMS or WhatsApp message. That makes delivery hard to retry, hard to audit and expensive to change when a provider is swapped. This service pulls all of that into one place.
Solution
Applications publish events to a single platform. The platform resolves the right provider, delivers asynchronously and records what happened — separating API requests, worker processing, persistence and provider integrations into distinct parts of the system.
Key features
- REST APIs for applications, API keys, events, notifications, templates, providers, monitoring and reporting
- Provider abstraction supporting email, SMS, SMTP, WhatsApp and Resend
- API-key authentication, request identification and protected service-to-service routes
- Notification lifecycle tracking: delivery attempts, delivery logs, retries and provider resolution
- Templates and event payloads kept separate from provider implementation details
Implementation
- FastAPI service with SQLAlchemy models and Alembic-managed schema evolution
- Event-driven asynchronous processing with Redis and Celery, so notification workloads run independently of API requests
- Docker Compose orchestrating PostgreSQL, Redis, FastAPI, Celery workers, frontend and Nginx services
- Ubuntu Linux production infrastructure with persistent storage, health checks, reverse proxying and containerised frontend delivery
- Structured logging, request ID middleware and authentication middleware built into the request pipeline
Observability & operations
- Prometheus metrics, health endpoints and structured request logging
- Request ID tracing across API requests and background processing
- Diagnosed and resolved deployment issues involving Docker networking, service health checks, application startup, configuration and internal/external routing
- Git-based deployment workflow for synchronising changes and rebuilding containerised services on the production server
Engineering highlights
- Clean separation between API layer, asynchronous workers, persistence and provider integrations
- Provider abstraction pattern — a new communication channel can be added without touching core application logic
- Retry and delivery-log model designed for diagnosing failures rather than hiding them