2f0597c81b
Includes c2-core (FastAPI/MQTT/Firestore), discord-bot (slash commands), frontend (Next.js admin UI), and mosquitto config.
108 lines
3.5 KiB
Markdown
108 lines
3.5 KiB
Markdown
# 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)
|
|
```
|