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 批量导入):

前缀费率(元/分钟)最低时长计费步长
860.0566
86100.0366
10.0866

费率匹配使用 最长前缀匹配(Trie),8610 比 86 更精确。

Step 3:创建路由策略

Wholesale → 路由策略 → 新建:

添加路由规则:

  • 匹配前缀:86
  • 中继:carrier-a
  • 优先级:10
  • 权重:100

Step 4:创建租户

Wholesale → 租户管理 → 新建:

  • 名称:客户 A
  • 初始余额:1000.00
  • 关联卖费率表
  • 关联路由策略
  • 配置中继绑定(入向 IP ACL 或 Token 认证)

Step 5:验证

使用 SIP 软电话或 SIPp 模拟从租户侧发起呼叫,检查:

  1. 通话是否正常建立
  2. CDR 是否正确生成(Wholesale → 话单管理)
  3. 租户余额是否正确扣减

5. 认证方式

Wholesale 支持两种租户入向认证:

方式配置适用场景
IP ACL租户中继绑定的 source_ips固定 IP 的网关/软交换
X-Wholesale-TokenHMAC-SHA256 签名的 Token动态 IP 或安全要求高

Token 格式:token_id|timestamp|tenant_id|caller|callee|signature

6. 下一步