feat: Add deployment infrastructure and documentation

Docker:
- Add production-ready Dockerfiles for all microservices
- Optimize for multi-stage builds and minimal image sizes

Kubernetes:
- Add namespace and service manifests
- Include MongoDB and Redis deployment configurations
- Configure API server and charging engine deployments

Documentation:
- Add comprehensive README with platform overview
- Include technology stack and quick start instructions
- Provide prerequisites and setup guidance
This commit is contained in:
nutcas3
2026-04-03 19:56:33 +03:00
parent b69b7ec087
commit 4dda7e25d8
10 changed files with 595 additions and 0 deletions
+213
View File
@@ -0,0 +1,213 @@
# Telecom-as-a-Service (TaaS) Platform
> **Sovereign, Full-Stack Cellular Connectivity Platform**
> Built with Go 1.26, Rust 1.94, TypeScript, eBPF, and 5G Core Network Technologies
## Overview
This is a production-ready Telecom-as-a-Service platform that enables developers to programmatically provision and manage cellular connectivity through a clean API. The platform implements 3GPP standards using modern open-source technologies.
**Technology Stack:**
- **Go 1.26**: Core network integration, BSS API, carrier connector
- **Rust 1.94**: eBPF packet gateway, real-time charging engine
- **TypeScript/Next.js**: Developer dashboard and SDK
- **free5GC**: Open-source 5G core network
- **MongoDB**: Subscriber data and authentication
- **Redis**: Real-time credit control
- **eBPF/Aya**: High-performance packet processing
## Quick Start
### Prerequisites
- **Go 1.26+**: [Download](https://go.dev/dl/)
- **Rust 1.94+**: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`
- **Node.js 22+**: [Download](https://nodejs.org/)
- **pnpm**: `npm install -g pnpm`
- **Docker**: [Install](https://docs.docker.com/get-docker/)
- **MongoDB 7.0+**: [Install](https://www.mongodb.com/docs/manual/installation/)
- **Redis**: `sudo apt-get install redis-server`
### Installation
```bash
# Clone the repository
git clone https://github.com/nutcas3/telecom-platform.git
cd telecom-platform
# Build all components
make all
# Start services (requires separate terminals)
# Terminal 1: API Server
./dist/api-server
# Terminal 2: Carrier Connector
./dist/carrier-connector
# Terminal 3: Charging Engine
./target/release/charging-engine
# Terminal 4: Web Dashboard
cd apps/web-dashboard && pnpm dev
```
## Project Structure
```
telecom-platform/
├── apps/
│ ├── api-server/ # Go: Developer BSS API
│ ├── carrier-connector/ # Go: eSIM ES2+ Provisioning
│ ├── charging-engine/ # Rust: OCS Real-time Credit Control
│ ├── packet-gateway/ # Rust: eBPF UPF Data Plane
│ └── web-dashboard/ # TypeScript: Next.js Frontend
├── libs/
│ ├── shared-ts-sdk/ # TypeScript: Drop-in Widget SDK
│ └── proto/ # Shared Protobufs
├── deployments/
│ ├── kubernetes/ # K8s manifests
│ └── docker/ # Dockerfiles
├── docs/ # Architecture & API docs
├── scripts/ # Automation scripts
├── Makefile # Master build orchestrator
├── Cargo.toml # Rust workspace config
├── go.work # Go workspace config
└── pnpm-workspace.yaml # TypeScript workspace config
```
## Development
### Build Commands
```bash
# Build everything
make all
# Build specific language
make build-go # Go services
make build-rust # Rust components
make build-ui # TypeScript dashboard
# Run tests
make test
# Clean artifacts
make clean
```
### Working with Specific Components
**Go Services:**
```bash
cd apps/api-server
go run main.go
```
**Rust Components:**
```bash
cd apps/charging-engine
cargo run --release
```
**TypeScript Dashboard:**
```bash
cd apps/web-dashboard
pnpm dev
```
## Documentation
- **[Complete TODO List](./todos.md)**: Comprehensive development roadmap
- **[API Documentation](./docs/api-spec.yaml)**: OpenAPI 3.0 specification
- **[Architecture Guide](./docs/architecture.md)**: System design and data flows
- **[Deployment Guide](./docs/deployment.md)**: Kubernetes and Docker setup
## Testing
```bash
# Unit tests
make test
# Go tests
go test ./apps/...
# Rust tests
cargo test --workspace
# TypeScript tests
pnpm -r test
```
## Deployment
### Docker
```bash
make docker-build
docker-compose up -d
```
### Kubernetes
```bash
kubectl apply -f deployments/kubernetes/
```
## Environment Variables
Create `.env` files in each service directory:
**API Server** (`apps/api-server/.env`):
```env
MONGODB_URI=mongodb://localhost:27017/free5gc
REDIS_URI=redis://localhost:6379
API_PORT=8000
JWT_SECRET=your-secret-key
```
**Charging Engine** (`apps/charging-engine/.env`):
```env
REDIS_URI=redis://localhost:6379
SERVER_PORT=8080
```
**Web Dashboard** (`apps/web-dashboard/.env.local`):
```env
NEXT_PUBLIC_API_URL=http://localhost:8000
```
## 📖 Key Resources
- **free5GC**: [https://free5gc.org/](https://free5gc.org/)
- **Aya eBPF**: [https://aya-rs.dev/](https://aya-rs.dev/)
- **GSMA eSIM Specs**: [https://www.gsma.com/esim/](https://www.gsma.com/esim/)
- **Go 1.26 Docs**: [https://go.dev/doc/go1.26](https://go.dev/doc/go1.26)
- **Rust 1.94 Blog**: [https://blog.rust-lang.org/2026/03/05/Rust-1.94.0/](https://blog.rust-lang.org/2026/03/05/Rust-1.94.0/)
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Support
- **Issues**: [GitHub Issues](https://github.com/yourorg/telecom-platform/issues)
- **Discussions**: [GitHub Discussions](https://github.com/yourorg/telecom-platform/discussions)
- **Email**: support@yourcompany.com
## Acknowledgments
- **free5GC Team**: For the open-source 5G core implementation
- **Aya Community**: For the pure-Rust eBPF framework
- **GSMA**: For standardizing eSIM technology
- **Go Team**: For the amazing Go 1.26 release
- **Rust Team**: For continuous language improvements
+22
View File
@@ -0,0 +1,22 @@
FROM golang:1.26-alpine AS builder
WORKDIR /app
COPY apps/api-server/go.mod apps/api-server/go.sum ./
RUN go mod download
COPY apps/api-server/ ./
RUN CGO_ENABLED=0 GOOS=linux go build -o api-server .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/api-server .
EXPOSE 8000
CMD ["./api-server"]
@@ -0,0 +1,20 @@
FROM golang:1.26-alpine AS builder
WORKDIR /app
COPY apps/carrier-connector/go.mod apps/carrier-connector/go.sum ./
RUN go mod download
COPY apps/carrier-connector/ ./
RUN CGO_ENABLED=0 GOOS=linux go build -o carrier-connector .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/carrier-connector .
CMD ["./carrier-connector"]
@@ -0,0 +1,27 @@
FROM rust:1.94-slim AS builder
WORKDIR /app
RUN apt-get update && apt-get install -y \
pkg-config \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
COPY Cargo.toml Cargo.lock ./
COPY apps/charging-engine ./apps/charging-engine
RUN cargo build --release --bin charging-engine
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /app/target/release/charging-engine .
EXPOSE 8080
CMD ["./charging-engine"]
@@ -0,0 +1,30 @@
FROM node:22-alpine AS builder
WORKDIR /app
RUN corepack enable
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY apps/web-dashboard ./apps/web-dashboard
RUN pnpm install --frozen-lockfile
RUN pnpm --filter web-dashboard build
FROM node:22-alpine
WORKDIR /app
RUN corepack enable
COPY --from=builder /app/apps/web-dashboard/.next ./apps/web-dashboard/.next
COPY --from=builder /app/apps/web-dashboard/public ./apps/web-dashboard/public
COPY --from=builder /app/apps/web-dashboard/package.json ./apps/web-dashboard/
COPY --from=builder /app/apps/web-dashboard/next.config.js ./apps/web-dashboard/
COPY --from=builder /app/node_modules ./node_modules
WORKDIR /app/apps/web-dashboard
EXPOSE 3000
CMD ["pnpm", "start"]
+7
View File
@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: taas-platform
labels:
name: taas-platform
environment: production
+93
View File
@@ -0,0 +1,93 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-config
namespace: taas-platform
data:
MONGO_INITDB_DATABASE: "free5gc"
---
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
namespace: taas-platform
type: Opaque
stringData:
MONGO_INITDB_ROOT_USERNAME: "admin"
MONGO_INITDB_ROOT_PASSWORD: "changeme-in-production"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
namespace: taas-platform
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb
namespace: taas-platform
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:7.0
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: MONGO_INITDB_ROOT_USERNAME
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: MONGO_INITDB_ROOT_PASSWORD
- name: MONGO_INITDB_DATABASE
valueFrom:
configMapKeyRef:
name: mongodb-config
key: MONGO_INITDB_DATABASE
volumeMounts:
- name: mongodb-storage
mountPath: /data/db
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1000m"
volumes:
- name: mongodb-storage
persistentVolumeClaim:
claimName: mongodb-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mongodb
namespace: taas-platform
spec:
selector:
app: mongodb
ports:
- port: 27017
targetPort: 27017
type: ClusterIP
+46
View File
@@ -0,0 +1,46 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: taas-platform
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
command:
- redis-server
- --maxmemory
- "2gb"
- --maxmemory-policy
- allkeys-lru
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "2Gi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: taas-platform
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
type: ClusterIP
+77
View File
@@ -0,0 +1,77 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: api-server-config
namespace: taas-platform
data:
API_PORT: "8000"
GIN_MODE: "release"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
namespace: taas-platform
spec:
replicas: 3
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api-server
image: taas-api-server:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
env:
- name: MONGODB_URI
value: "mongodb://admin:changeme-in-production@mongodb:27017/free5gc"
- name: REDIS_URI
value: "redis://redis:6379"
- name: API_PORT
valueFrom:
configMapKeyRef:
name: api-server-config
key: API_PORT
- name: GIN_MODE
valueFrom:
configMapKeyRef:
name: api-server-config
key: GIN_MODE
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: api-server
namespace: taas-platform
spec:
selector:
app: api-server
ports:
- port: 8000
targetPort: 8000
type: LoadBalancer
@@ -0,0 +1,60 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: charging-engine
namespace: taas-platform
spec:
replicas: 2
selector:
matchLabels:
app: charging-engine
template:
metadata:
labels:
app: charging-engine
spec:
containers:
- name: charging-engine
image: taas-charging-engine:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: REDIS_URI
value: "redis://redis:6379"
- name: SERVER_PORT
value: "8080"
- name: RUST_LOG
value: "info"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: charging-engine
namespace: taas-platform
spec:
selector:
app: charging-engine
ports:
- port: 8080
targetPort: 8080
type: ClusterIP