- Add Enhanced Error Handling section with error codes (VALIDATION_FAILED, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, ALREADY_EXISTS, INTERNAL_ERROR, RATE_LIMITED), standardized JSON response format, and field-specific validation error structure - Add Testing Strategy section with integration test coverage for API endpoints/authentication/RBAC/services, test structure example with setupTest
14 KiB
Architecture
Comprehensive overview of the TaaS Platform system design, components, data flow, security, and RBAC.
Table of Contents
System Overview
The TaaS Platform is a multi-layer telecom infrastructure that provides cellular connectivity as a service, implementing 3GPP standards while exposing a modern, developer-friendly API.
Architecture Layers
┌─────────────────────────────────────────────────────────────┐
│ Developer Interface │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Web UI │ │ TypeScript │ │ REST API │ │
│ │ Dashboard │ │ SDK │ │ Webhooks │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Business Support System (BSS) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ API Server │ │ Carrier │ │ Subscriber │ │
│ │ (Go 1.26) │ │ Connector │ │ Management │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Operations Support System (OSS) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Charging │ │ Usage │ │ eSIM │ │
│ │ Engine │ │ Tracking │ │ Provisioning│ │
│ │ (Rust) │ │ (Redis) │ │ (ES2+) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ Telecom Core Network │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 5G Core │ │ Packet │ │ Data Plane │ │
│ │ (free5GC) │ │ Gateway │ │ (eBPF) │ │
│ │ (Go) │ │ (Rust) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
Component Details
1. API Server (Go 1.26)
Purpose: Developer-facing RESTful API and business logic.
Stack:
- Gin framework
- GORM with PostgreSQL (primary) / MongoDB (free5GC subscriber data)
- Redis (session/cache)
- Casbin for RBAC
- WebSocket for real-time updates
Responsibilities:
- eSIM lifecycle management
- Authentication (JWT) and authorization (Casbin)
- Rate limiting, quotas, and performance monitoring
- Webhook delivery
- Health checks and alerting
Key Endpoints:
/v1/auth/*— authentication/v1/esims/*— eSIM management/v1/services/*— service operations/v1/monitoring/*— metrics & alerts/v1/billing/*— invoicing/ws— WebSocket stream/health,/ready,/live— probes
2. Carrier Connector (Go 1.26)
Purpose: Integration with GSMA SM-DP+ servers for eSIM provisioning.
Flow:
- Receive eSIM order from API Server
- Call SM-DP+ vendor API with IMSI, K, OPc keys (ES2+ over HTTPS)
- Receive activation code (LPA:1$...)
- Return to API Server
Supports multiple vendors: Thales, G+D, Idemia.
3. Charging Engine (Rust 1.94)
Purpose: Real-time credit control and billing.
Stack:
- Axum (async web framework)
- Redis for in-memory credit balances
- Atomic INCR/DECR operations
Endpoints:
POST /v1/credit/:ip/check— authorizationPOST /v1/credit/:ip/deduct— usage deductionPOST /v1/credit/:ip/add— top-upGET /v1/credit/:ip/balance— balance query
Performance: Sub-millisecond p99, horizontally scalable via Redis Cluster.
4. Packet Gateway (Rust 1.94 + eBPF)
Purpose: High-performance packet processing at line rate.
Stack:
- Aya (pure Rust eBPF)
- XDP (eXpress Data Path) hook
- GTP-U decapsulation (UDP 2152)
Architecture:
NIC → XDP Hook (kernel eBPF) → eBPF Maps → Userspace Daemon → Redis
Packet flow:
- Packet arrives at NIC
- XDP inspects Ethernet → IP → UDP → GTP-U headers
- Extract inner IP (user data), look up credit in eBPF map
- If credit > 0:
XDP_PASS; else:XDP_DROP - Userspace daemon syncs byte counters to Redis every 1s
5. 5G Core Network (free5GC v4.2.1)
3GPP-compliant 5G standalone core with all network functions (AMF, SMF, UPF, PCF, UDM, UDR, AUSF, NRF).
Integration:
- API Server writes subscriber data to MongoDB
- UPF forwards GTP-U to Packet Gateway
- AMF authenticates using stored K/OPc keys
6. Web Dashboard (Next.js 15)
- App Router, TypeScript, Tailwind CSS
- TanStack Query for data fetching
- Real-time updates via WebSocket
- Error boundaries and loading states
Pages: eSIM management, services, monitoring, billing, config, chaos engineering, plugins, automation.
Data Flow
eSIM Creation
1. Developer → API Server: POST /v1/esims { data_plan: "1GB" }
2. API Server → IMSI Allocator: generate 15-digit IMSI
3. API Server → Key Generator: K + OPc
4. API Server → MongoDB: insert subscriptionData
5. API Server → Carrier Connector: order via ES2+
6. Carrier Connector → SM-DP+: HTTPS POST (IMSI, K, OPc)
7. SM-DP+ → Carrier Connector: activation code (LPA:1$...)
8. API Server → Developer: eSIM + activation code
9. End User scans QR → SM-DP+: profile download
10. Device → free5GC AMF: 5G AKA registration
11. free5GC → Packet Gateway: GTP-U tunnel established
Real-Time Usage
1. User device sends data
2. free5GC UPF encapsulates in GTP-U
3. Packet Gateway (eBPF XDP):
- Decapsulate, extract user IP
- Check credit in eBPF map
4. If credit > 0: XDP_PASS + increment byte counter
5. Userspace daemon: read eBPF maps → Redis (1s interval)
6. Charging Engine: deduct from credit balance
7. Packet Gateway: reload credit status from Redis → eBPF map
8. If credit = 0: XDP_DROP (user traffic stops)
Scaling
Horizontal (Stateless)
- API Server: 3+ replicas behind load balancer
- Carrier Connector: 2+ replicas
- Charging Engine: 2+ replicas
- Web Dashboard: CDN + multiple origins
Stateful
- MongoDB: replica set (1 primary, 2 secondaries)
- PostgreSQL: primary + streaming replicas
- Redis: Cluster or Sentinel
- Packet Gateway: one per physical server (eBPF kernel binding)
- free5GC: K8s deployment with dedicated UPF nodes
Performance Targets
| Component | Throughput | Latency (p99) |
|---|---|---|
| API Server | 10,000 req/s | <100ms |
| Charging Engine | 50,000 checks/s | <1ms |
| Packet Gateway | 10+ Gbps/server | <1µs (kernel) |
| free5GC UPF | 5 Gbps/instance | — |
| eSIM provisioning | — | <2s end-to-end |
Security & RBAC
Authentication
- JWT tokens for web dashboard and API
- API keys with HMAC signatures for programmatic access
- OAuth 2.0 for third-party integrations
- Refresh tokens for long-lived sessions
JWT middleware (@/Users/nutcase/Downloads/telecom-platform-starter/apps/api-server/internal/middleware/auth.go) validates tokens on all protected routes.
RBAC with Casbin
Sophisticated policy-based access control using Casbin with a GORM adapter for persistent policies.
Request flow:
Request → AuthMiddleware (JWT) → CasbinRBAC (policy check) → Handler
Model (in @/Users/nutcase/Downloads/telecom-platform-starter/apps/api-server/internal/rbac/casbin.go):
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
Default policies:
| Role | Permissions |
|---|---|
admin |
All resources, all actions |
operator |
Services, monitoring, deployments (GET/POST) |
viewer |
Read-only on all resources |
Usage in routes:
users := protected.Group("/users")
if casbinSvc != nil {
users.Use(middleware.RequireCasbinPermission(casbinSvc, "/v1/users", "GET"))
} else {
users.Use(middleware.RequireRole("admin")) // fallback
}
Policy management:
casbinSvc.AddPolicy("operator", "/v1/services/*", "GET")
casbinSvc.AddRoleForUser("user123", "operator")
allowed, err := casbinSvc.CheckPermission(userID, "/v1/services", "GET")
Data Encryption
- TLS 1.3 for all API endpoints
- MongoDB/PostgreSQL encryption at rest
- Redis TLS connections
- Secrets via Kubernetes Secrets or HashiCorp Vault
- No hardcoded credentials
Security Headers
Applied globally via middleware:
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
Plus request size limit (10MB), request timeout (30s), and CORS configuration.
Enhanced Error Handling
Comprehensive error handling system with standardized error responses:
Error Codes:
VALIDATION_FAILED- Input validation errors with field-specific detailsUNAUTHORIZED- Authentication failuresFORBIDDEN- Authorization/permission errorsNOT_FOUND- Resource not foundALREADY_EXISTS- Duplicate resource attemptsINTERNAL_ERROR- Server-side errorsRATE_LIMITED- Rate limiting violations
Error Response Format:
{
"error": "Human-readable error message",
"code": "ERROR_CODE",
"details": "Detailed error context",
"timestamp": "2024-01-01T00:00:00Z"
}
Validation Errors:
{
"error": "Validation failed",
"code": "VALIDATION_FAILED",
"errors": [
{
"field": "email",
"message": "must be a valid email address",
"value": "invalid-email"
}
]
}
Testing Strategy
Integration Tests:
- Full API endpoint testing with in-memory SQLite
- Authentication and RBAC testing with mock users
- Service layer testing for all major services
- Error handling validation across all endpoints
Test Coverage:
- Authentication flows (login, token validation, refresh)
- RBAC permissions (admin, operator, viewer roles)
- Service operations (CRUD, validation, error handling)
- Error scenarios (invalid input, missing resources, permissions)
Test Structure:
func TestAuthenticationEndpoints(t *testing.T) {
ts := setupTest(t)
defer ts.DB.Close()
t.Run("Login with valid credentials", func(t *testing.T) {
// Test implementation
})
}
Monitoring & Observability
Metrics Collection:
- Request latency and throughput
- Error rates by endpoint and error type
- Authentication success/failure rates
- Database query performance
- JWT token validation metrics
Health Checks:
/health- Basic health status/ready- Readiness probe (dependencies check)/live- Liveness probe (service health)
Logging:
- Structured JSON logging
- Request correlation IDs
- Error stack traces in debug mode
- Security event logging
Rate Limiting
Tiered limits protect against abuse (see @/Users/nutcase/Downloads/telecom-platform-starter/apps/api-server/internal/middleware/ratelimit.go):
| Tier | Limit/min | Burst |
|---|---|---|
| Auth | 10 | 5 |
| Read | 200 | 50 |
| Admin | 50 | 10 |
| Default | 100 | 20 |
Future Enhancements
- Multi-region deployment — AWS multi-region with Route 53 global LB and data residency compliance.
- Advanced analytics — predictive usage forecasting, anomaly detection.
- Additional carriers — multi-vendor SM-DP+ with fallback.
- IoT optimization — SGP.32 (IoT eSIM), NB-IoT/LTE-M, power-saving features.
- Developer tools — expanded CLI, Terraform provider, GitHub Actions integration.
Related Docs
GETTING_STARTED.md— Setup, API reference, SDKsOPERATIONS.md— Deployment, monitoring, performance tuning