initial commit
Some checks failed
CI / Go — node-agent tests (push) Has been cancelled
CI / Go — edge-gateway build (push) Has been cancelled
CI / Node — lint, typecheck, test, build (push) Has been cancelled

This commit is contained in:
smueller
2026-06-26 10:45:08 +02:00
commit e37ea87b35
118 changed files with 7726 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
# Architecture overview
HexaHost GameCloud is a self-hosted, multi-tenant platform for on-demand Minecraft servers.
## High-level diagram
```mermaid
flowchart TB
subgraph users [Users]
Browser[Web Browser]
MC[Minecraft Client]
end
subgraph control [Control Plane]
Web[Next.js Web]
API[NestJS API]
Worker[BullMQ Worker]
PG[(PostgreSQL)]
Redis[(Redis)]
S3[(S3 / MinIO)]
end
subgraph nodes [Game Nodes]
Agent[Go Node Agent]
Docker[Docker Engine]
Server[Minecraft Containers]
end
subgraph future [Phase 8+]
Edge[Edge Gateway]
end
Browser --> Web
Web --> API
API --> PG
API --> Redis
Worker --> Redis
Worker --> PG
Worker --> S3
API <-->|mTLS WebSocket| Agent
Agent --> Docker
Docker --> Server
MC --> Server
MC -.-> Edge
Edge -.-> API
```
## Component responsibilities
### Control plane
Runs on one or more VMs (Ubuntu 24.04 / Debian 13). Handles authentication, server metadata, scheduling decisions, billing projection, and job orchestration. **Never** mounts the Docker socket.
### Game nodes
Dedicated Linux VMs with Docker Engine (cgroup v2). Each node runs the **node-agent** as a systemd service. The agent connects **outbound** to the API via mTLS WebSocket and executes signed lifecycle commands locally.
### Data flow
1. User creates a server via the web UI.
2. API persists state in PostgreSQL and enqueues provisioning jobs.
3. Worker selects a node, reserves resources, and sends `server.provision` to the agent.
4. Agent creates an isolated container and reports `server.state` transitions.
5. Backups stream to S3; metadata stays in PostgreSQL.
### Security boundaries
| Boundary | Mechanism |
|----------|-----------|
| User → API | HTTPS, session cookies, CSRF, rate limits |
| API → Agent | mTLS, node token, signed JSON messages |
| Agent → Docker | Local Unix socket only, no remote exposure |
| Game container → Internet | Egress rules, no internal network access by default |
## Repository layout
See [ADR 0001](../adr/0001-monorepo-architecture.md) for the full monorepo structure.
## Protocol
Agent communication uses versioned JSON envelopes over WebSocket. Message types include `agent.hello`, `agent.heartbeat`, `server.start`, and `server.state`. See `apps/node-agent/internal/protocol/messages.go`.
## Deployment models
| Environment | Mechanism |
|-------------|-----------|
| Local development | `deploy/compose/compose.dev.yml` |
| Production control plane | Docker Compose + Traefik |
| Game nodes | Ansible + systemd node-agent |
## Phase roadmap
| Phase | Focus |
|-------|-------|
| 0 | Repository, infra, CI, docs |
| 1 | Authentication |
| 2 | Single-node vertical slice |
| 37 | Panel features, multi-node, idle shutdown |
| 8 | DNS, edge gateway, join-to-start |
| 9 | Billing, production hardening |