# RustPBX

  
**A high-performance, software-defined PBX built in Rust** — the AI-native communication platform for next-gen contact centers.
RustPBX externalizes all call control via **HTTP/WebSocket/Webhook**. Route decisions, media control, and event streams are fully programmable in any language.
> Voice Agent functionality has moved to [Active Call](https://github.com/restsend/active-call). This repo focuses on SIP Proxy & PBX.
---
## Quick Start
Run RustPBX with minimal config in 2 commands:
**Minimal `config.toml`**:
```toml
http_addr = "0.0.0.0:8080"
database_url = "sqlite://rustpbx.sqlite3"
[proxy]
addr = "0.0.0.0"
udp_port = 5060
modules = ["auth", "registrar", "call"]
[[proxy.user_backends]]
type = "memory"
users = [{ username = "1001", password = "password" }]
[console]
base_path = "/console"
allow_registration = false
```
```bash
docker run -d --name rustpbx --net host \
-v $(pwd)/config.toml:/app/config.toml \
ghcr.io/restsend/rustpbx:latest --conf /app/config.toml
# Create admin
docker exec rustpbx /app/rustpbx --conf /app/config.toml \
--super-username admin --super-password changeme
```
| Web Console | `http://localhost:8080/console/` |
| SIP Proxy | `udp://localhost:5060` |
| Register SIP phone as | `1001` / `password` |
> **Commerce image** (includes Wholesale + all plugins): `docker pull docker.cnb.cool/miuda.ai/rustpbx:latest`
---
## Why RustPBX?
| Every INVITE calls your **HTTP webhook**. Return JSON routing decisions. No recompilation needed. | AI agents are **native participants** — listen, speak, barge, transfer via WebSocket. | 800 concurrent calls with RTP proxy: **6ms latency, 0% loss, 280MB memory**. |
---
## Core Capabilities
**SIP & Media** — Full SIP stack (UDP/TCP/WS/TLS/WebRTC), RTP relay, NAT traversal, TLS/SRTP with auto ACME certs. Fast registration via JWT or HTTP token (skip 401/407).
**Routing & Control** — HTTP Router (dynamic routing decisions), RWI WebSocket Interface (real-time call control), Queue/ACD (sequential or parallel agent ringing).
**Recording & Analytics** — SipFlow unified SIP+RTP capture, post-call transcript via local SenseVoice (offline), CDR webhooks.
**Operations** — Built-in Web Console, WebRTC Phone, RBAC, Prometheus metrics + OpenTelemetry.
---
## Programmable Interfaces
RustPBX exposes all call logic through standard protocols — no C modules, no recompilation.
### HTTP Router
Every incoming INVITE calls your webhook. Return JSON to decide routing.
```toml
[proxy.http_router]
url = "https://your-api.com/route"
timeout_ms = 3000
```
```json
// POST to your webhook: { "call_id": "abc-123", "from": "sip:+861390000@trunk", "to": "sip:400800" }
// Your response: { "action": "forward", "targets": ["sip:ai-agent@internal"], "record": true }
```
Actions: `forward` · `reject` · `abort` · `spam`
### RWI (Real-time WebSocket Interface)
JSON-over-WebSocket for in-call control:
| Call Control | `originate`, `answer`, `hangup`, `bridge`, `transfer`, `hold` |
| Media | `play`, `stop`, `stream_start`, `inject_start` (PCM) |
| Recording | `record.start`, `pause`, `resume`, `stop` |
| Queue | `enqueue`, `dequeue`, `assign_agent`, `requeue` |
| Supervisor | `listen`, `whisper`, `barge`, `takeover` |
| Conference | `create`, `add`, `remove`, `mute`, `destroy` |
See [API Integration Guide](docs/api_integration_guide.md) and [RWI Protocol](docs/rwi.md).
---
## Editions
| License | MIT | Commercial |
| SIP Proxy + Media | ✅ | ✅ |
| HTTP Router | ✅ | ✅ |
| Queue / ACD | ✅ | ✅ |
| Recording + SipFlow | ✅ | ✅ |
| Transcript (offline SenseVoice) | ✅ | ✅ |
| Web Console | ✅ | ✅ |
| RWI | ✅ | ✅ |
| **VoIP Wholesale** (VOS3000 alt) | ❌ | ✅ |
| **IVR Visual Editor** | ❌ | ✅ |
| **Voicemail Pro** | ❌ | ✅ |
| **Enterprise Auth** (LDAP/SAML/MFA) | ❌ | ✅ |
| **Endpoint Manager** (auto-provisioning) | ❌ | ✅ |
---
## Benchmark
Tested on 2026-04-03 · RustPBX 0.4.0 · Linux x86_64 · 16 cores / 32 GB · G.711 PCMU
| 500 | signaling only | 100% | 500 | 0% | 4.40ms | 32.4% | 137 MB |
| 500 | + RTP proxy | 100% | 500 | 0% | 3.73ms | 98.4% | 183 MB |
| 500 | + sipflow | 100% | 500 | 0% | 5.96ms | 101% | 198 MB |
| 800 | signaling only | 100% | 800 | 0% | 8.32ms | 47.9% | 192 MB |
| 800 | + RTP proxy | 100% | 800 | 0% | 6.38ms | 155% | 265 MB |
| 800 | + sipflow | 100% | 800 | 0% | 6.08ms | 156% | 280 MB |
Per-channel overhead: ~0.06% CPU / 0.24 MB (signaling); ~0.19% CPU / 0.33 MB (with RTP proxy).
> See [Benchmark Details](tests/bench/bench.md) for methodology and full results.
---
## Use Cases
| **AI Contact Center** | AI agents handle calls 24/7, escalate to humans |
| **Cloud Call Center** | Multi-tenant SaaS, remote agents, WebRTC + SIP |
| **Enterprise UC** | Internal comms, conferencing, CRM integration |
| **VoIP Wholesale** | Multi-carrier routing, flexible billing (Commerce) |
| **Compliance Recording** | PCI/healthcare recording, AI quality inspection |
---
## Architecture

**App Service** (AI Agents, HTTP DialPlan, CRM) → **RustPBX Core** (B2BUA, IVR, Media, Queue, CDR) → **Access** (PSTN, WebRTC, SIP, Mobile)
---
## Build from Source
```bash
# Linux: apt-get install cmake pkg-config libasound2-dev libssl-dev libopus-dev
# macOS: brew install cmake openssl pkg-config
git clone --recurse-submodules https://github.com/restsend/rustpbx
cd rustpbx
cargo build --release
cargo run --bin rustpbx -- --conf config.toml.example
```
> Cross-compile via [cross](https://github.com/cross-rs/cross): `cargo install cross && cross build --release --target aarch64-unknown-linux-gnu`
### Submodules
Commerce addons are managed as git submodules under `src/addons/`:
| `src/addons/cc` | https://cnb.cool/miuda.ai/cc |
| `src/addons/wholesale` | https://cnb.cool/miuda.ai/wholesale |
| `src/addons/endpoint_manager` | https://cnb.cool/miuda.ai/endpoint_manager |
| `src/addons/enterprise_auth` | https://cnb.cool/miuda.ai/enterprise_auth |
| `src/addons/ivr_editor` | https://cnb.cool/miuda.ai/ivr_editor |
| `src/addons/sbc` | https://cnb.cool/miuda.ai/sbc |
| `src/addons/telemetry` | https://cnb.cool/miuda.ai/telemetry |
| `src/addons/voicemail` | https://cnb.cool/miuda.ai/voicemail |
```bash
# Initialize submodules after clone
git submodule update --init --recursive
# Pull latest changes for all submodules
git submodule update --remote
# Pull latest for a specific submodule
git submodule update --remote src/addons/cc
```
---
## Screenshots
|  |  |  |
|  |  |  |
---
## Documentation
| [Configuration Guide](docs/configuration.md) | All config options |
| [Authentication](docs/config/03-auth-users.md) | User backends, JWT & HTTP token fast registration |
| [API Integration Guide](docs/api_integration_guide.md) | HTTP Router, Webhooks, Call Control, Recording |
| [RWI Protocol](docs/rwi.md) | WebSocket Interface |
| [RWI Events Reference](docs/rwi_events_reference.md) | Event types, fields, JSON examples (中文) |
| [RWI Events Reference (EN)](docs/rwi_events_reference_en.md) | Event types, fields, JSON examples (English) |
---
## Troubleshooting
**SIP 401 behind NAT/Docker** — set the realm explicitly:
```toml
[proxy]
realms = ["your-public-ip:5060"]
```
---
## License
Community: MIT · Commercial: [hi@miuda.ai](mailto:hi@miuda.ai)
**https://miuda.ai** — Maintenance & commercial support