Merge pull request #56 from abhi1693/docs/architecture-readme
docs: add architecture overview
This commit is contained in:
127
docs/architecture/README.md
Normal file
127
docs/architecture/README.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# Mission Control — Architecture
|
||||
|
||||
Mission Control is the **web UI + HTTP API** for operating OpenClaw. It’s where you manage boards, tasks, agents, approvals, and (optionally) gateway connections.
|
||||
|
||||
> Auth note: **Clerk is required for now** (current product direction). The codebase includes gating so CI/local can run with placeholders, but real deployments should configure Clerk.
|
||||
|
||||
At a high level:
|
||||
- The **frontend** is a Next.js app used by humans.
|
||||
- The **backend** is a FastAPI service that exposes REST endpoints under `/api/v1/*`.
|
||||
- **Postgres** stores core state (boards/tasks/agents/etc.).
|
||||
- **Redis** supports async/background primitives (RQ queue scaffolding exists).
|
||||
|
||||
## Components
|
||||
|
||||
### Diagram (conceptual)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
U[User / Browser] -->|HTTP| FE[Next.js Frontend :3000]
|
||||
FE -->|HTTP /api/v1/*| BE[FastAPI Backend :8000]
|
||||
|
||||
BE -->|SQL| PG[(Postgres :5432)]
|
||||
BE -->|Redis protocol| R[(Redis :6379)]
|
||||
|
||||
BE -->|WebSocket (optional integration)| GW[OpenClaw Gateway]
|
||||
GW --> OC[OpenClaw runtime]
|
||||
```
|
||||
|
||||
### Frontend (Next.js)
|
||||
- Location: `frontend/`
|
||||
- Routes/pages: `frontend/src/app/*` (Next.js App Router)
|
||||
- API utilities: `frontend/src/lib/*` and `frontend/src/api/*`
|
||||
|
||||
**Auth (Clerk, required for now)**
|
||||
- The codebase includes gating so CI/local can run without secrets, but real deployments should configure Clerk.
|
||||
- See `frontend/src/auth/clerkKey.ts`, `frontend/src/auth/clerk.tsx`, and `frontend/src/proxy.ts`.
|
||||
|
||||
### Backend (FastAPI)
|
||||
- Location: `backend/`
|
||||
- App wiring: `backend/app/main.py`
|
||||
- Health: `/health`, `/healthz`, `/readyz`
|
||||
- API prefix: `/api/v1`
|
||||
- Routers: `backend/app/api/*`
|
||||
|
||||
**Config**
|
||||
- Settings: `backend/app/core/config.py`
|
||||
- Env loading: always reads `backend/.env` (and optionally `.env`) so running from repo root still works.
|
||||
|
||||
### Data stores
|
||||
- **Postgres**: persistence for boards/tasks/agents/approvals/etc.
|
||||
- Models: `backend/app/models/*`
|
||||
- Migrations: `backend/alembic/*`
|
||||
- **Redis**: used for background primitives.
|
||||
- RQ helper: `backend/app/workers/queue.py`
|
||||
|
||||
### Gateway integration (optional)
|
||||
Mission Control can call into an OpenClaw Gateway over WebSockets.
|
||||
- Client: `backend/app/integrations/openclaw_gateway.py`
|
||||
- Known methods/events: `backend/app/integrations/openclaw_gateway_protocol.py`
|
||||
- Protocol doc: `docs/openclaw_gateway_ws.md`
|
||||
|
||||
## Request flows
|
||||
|
||||
### UI → API
|
||||
1. Browser loads the Next.js frontend.
|
||||
2. Frontend calls backend endpoints under `/api/v1/*`.
|
||||
3. Backend reads/writes Postgres and may use Redis depending on the operation.
|
||||
|
||||
### Auth (Clerk — required for now)
|
||||
- **Frontend** enables Clerk when a publishable key is present/valid.
|
||||
- **Backend** uses `fastapi-clerk-auth` when `CLERK_JWKS_URL` is configured.
|
||||
- See `backend/app/core/auth.py`.
|
||||
|
||||
### Agent access (X-Agent-Token)
|
||||
Automation/agents can use the “agent” API surface:
|
||||
- Endpoints under `/api/v1/agent/*` (router: `backend/app/api/agent.py`).
|
||||
- Auth via `X-Agent-Token` (see `backend/app/core/agent_auth.py`, referenced from `backend/app/api/deps.py`).
|
||||
|
||||
### Background jobs (RQ / Redis)
|
||||
The codebase includes RQ/Redis dependencies and a queue helper (`backend/app/workers/queue.py`).
|
||||
If/when background jobs are added, the expected shape is:
|
||||
- API enqueues work to Redis.
|
||||
- A separate RQ worker process executes queued jobs.
|
||||
|
||||
## Key directories
|
||||
|
||||
Repo root:
|
||||
- `compose.yml` — local/self-host stack
|
||||
- `.env.example` — compose/local defaults
|
||||
- `templates/` — shared templates
|
||||
|
||||
Backend:
|
||||
- `backend/app/api/` — REST routers
|
||||
- `backend/app/core/` — config/auth/logging/errors
|
||||
- `backend/app/models/` — SQLModel models
|
||||
- `backend/app/services/` — domain logic
|
||||
- `backend/app/integrations/` — gateway client/protocol
|
||||
|
||||
Frontend:
|
||||
- `frontend/src/app/` — Next.js routes
|
||||
- `frontend/src/components/` — UI components
|
||||
- `frontend/src/auth/` — Clerk gating/wrappers
|
||||
- `frontend/src/lib/` — utilities + API base
|
||||
|
||||
## Where to start reading code
|
||||
|
||||
Backend:
|
||||
1. `backend/app/main.py` — app + routers
|
||||
2. `backend/app/core/config.py` — env + defaults
|
||||
3. `backend/app/core/auth.py` — auth behavior
|
||||
4. `backend/app/api/tasks.py` and `backend/app/api/agent.py` — core flows
|
||||
|
||||
Frontend:
|
||||
1. `frontend/src/app/*` — main UI routes
|
||||
2. `frontend/src/lib/api-base.ts` — backend calls
|
||||
3. `frontend/src/auth/*` — Clerk integration (gated for CI/local)
|
||||
|
||||
## Related docs
|
||||
- Self-host (Docker Compose): see repo root README: [Quick start (self-host with Docker Compose)](../../README.md#quick-start-self-host-with-docker-compose)
|
||||
- Production-ish deployment: [`docs/production/README.md`](../production/README.md)
|
||||
- Testing (Cypress/Clerk): [`docs/testing/README.md`](../testing/README.md)
|
||||
- Troubleshooting: [`docs/troubleshooting/README.md`](../troubleshooting/README.md)
|
||||
|
||||
## Notes / gotchas
|
||||
- Mermaid rendering depends on the markdown renderer.
|
||||
- `NEXT_PUBLIC_API_URL` must be reachable from the browser (host), not just from within Docker.
|
||||
- If Compose loads `frontend/.env.example` directly, placeholder Clerk keys can accidentally enable Clerk; prefer user-managed env files.
|
||||
Reference in New Issue
Block a user