docs: add README.md
This commit is contained in:
40
.cursorrules
Normal file
40
.cursorrules
Normal file
@@ -0,0 +1,40 @@
|
||||
# Backbone MQTT Broker - AI Agent Documentation
|
||||
|
||||
## Project Overview
|
||||
Kubernetes-native MQTT broker with JWT authentication and IAM-style access control. Built with TypeScript, Node.js, Fastify, Aedes MQTT broker, Kubernetes client, and Zod validation.
|
||||
|
||||
## Project Structure
|
||||
- `src/access/` - JWT authentication and IAM-style authorization
|
||||
- `src/api/` - HTTP API endpoints (Fastify)
|
||||
- `src/config/` - Environment-based configuration
|
||||
- `src/k8s/` - Kubernetes operator and CRD management
|
||||
- `src/server/` - MQTT broker implementation (Aedes)
|
||||
- `src/topics/` - Topic validation and rules
|
||||
- `src/utils/` - Service container and shared utilities
|
||||
|
||||
## Code Style Rules
|
||||
- Always use `.ts` file extensions in imports
|
||||
- No default exports (use named exports only)
|
||||
- Use `type` keyword for type definitions (not `interface`)
|
||||
- Import order: builtin → external → internal → parent → sibling → index
|
||||
- Add newlines between import groups
|
||||
- Use path alias `#root/*` for absolute imports from `src/`
|
||||
- Private class fields use `#` prefix (e.g., `#services`)
|
||||
|
||||
## TypeScript Configuration
|
||||
- Module system: ESNext with NodeNext resolution
|
||||
- Strict mode enabled
|
||||
- Use `.ts` extensions in imports (allowImportingTsExtensions)
|
||||
|
||||
## Available Commands
|
||||
- `pnpm dev` - Watch mode development
|
||||
- `pnpm build` - TypeScript compilation
|
||||
- `pnpm test` - Run all tests (lint + unit)
|
||||
- `pnpm test:lint` - ESLint check
|
||||
- `pnpm test:unit` - Vitest unit tests
|
||||
|
||||
## Key Patterns
|
||||
- Dependency injection via `Services` container class
|
||||
- Zod schemas for validation
|
||||
- Environment variables via `Config` class
|
||||
- Event-driven architecture for K8s resource watching
|
||||
209
README.md
Normal file
209
README.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# Backbone
|
||||
|
||||
A Kubernetes-native MQTT broker with fine-grained access control and topic validation.
|
||||
|
||||
## Features
|
||||
|
||||
- **MQTT 3.1.1/5.0 Broker** - Full-featured MQTT broker powered by Aedes
|
||||
- **Kubernetes Integration** - Custom Resource Definitions (Client, Topic) for declarative configuration
|
||||
- **JWT-based Authentication** - Pluggable authentication providers with JWT token support
|
||||
- **Statement-based Authorization** - AWS IAM-style policy statements for fine-grained access control
|
||||
- **Multiple Transport Protocols** - WebSocket and TCP support for flexible client connections
|
||||
- **HTTP API** - RESTful API for broker management and monitoring
|
||||
- **Topic Validation** - Configurable rules for topic structure and content validation
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Using Docker Compose
|
||||
|
||||
1. Clone the repository and start the broker:
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd backbone
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
2. The broker will be available on:
|
||||
- **TCP MQTT**: `tcp://localhost:1883`
|
||||
- **WebSocket MQTT**: `ws://localhost:8883/ws`
|
||||
- **HTTP API**: `http://localhost:8883/api`
|
||||
|
||||
|
||||
3. Connect with an MQTT client:
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Connecting requires credentials - documentation is still **TODO**
|
||||
|
||||
```bash
|
||||
# Using mosquitto_pub
|
||||
mosquitto_pub -h localhost -p 1883 -t "test/topic" -m "Hello, Backbone!"
|
||||
|
||||
# Using mqtt.js (Node.js)
|
||||
import mqtt from 'mqtt'
|
||||
const client = mqtt.connect('ws://localhost:8883/ws')
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Backbone can be configured using environment variables:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `ADMIN_TOKEN` | Admin token for API requests | `undefined` |
|
||||
| `TOKEN_SECRET` | JWT signing secret for authentication | `undefined` |
|
||||
| `K8S_ENABLED` | Enable Kubernetes operator mode | `false` |
|
||||
| `HTTP_ENABLED` | Enable HTTP/WebSocket server | `true` |
|
||||
| `HTTP_PORT` | HTTP server port | `8883` |
|
||||
| `TCP_ENABLED` | Enable TCP MQTT server | `true` |
|
||||
| `TCP_PORT` | TCP server port | `1883` |
|
||||
| `OIDC_ENABLED` | OIDC discovery URL | `undefined` |
|
||||
| `OIDC_DISCOVERY` | OIDC discovery URL | `undefined` |
|
||||
| `OIDC_CLIENT_ID` | OIDC client ID | `undefined` |
|
||||
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
||||
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
||||
| `OIDC_GROUP_FIELD` | JWT field for reading groups | `groups` |
|
||||
| `OIDC_ADMIN_GROUP` | JWT group for admins | `undefined` |
|
||||
| `OIDC_WRITER_GROUP` | JWT group with publish access to queue | `undefined` |
|
||||
| `OIDC_READER_GROUP` | JWT group with read-only access to queue | `undefined` |
|
||||
|
||||
### Example Configuration
|
||||
|
||||
```bash
|
||||
# Basic configuration
|
||||
export TOKEN_SECRET="your-secret-key"
|
||||
export HTTP_ENABLED="true"
|
||||
export TCP_ENABLED="true"
|
||||
|
||||
# Kubernetes mode
|
||||
export K8S_ENABLED="true"
|
||||
```
|
||||
|
||||
## Kubernetes Integration
|
||||
|
||||
Backbone provides Kubernetes Custom Resource Definitions for declarative configuration:
|
||||
|
||||
### Client Resource
|
||||
|
||||
Define MQTT client access policies using the `Client` CRD:
|
||||
|
||||
```yaml
|
||||
apiVersion: 'backbone.mortenolsen.pro/v1'
|
||||
kind: Client
|
||||
metadata:
|
||||
name: sensor-client
|
||||
namespace: production
|
||||
spec:
|
||||
statements:
|
||||
- effect: allow
|
||||
resources: ['sensors/**/data']
|
||||
actions: ['mqtt:publish']
|
||||
- effect: allow
|
||||
resources: ['sensors/**/commands']
|
||||
actions: ['mqtt:subscribe']
|
||||
```
|
||||
|
||||
### Topic Resource
|
||||
|
||||
Configure topic validation rules:
|
||||
|
||||
```yaml
|
||||
apiVersion: 'backbone.mortenolsen.pro/v1'
|
||||
kind: Topic
|
||||
metadata:
|
||||
name: sensor-topics
|
||||
namespace: production
|
||||
spec:
|
||||
patterns:
|
||||
- pattern: 'sensors/**/data'
|
||||
maxMessageSize: 1024
|
||||
allowedQoS: [0, 1]
|
||||
```
|
||||
|
||||
The Kubernetes operator automatically watches these resources and applies the access policies and validation rules to the MQTT broker.
|
||||
|
||||
## Authentication & Authorization
|
||||
|
||||
### Authorization Statements
|
||||
|
||||
Access control is defined using statement-based policies similar to AWS IAM:
|
||||
|
||||
```yaml
|
||||
statements:
|
||||
- effect: allow # or "deny"
|
||||
resources: ['*'] # MQTT topic patterns
|
||||
actions: ['*'] # MQTT actions
|
||||
```
|
||||
|
||||
#### MQTT Actions
|
||||
|
||||
- `mqtt:publish` - Permission to publish messages to topics
|
||||
- `mqtt:subscribe` - Permission to subscribe to topics
|
||||
- `mqtt:read` - Permission to receive messages from topics
|
||||
|
||||
#### Resource Patterns
|
||||
|
||||
- `*` - All topics
|
||||
- `sensors/*` - All topics under sensors/
|
||||
- `sensors/+/data` - Topics matching the pattern (single-level wildcard)
|
||||
- `sensors/#` - All topics under sensors/ (multi-level wildcard)
|
||||
|
||||
## API
|
||||
|
||||
### Endpoints
|
||||
|
||||
- **WebSocket MQTT**: `ws://host:8883/ws`
|
||||
- **TCP MQTT**: `tcp://host:1883`
|
||||
- **HTTP API**: `http://host:8883/api/*`
|
||||
|
||||
### HTTP API
|
||||
|
||||
The HTTP API provides management endpoints for:
|
||||
- Client management
|
||||
- Topic configuration
|
||||
- Broker statistics
|
||||
- Health checks
|
||||
|
||||
## Development
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js 23 or higher
|
||||
- pnpm package manager
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Start development server
|
||||
pnpm dev
|
||||
|
||||
# Build for production
|
||||
pnpm build
|
||||
|
||||
# Run tests
|
||||
pnpm test
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── access/ # Authentication and authorization
|
||||
├── api/ # HTTP API endpoints
|
||||
├── config/ # Configuration management
|
||||
├── k8s/ # Kubernetes operator and CRDs
|
||||
├── server/ # MQTT broker implementation
|
||||
├── topics/ # Topic validation rules
|
||||
└── utils/ # Shared utilities and services
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the GNU General Public License v3.0 (GPL-3.0).
|
||||
|
||||
## Author
|
||||
|
||||
Created by [@morten-olsen](https://github.com/morten-olsen)
|
||||
Reference in New Issue
Block a user