基础配置
本章节帮助你从零搭建一套可用的 RustPBX 实例,包括环境要求、安装、初始化配置与基础验证。所有步骤均以中文说明,方便交付与培训。
1. 前置条件
- 运行环境:推荐 4C/8G 以上的 x86_64 Linux(Debian/Ubuntu/CentOS 均可)。
- 依赖:Docker 或 Podman(容器部署),或已安装 Rust toolchain(裸机编译),以及 SQLite/PostgreSQL(按照
Cargo.toml中的 feature 选择)。 - 网络:服务器需要固定公网 IP,开放 SIP/HTTPS/诊断端口,并将运营商或 SBC 的 IP 加入安全组。
- 证书:若启用 WebRTC/HTTPS,需要准备 TLS 证书,可由 addons
acme自动签发。
2. 安装方式
2.1 商用镜像部署(推荐)
- 准备
config.toml与config/目录(详见下一节)。 - 拉取官方镜像:
docker pull ghcr.io/restsend/rustpbx:latest- 或从商用仓库拉取:
docker pull docker.cnb.cool/miuda.ai/rustpbx:latest
- 启动示例:
docker run -d --name rustpbx \
-v $(pwd)/config.toml:/app/config.toml \
-v $(pwd)/config:/app/config \
-v $(pwd)/rustpbx.sqlite3:/app/rustpbx.sqlite3 \
-p 8080:8080 -p 5060:5060/udp -p 12000-42000:12000-42000/udp \
ghcr.io/restsend/rustpbx:latest
- 在 Compose/Kubernetes 中同样引用该镜像,并将配置与数据库挂载为持久卷;日志默认写到 stdout/stderr,便于集中收集。
2.2 裸机部署
- 安装 Rust(
rustup default stable)。 - 在项目根执行
cargo build --release,可得到target/release/rustpbx。 - 将二进制放入
/usr/local/bin,配合systemd/supervisor启动。
2.3 命令行选项
| 参数 | 说明 |
|---|---|
--conf <PATH> | 配置文件路径(TOML 格式) |
--super-username <NAME> | 创建或更新控制台超级用户(需配合 --super-password) |
--super-password <PASS> | 超级用户密码 |
--super-email <EMAIL> | 超级用户邮箱(默认为 username@localhost) |
--skip-migrate | 跳过数据库迁移(适用于只读副本) |
--tokio-console <ADDR> | 启动 tokio-console 服务器进行异步任务调试 |
子命令
| 命令 | 说明 |
|---|---|
check-config | 验证配置文件并退出,不启动服务器 |
# 部署前验证配置
rustpbx --conf config.toml check-config
# 创建管理员用户后退出
rustpbx --conf config.toml --super-username admin --super-password changeme
# 跳过数据库迁移(如只读副本)
rustpbx --conf config.toml --skip-migrate
3. 初始化配置
RustPBX 的运行参数主要来自 config.toml 与 config/ 子目录:
config.toml:全局服务段([proxy]、[ua]、[console]、[recording]、[callrecord]、[sipflow]、[rwi]、[rwi_webhook]、[cluster]、[storage]等)以及插件启停;建议先填写监听地址(http_addr、proxy.addr)、鉴权方式(proxy.user_backends、console.allow_registration)与日志级别(log_level、log_file、log_rotation)。- Trunk 文件:在
config/trunks/下按模板新增*.toml,包含uri、auth、codec等字段。 - Routing 文件:在
config/routes/中定义入站/出站匹配规则,并指向分机、队列或 Trunk。 - Queue/ACL:如需排队和安全策略,分别在
config/queue/、config/acl/中准备对应文件。 - 数据库迁移:启动时自动初始化
models/中定义的表结构。使用--skip-migrate可跳过此步骤。
3.1 端口范围
# RTP 媒体代理端口范围(默认:12000–42000)
rtp_start_port = 12000
rtp_end_port = 42000
# WebRTC 媒体端口范围(默认:30000–40000)
webrtc_start_port = 30000
webrtc_end_port = 40000
请在防火墙上放通这些端口范围,媒体代理会在范围内自动选择可用端口。
3.2 日志与轮转
log_level = "info"
log_file = "/var/log/rustpbx/app.log"
log_rotation = "daily" # "never"(默认)、"hourly" 或 "daily"
启用日志轮转后,日志文件会在每个轮转周期结束时归档为带时间戳的文件。
3.3 SIP JWT 认证
RustPBX 支持通过 JWT 令牌实现快速的 SIP 注册——分机无需提供 SIP 密码,通过在 SIP 头中携带签名 JWT 即可完成注册:
[proxy.jwt_auth]
enabled = true
secret = "your-jwt-secret-key"
user_id_claim = "userId" # 包含分机号的 JWT claim
issuer = "auth.example.com" # 可选:要求特定签发者
audience = "rustpbx" # 可选:要求特定接收方
sip_header_name = "X-Auth-Token" # 携带 JWT 的 SIP 头名称
check_local_user = false # 是否同时校验本地数据库
ws_token_param = "token" # WebSocket 的 URL 查询参数名
dev_mint_enabled = false # 开发环境令牌签发端点(生产环境请关闭)
启用后,携带 X-Auth-Token: <jwt> 的 INVITE/REGISTER 请求将直接通过 JWT claims 完成认证,不会发送 Digest 质询。
3.4 紧急号码路由
[proxy.emergency]
enabled = true
numbers = ["110", "119", "120", "122", "911", "999"]
emergency_trunk = "emergency-carrier"
拨打列表中的紧急号码时,呼叫将直接路由到指定的 emergency_trunk,跳过常规路由规则。
3.5 对象存储(录音、CDR、SipFlow)
[storage]
type = "s3" # "local"(默认)、"s3"、"azure"、"gcp"
[storage.s3]
vendor = "minio" # "aws"、"minio"、"aliyun"、"cos"
bucket = "rustpbx-recordings"
region = "us-east-1"
access_key = "AKIA..."
secret_key = "..."
endpoint = "https://s3.example.com"
root = "recordings/"
[storage] 段配置录音上传、CDR 归档和 SipFlow 卸载所需的对象存储,配置一次即可被 [recording]、[callrecord] 和 [sipflow] 共享。
0.5 版本的两点增强:
- 匿名 S3:公有桶或内网共享桶可省略
access_key/secret_key。 - Presigned 下载:使用 S3 兼容存储时,录音与 SipFlow 下载改为通过 presigned GET URL 提供(有效期有上限),不再经由控制台代理转发。
3.6 队列与语音信箱的全局默认音频
[proxy]
queue_hold_music = "sounds/hold-music.wav" # 队列默认等待音
voicemail_greeting = "sounds/greeting.wav" # 语音信箱默认问候音
两者均可选:队列自身的 [proxy.queues.<name>.hold].audio_file 或应用层传入的 greeting_path 仍然优先生效。有了全局默认,就不必在每个队列上重复配置同一段提示音。
rustpbx/
├── 📁 config/
│ ├── 📁 trunks/ → SIP Trunk 配置
│ ├── 📁 routes/ → 入站/出站路由规则
│ ├── 📁 queue/ → 队列定义
│ ├── 📁 ivr/ → IVR 流程定义
│ ├── 📁 acl/ → 访问控制/IP 策略
│ ├── 📁 recorders/ → 录音配置
│ ├── 📁 sounds/ → 音频提示和音效
│ ├── 📁 cdr/ → 通话详单
│ ├── 📁 voicemail/ → 语音信箱配置
│ ├── 📁 models/ → 语音模型(VAD、ASR、降噪)
│ ├── 📁 cc/ → 呼叫中心技能组配置
│ └── 📁 sipflow/ → SipFlow 捕获存储
└── 📄 config.toml → 主配置文件
4. 启动与首个登录
- 启动服务:
- 容器模式:
docker run ...如上所示。 - 裸机模式:
/static/docs-zh/rustpbx/rustpbx --conf config.toml - 首次创建管理员:
/static/docs-zh/rustpbx/rustpbx --conf config.toml --super-username admin --super-password changeme
- 容器模式:
- 访问控制台(默认
http://<host>:8082/console/)。 - 使用管理员账号登录,建议立即修改密码。
- 检查控制台状态页面确保所有组件显示正常。
5. 快速验证清单
- 创建测试 Trunk:录入运营商或软交换的测试线路。
- 添加路由:为测试号段配置 inbound/outbound 路由,动作指向一个临时分机。
- 注册软终端:在「分机管理」中创建分机,并在软电话/SIP 设备上完成注册。
- 发起测试呼叫:验证主叫与被叫均能建立通话,录音与 CDR 正常生成。
- 执行 Reload:通过控制台 Settings → Reload,使配置立即生效,并在 Diagnostics → Routing 运行一次 Evaluate,确认命中的规则与输出的 Trunk。
完成以上步骤后,系统即可承载初始业务流量。更深入的线路策略、计费和诊断方法请参见后续章节。