Wholesale 快速入门
本节指导你在 10 分钟内完成 Wholesale 模块的基本配置并打通第一个通话。
1. 环境要求
| 项目 | 要求 |
|---|---|
| RustPBX 版本 | ≥ 0.4.4,编译时启用 --features commerce,wholesale |
| 数据库 | MySQL 8.0+ 或 PostgreSQL 14+(不支持 SQLite,Wholesale 需要并发写入和事务) |
| 磁盘 | CDR 存储建议预留 100GB+/月(按通话量估算) |
| 内存 | ≥ 4GB(费率表和路由 Trie 加载到内存) |
2. 启用 Wholesale
在 config.toml 的 [proxy] 段启用 addon:
[proxy]
addons = ["wholesale"]
# Wholesale 专用配置
[proxy.wholesale]
# 路由结果缓存
route_cache_capacity = 10000
route_cache_ttl_secs = 30
# 熔断器默认参数
circuit_breaker_failure_threshold = 5
circuit_breaker_open_duration_secs = 30
3. 数据库初始化
Wholesale 启动时自动执行 30+ 个 migration,创建以下核心表:
| 表名 | 用途 |
|---|---|
rustpbx_tenants | 租户(客户) |
wholesale_rate_decks | 费率表(买/卖) |
wholesale_rates | 费率条目 |
wholesale_routing_profiles | 路由策略 |
wholesale_routing_profile_items | 路由规则 |
wholesale_tenant_trunks | 租户中继绑定 |
wholesale_trunk_configs | 中继 Wholesale 配置 |
wholesale_cdrs | 话单 |
wholesale_bills | 账单 |
4. 最小配置流程
Step 1:创建运营商中继
在 Web 控制台 Wholesale → 中继管理 或 config/trunks/ 中添加运营商 SIP 中继:
# config/trunks/carrier_a.toml
[[trunk]]
name = "carrier-a"
dest = "sip:10.0.1.100:5060"
direction = "outbound"
codec = ["pcmu", "pcma", "g729"]
max_calls = 100
在 Wholesale 控制台中为该中继配置:
- 关联买费率表
- 启用/禁用熔断器
Step 2:创建费率表
Wholesale → 费率表管理 → 新建:
- 创建 买费率表(Buy Deck):运营商的成本价
- 创建 卖费率表(Sell Deck):给客户的销售价
添加费率条目(支持 CSV 批量导入):
| 前缀 | 费率(元/分钟) | 最低时长 | 计费步长 |
|---|---|---|---|
86 | 0.05 | 6 | 6 |
8610 | 0.03 | 6 | 6 |
1 | 0.08 | 6 | 6 |
费率匹配使用 最长前缀匹配(Trie),8610 比 86 更精确。
Step 3:创建路由策略
Wholesale → 路由策略 → 新建:
添加路由规则:
- 匹配前缀:
86 - 中继:carrier-a
- 优先级:10
- 权重:100
Step 4:创建租户
Wholesale → 租户管理 → 新建:
- 名称:客户 A
- 初始余额:1000.00
- 关联卖费率表
- 关联路由策略
- 配置中继绑定(入向 IP ACL 或 Token 认证)
Step 5:验证
使用 SIP 软电话或 SIPp 模拟从租户侧发起呼叫,检查:
- 通话是否正常建立
- CDR 是否正确生成(Wholesale → 话单管理)
- 租户余额是否正确扣减
5. 认证方式
Wholesale 支持两种租户入向认证:
| 方式 | 配置 | 适用场景 |
|---|---|---|
| IP ACL | 租户中继绑定的 source_ips | 固定 IP 的网关/软交换 |
| X-Wholesale-Token | HMAC-SHA256 签名的 Token | 动态 IP 或安全要求高 |
Token 格式:token_id|timestamp|tenant_id|caller|callee|signature