Initial commit — DRB server stack
Includes c2-core (FastAPI/MQTT/Firestore), discord-bot (slash commands), frontend (Next.js admin UI), and mosquitto config.
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# DRB Server
|
||||
|
||||
The server-side stack for the Discord Radio Bot system. Handles command-and-control, Firestore sync, Discord slash commands, and the web frontend.
|
||||
|
||||
## Services
|
||||
|
||||
| Service | Description | Port |
|
||||
|---|---|---|
|
||||
| `mosquitto` | MQTT broker — receives telemetry from edge nodes | 1883 |
|
||||
| `c2-core` | FastAPI C2 API — processes MQTT, writes to Firestore, manages nodes/systems/tokens | 8888 |
|
||||
| `discord-bot` | Discord bot — `/join`, `/leave`, `/status` slash commands | — |
|
||||
| `frontend` | Next.js admin UI — real-time dashboard, node management, call history | 3000 |
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker + Docker Compose
|
||||
- A Firebase project with Firestore enabled (Native mode)
|
||||
- A GCP service account key with Firestore and Firebase Auth permissions
|
||||
- A Discord bot token (for the server bot that handles slash commands)
|
||||
- One or more Discord bot tokens in the token pool (for edge nodes to join voice channels)
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
# 1. Copy env files
|
||||
make setup
|
||||
|
||||
# 2. Fill in secrets
|
||||
# drb-c2-core/.env — MQTT, Firestore database name, GCS bucket
|
||||
# drb-server-discord-bot/.env — Discord bot token, C2 URL
|
||||
# drb-frontend/.env — Firebase config (NEXT_PUBLIC_*), C2 URL
|
||||
|
||||
# 3. Place your GCP service account key
|
||||
cp /path/to/your-key.json drb-c2-core/gcp-key.json
|
||||
|
||||
# 4. Build and start
|
||||
make build
|
||||
make up
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### `drb-c2-core/.env`
|
||||
| Variable | Description |
|
||||
|---|---|
|
||||
| `MQTT_BROKER` | Hostname of the MQTT broker (default: `mosquitto`) |
|
||||
| `FIRESTORE_DATABASE` | Firestore database name (default: `(default)`) |
|
||||
| `GCP_CREDENTIALS_PATH` | Path to the GCP key file inside the container |
|
||||
| `GCS_BUCKET` | GCS bucket name for audio uploads (optional) |
|
||||
|
||||
### `drb-server-discord-bot/.env`
|
||||
| Variable | Description |
|
||||
|---|---|
|
||||
| `DISCORD_TOKEN` | Bot token for the server-side command bot |
|
||||
| `C2_URL` | Internal URL of c2-core (default: `http://c2-core:8000`) |
|
||||
| `DEV_GUILD_ID` | Optional guild ID to sync slash commands instantly during dev |
|
||||
|
||||
### `drb-frontend/.env`
|
||||
| Variable | Description |
|
||||
|---|---|
|
||||
| `NEXT_PUBLIC_FIREBASE_*` | Firebase project config (from Firebase console) |
|
||||
| `NEXT_PUBLIC_FIRESTORE_DATABASE` | Firestore database name (must match c2-core) |
|
||||
| `NEXT_PUBLIC_C2_URL` | C2 API URL reachable from the browser |
|
||||
|
||||
## Admin Setup
|
||||
|
||||
After the stack is running, grant admin access to your Firebase user:
|
||||
|
||||
```bash
|
||||
cd drb-c2-core
|
||||
python scripts/set_admin.py grant your@email.com
|
||||
```
|
||||
|
||||
Then sign out and back in to the frontend.
|
||||
|
||||
## Makefile Targets
|
||||
|
||||
```
|
||||
make setup — copy .env.example files
|
||||
make build — docker compose build
|
||||
make up — docker compose up -d
|
||||
make down — docker compose down
|
||||
make logs — follow all logs
|
||||
make logs-c2 — c2-core logs only
|
||||
make logs-bot — discord-bot logs only
|
||||
make logs-frontend — frontend logs only
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Edge Node (client machine)
|
||||
│
|
||||
├── MQTT checkin/status/metadata ──► mosquitto ──► c2-core ──► Firestore
|
||||
│
|
||||
└── MQTT commands ◄─────────────────────────────── c2-core
|
||||
│
|
||||
└── discord_join ──► edge node joins Discord voice + streams Icecast
|
||||
|
||||
Discord User
|
||||
│
|
||||
└── /join /leave /status ──► discord-bot ──► c2-core ──► MQTT ──► edge node
|
||||
|
||||
Browser (admin)
|
||||
└── frontend ──► Firestore (real-time reads)
|
||||
└── c2-core REST API (writes/commands)
|
||||
```
|
||||
Reference in New Issue
Block a user