Application Stack
| Component |
Technology |
Deployment |
| Backend API |
Python · FastAPI |
Docker container on app-1 via Dokploy |
| Frontend |
React |
Static build served by Nginx / Caddy on Hetzner edge |
| Desktop client |
Electron (wraps React + FastAPI) |
Distributed as macOS / Windows installer. Runs backend locally. |
| Job queue |
Redis |
Docker on app-1 |
| Real-time events |
SocketIO |
Embedded in FastAPI process |
| Worker runtime |
Python · Docker |
One container per worker VM, pulls from Redis |
| Deployment tool |
Dokploy |
Runs on app-1. Manages Docker Compose stacks with GitHub webhook deploys. |
| Orchestration (future) |
k3s |
Planned. Enables rolling deploys and horizontal worker scaling. |
Docker Compose — backend services
version: "3.9"
services:
api:
image: ghcr.io/your-org/cea-api:latest
ports: ["8000:8000"]
environment:
- REDIS_URL=redis://redis:6379
- S3_ENDPOINT=https://<region>.your-objectstorage.com
- S3_BUCKET=cea-data
- S3_ACCESS_KEY=<key>
- S3_SECRET_KEY=<secret>
- DATABASE_URL=postgresql://cea:<pw>@postgres:5432/cea
depends_on: [redis, postgres]
redis:
image: redis:7-alpine
volumes: [redis-data:/data]
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: cea
POSTGRES_PASSWORD: <pw>
volumes: [pg-data:/var/lib/postgresql/data]
volumes:
redis-data:
pg-data:
Worker Docker Compose
services:
worker:
image: ghcr.io/your-org/cea-worker:latest
environment:
- REDIS_URL=redis://10.42.20.11:6379
- S3_ENDPOINT=https://<region>.your-objectstorage.com
- S3_BUCKET=cea-data
- S3_ACCESS_KEY=<key>
- S3_SECRET_KEY=<secret>
- WORKER_CONCURRENCY=4 # simulation processes in parallel
restart: unless-stopped