Architecture Overview
This document provides a comprehensive overview of the FeelyFeely CDN architecture, including system design, components, data flow, and scalability considerations.
High-Level Architecture
graph TB
subgraph "Client Layer"
CA[Client Applications]
WA[Web Applications]
MA[Mobile Apps]
end
subgraph "CDN Layer"
LB[Load Balancer]
API[Flask API Server]
GU[Gunicorn Workers]
end
subgraph "Processing Layer"
UC[Uploadcare Service]
WM[Watermark Processor]
CV[OpenCV Engine]
end
subgraph "Storage Layer"
DS[DigitalOcean Spaces]
UAS[User Asset Storage]
MDS[Mobile Device Storage]
VPS[Vehicle Photo Storage]
end
subgraph "Database Layer"
MY[MySQL Database]
MG[MongoDB Instance]
KC[Keycloak Auth]
end
CA --> LB
WA --> LB
MA --> LB
LB --> API
API --> GU
API --> UC
API --> WM
WM --> CV
API --> DS
DS --> UAS
DS --> MDS
DS --> VPS
API --> MY
API --> MG
API --> KC
System Components
1. Application Layer
Flask Application (app.py)
- Role: Core application factory
- Features: CORS enabled, modular blueprint registration
- Configuration: Development and production modes
Server Module (server.py)
- Role: Main entry point and route definitions
- Features: Default endpoints, blueprint registration
- Endpoints: Health check, service information
WSGI Gateway (wsgi.py)
- Role: Production server interface
- Features: Gunicorn compatibility, worker process management
2. Database Layer
MySQL Database (db_config.py, dbutils/mysql.py)
- Primary Database: Main application data
- Business Database: Business-specific data
- Features:
- Connection pooling
- Dictionary cursor support
- Multi-database architecture
- SQLAlchemy integration
MongoDB (dbutils/mongodb.py)
- Role: Document storage and flexible data models
- Features:
- SSL/TLS encrypted connections
- Aggregation pipeline support
- Upsert operations
- Join operations across collections
- Error handling and logging
3. Storage Layer
DigitalOcean Spaces (models/digitalocean/spaces.py)
- Architecture: S3-compatible object storage
- Buckets:
ff.user.assets: User-uploaded contentff.organization.assets: Organization assetsff.mobiledevice.photos: Mobile device photosff.vehicle.photos: Vehicle images
Features:
- Presigned URL generation
- File existence checking
- Multi-region support
- Automatic retry mechanisms
4. Image Processing Pipeline
Uploadcare Integration (models/image/uploadcare/)
- Primary Processor: Cloud-based image processing
- Features:
- File upload and storage
- Real-time transformations
- Format optimization
- Quality adjustment
- CDN distribution
Watermark Engine (models/image/watermark/watermark_embed.py)
- Technology: OpenCV + Pillow
- Intelligence: Brightness-based logo selection
- Features:
- Critical area detection (faces, text, edges)
- Optimal positioning algorithm
- Real-time processing
- Multiple logo support
Data Flow Architecture
1. Image Request Flow
sequenceDiagram
participant C as Client
participant API as Flask API
participant DO as DigitalOcean Spaces
participant UC as Uploadcare
participant WM as Watermark Engine
C->>API: GET /image/{bucket}/{uuid}/{operation}/{file}
API->>DO: Check if processed image exists
alt Image exists
DO->>API: Return processed image
API->>WM: Apply watermark
WM->>API: Return watermarked image
API->>C: Return final image
else Image doesn't exist
API->>DO: Fetch original image
DO->>API: Return original image
API->>UC: Upload for processing
UC->>UC: Apply transformations
UC->>API: Return processed image
API->>DO: Store processed image
API->>WM: Apply watermark
WM->>API: Return watermarked image
API->>C: Return final image
end
2. Database Operations Flow
graph LR
subgraph "Application Logic"
AL[API Endpoints]
end
subgraph "Database Abstraction"
MYSQL[MySQL Utils]
MONGO[MongoDB Utils]
end
subgraph "Database Connections"
MYC[MySQL Connection]
MGC[MongoDB Connection]
end
subgraph "Data Storage"
MYD[(MySQL Databases)]
MGD[(MongoDB Collections)]
end
AL --> MYSQL
AL --> MONGO
MYSQL --> MYC
MONGO --> MGC
MYC --> MYD
MGC --> MGD
Scalability Architecture
1. Horizontal Scaling
Worker Process Scaling
# gunicorn_config.py
workers = (2 * cpu_count()) + 1
worker_class = 'gevent'
worker_connections = 1000
Database Scaling
- MySQL: Master-slave replication support
- MongoDB: Replica set configuration
- Connection Pooling: Efficient resource utilization
2. Vertical Scaling
Resource Optimization
- Memory: Efficient image processing buffering
- CPU: Multi-threaded image operations
- I/O: Asynchronous file operations
3. Caching Strategy
Multi-Level Caching
graph TD
subgraph "Caching Layers"
CDN[CDN Edge Cache]
APP[Application Cache]
DB[Database Cache]
FS[File System Cache]
end
CLIENT[Client Request] --> CDN
CDN --> APP
APP --> DB
DB --> FS
FS --> STORAGE[Storage Backend]
Security Architecture
1. Authentication & Authorization
Keycloak Integration
- Single Sign-On: Centralized authentication
- JWT Tokens: Stateless authentication
- Role-Based Access: Fine-grained permissions
graph LR
CLIENT[Client App] --> KC[Keycloak Server]
KC --> JWT[JWT Token]
JWT --> API[CDN API]
API --> AUTHZ[Authorization Check]
AUTHZ --> RESOURCE[Protected Resource]
2. Data Protection
Transport Security
- HTTPS/TLS: All communications encrypted
- Certificate Management: Automated cert renewal
- MongoDB SSL: Database connections secured
Storage Security
- Bucket Policies: Restricted access controls
- Presigned URLs: Time-limited access
- Encrypted Storage: Data at rest encryption
3. Input Validation
Request Sanitization
# Example from validation utilities
class Validation:
def sanitize_filename(self, filename):
# Remove dangerous characters
# Validate file extensions
# Check file size limits
Performance Architecture
1. Image Processing Optimization
Processing Pipeline
- Lazy Loading: Process images on-demand
- Caching: Store processed versions
- Format Optimization: Automatic format selection
- Quality Adjustment: Dynamic quality levels
2. Database Optimization
Query Optimization
- Indexed Queries: Optimized database indexes
- Connection Pooling: Efficient resource usage
- Query Caching: Reduce database load
3. Network Optimization
Content Delivery
- Edge Caching: Global content distribution
- Compression: Automatic image compression
- HTTP/2: Multiplexed connections
Monitoring & Observability
1. Application Monitoring
Health Checks
@app.route('/health')
def health_check():
return {
"status": "healthy",
"services": {
"mysql": check_mysql_connection(),
"mongodb": check_mongodb_connection(),
"spaces": check_spaces_connection()
}
}
2. Performance Metrics
Key Performance Indicators
- Response Time: API endpoint latency
- Throughput: Requests per second
- Error Rate: Failed request percentage
- Cache Hit Ratio: Caching efficiency
3. Logging Strategy
Structured Logging
import logging
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)
# Error tracking with context
logger.error("Image processing failed", extra={
"uuid": image_uuid,
"operation": operation,
"error_type": type(e).__name__
})
Deployment Architecture
1. Environment Configuration
Multi-Environment Support
- Development: Local development setup
- Staging: Pre-production testing
- Production: High-availability deployment
2. Infrastructure as Code
Container Strategy
# Multi-stage Docker build
FROM python:3.11-slim as base
# System dependencies installation
# Application setup and optimization
3. CI/CD Pipeline
Deployment Flow
graph LR
DEV[Development] --> TEST[Testing]
TEST --> BUILD[Build Image]
BUILD --> DEPLOY[Deploy to Staging]
DEPLOY --> VALIDATE[Validation Tests]
VALIDATE --> PROD[Production Deploy]
Configuration Management
1. Environment Variables
Configuration Categories
- Database: Connection strings and credentials
- Storage: DigitalOcean Spaces configuration
- Processing: Uploadcare API keys
- Authentication: Keycloak settings
2. Secrets Management
Security Best Practices
- Environment Separation: Different keys per environment
- Key Rotation: Regular credential updates
- Access Control: Limited secret access
Error Handling & Recovery
1. Fault Tolerance
Resilience Patterns
- Circuit Breakers: Prevent cascade failures
- Retry Logic: Automatic retry with backoff
- Graceful Degradation: Fallback mechanisms
2. Disaster Recovery
Backup Strategy
- Database Backups: Automated daily backups
- Storage Replication: Cross-region redundancy
- Configuration Backups: Infrastructure state preservation
Future Architecture Considerations
1. Scalability Enhancements
Microservices Migration
- Service Decomposition: Separate processing services
- API Gateway: Centralized routing and authentication
- Event-Driven Architecture: Asynchronous processing
2. Performance Improvements
Advanced Caching
- Redis Integration: Distributed caching layer
- Edge Computing: Closer processing to users
- ML-Based Optimization: Intelligent image processing
3. Technology Upgrades
Modern Stack Integration
- Kubernetes: Container orchestration
- Service Mesh: Advanced networking
- Observability Tools: Enhanced monitoring