# gpbx2
**Repository Path**: wwooncom/gpbx2
## Basic Information
- **Project Name**: gpbx2
- **Description**: gpbx, go, freeswitch
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-08-28
- **Last Updated**: 2026-08-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# GPBX - Go 语言 PBX 电话交换系统 | FreeSWITCH 呼叫中心
[](https://go.dev/)
[](./LICENSE)
[]()
## 项目简介
**GPBX** 是一个用 Go 语言开发的企业级 **PBX(Private Branch Exchange,电话交换机)** 系统,深度集成 **FreeSWITCH** 软交换平台,提供开箱即用的 **呼叫中心(Call Center)** 能力。无论你是需要搭建智能客服热线、自动外呼系统,还是希望为 Telegram Bot 添加打电话功能,GPBX 都能满足你的需求。
系统采用**模块化、事件驱动**的设计,支持**多租户隔离**、**AI 智能机器人**(兼容 OpenAI 协议和 Dify 工作流)、**Telegram Bot 呼叫集成**、**IVR 语音导航**等特性,适用于以下场景:
- 🏢 **企业总机/客服热线**:来电自动分配、IVR 语音导航、坐席接听
- 📞 **自动外呼系统**:批量外呼、AI 对话、通话记录追踪
- 🤖 **AI 语音机器人**:对接 LLM 实现智能语音对话
- 💬 **Telegram Bot 电话**:通过 Telegram 消息发起/接听电话
- 🔧 **FreeSWITCH 管理面板**:分机管理、号码路由、在线监控
> 📌 **关键词**:Go PBX, FreeSWITCH 呼叫中心, Go 电话系统, AI 语音机器人, Telegram Bot 电话, IVR 系统, SIP 分机管理, 开源 PBX
## 核心功能
- **通话管理**:呼出、呼入、转接、桥接、播放、DTMF 采集
- **会话管理**:实时跟踪通话会话全生命周期(创建、振铃、应答、挂断、销毁)
- **任务管理**:支持 originate(外呼)、callin(呼入)等多种任务类型
- **多租户架构**:租户隔离,支持租户号码、分机、坐席独立管理
- **分机管理**:SIP 分机注册、在线状态管理、网络地址(NetworkIP/NetworkPort)配置
- **坐席管理**:呼叫中心坐席管理,支持 WebSocket 实时通信
- **号码路由**:支持 gateway / IMS / local 三种路由类型,动作支持转机器人或转三方
- **AI 集成**:支持 OpenAI 协议(Qwen 等)、Dify 工作流
- **Telegram Bot**:通过 Telegram Bot 发起呼叫、接收通话回调(DTMF/Answer/Hangup)
- **IVR 系统**:支持 Lua 脚本 IVR 和 Dify IVR 两种类型
- **HTTP API**:基于 Gin 的 RESTful API,支持 JWT 认证
- **事件总线**:模块间松耦合通信,支持 Pub/Sub 和 Request/Response 模式
- **双存储引擎**:支持文件存储(kcfg)和 SQLite(GORM)两种存储后端
## 系统架构
```
GPBX
├── 核心层
│ ├── app/ # 应用框架,模块生命周期管理
│ ├── datacenter/ # 会话(Session)和任务(Task)管理
│ ├── event/ # 事件总线(EventBus)
│ ├── pbx/ # PBX 核心操作(Originate/Transfer/Playback/Hangup)
│ └── esl/ # FreeSWITCH ESL 客户端
├── 存储层
│ └── store/ # 存储接口,支持 GORM(SQLite)和 kcfg(文件)
├── 配置层
│ └── kcfg/ # 自定义配置格式解析
├── 功能模块 (modules/server/)
│ ├── callcenter_manager/ # 管理后台 API(租户/分机/坐席/机器人/号码/IVR)
│ ├── callcenter_agent/ # 坐席客户端 API + WebSocket
│ ├── callcenter_api/ # 呼叫业务 API(外呼/转接/播放)
│ ├── telegram_bot/ # Telegram Bot 集成
│ ├── ai/ # AI 引擎(OpenAI/Dify/Lua)
│ ├── ivr/ # IVR 引擎(Lua/Dify)
│ ├── router/ # 呼叫路由(呼入/呼出)
│ └── monitor/ # 系统监控
├── 通知模块 (modules/notify/)
│ └── esl_notify/ # FreeSWITCH 事件 → EventBus 桥接
├── 前端
│ ├── callcenter_manager_web/ # 管理后台前端(Vue)
│ └── callcenter_agent_web/ # 坐席客户端前端(Vue)
└── 脚本
├── scripts/ # FreeSWITCH Lua 脚本(originate/park/transfer)
├── robots/ # 机器人 Lua 脚本
└── ivrs/ # IVR Lua 脚本
```
## 技术栈
- **语言**:Go 1.26.2
- **Web 框架**:Gin 1.12.0
- **WebSocket**:gorilla/websocket
- **电话交换**:FreeSWITCH(ESL 集成)
- **脚本引擎**:yuin/gopher-lua(Lua 5.1)
- **存储**:SQLite(GORM v1.31.1)+ 文件存储(kcfg)
- **认证**:JWT(golang-jwt/jwt/v5)
- **Telegram**:go-telegram/bot v1.21.0
- **AI**:OpenAI 协议 / Dify 工作流
## 快速开始
### 环境要求
- Go 1.26.2 或更高版本
- FreeSWITCH(可选,用于实际通话)
- SQLite(使用 GORM 存储时)
### 配置文件
编辑 `config.kcfg`,主要配置项:
```
# FreeSWITCH 连接地址(与 GPBX 一对一关系)
freeswitch {
addr 127.0.0.1:8021
user default
pass ClueCon
Reconnect_Interval_Second 5
}
# HTTP 服务配置
http {
host 0.0.0.0
manager_port 8080 # 管理后台端口
agent_port 8081 # 坐席 WebSocket 端口
api_port 8082 # 业务 API 端口
enable_ssl false
admin {
username admin
password admin123
}
}
# 存储配置(推荐使用 SQLite)
store {
path sqlite://.db/gpbx.db
}
# Telegram Bot 配置(可选)
telegram_bot {
server_port 8083
token "你的 Bot Token"
enable true
bind_script "telegram_bots/10000.lua"
to_ivrid 10001
tenant_id 20000
number 10000
timeout 10
}
# LLM 配置(AI 机器人)
llm {
type openai
model qwen2.5-7b-instruct
baseurl http://your-llm-host:1234/v1
token your-token
max_history 10
}
```
### 启动系统
```bash
# 安装依赖
go mod tidy
# 启动系统
go run main.go
# 或编译后启动
go build
./gpbx
```
系统将在配置的 HTTP 端口上启动(默认管理后台 8080)。
## API 接口概览
### 认证
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/auth/login` | POST | 用户登录,返回 JWT Token |
| `/api/auth/refresh` | POST | 刷新 Token |
### 租户管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/tenant/list` | GET | 获取租户列表(分页) |
| `/api/tenant/create` | POST | 创建租户 |
| `/api/tenant/update` | PUT | 更新租户 |
| `/api/tenant/delete/:tenantId` | DELETE | 删除租户 |
### 分机管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/extension/list` | GET | 获取分机列表(分页) |
| `/api/extension/create` | POST | 创建分机 |
| `/api/extension/update` | PUT | 更新分机 |
| `/api/extension/delete/:extensionId` | DELETE | 删除分机 |
| `/fs/directory` | GET/POST | FreeSWITCH 分机注册接口 |
### 坐席管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/agent/list` | GET | 获取坐席列表(分页) |
| `/api/agent/create` | POST | 创建坐席 |
| `/api/agent/update` | PUT | 更新坐席 |
| `/api/agent/delete/:agentId` | DELETE | 删除坐席 |
| `/agent` | WebSocket | 坐席实时通信(注册/来电/操作) |
### 机器人管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/robot/list` | GET | 获取机器人列表(分页) |
| `/api/robot/create` | POST | 创建机器人 |
| `/api/robot/update/:id` | PUT | 更新机器人 |
| `/api/robot/delete/:id` | DELETE | 删除机器人 |
### IVR 管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/ivr/list` | GET | 获取 IVR 列表(分页) |
| `/api/ivr/create` | POST | 创建 IVR |
| `/api/ivr/update` | PUT | 更新 IVR |
| `/api/ivr/delete/:id` | DELETE | 删除 IVR |
### Telegram 用户管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/telegram_user/list` | GET | 获取 Telegram 用户列表(分页) |
| `/api/telegram_user/create` | POST | 创建 Telegram 用户 |
| `/api/telegram_user/update` | PUT | 更新 Telegram 用户 |
| `/api/telegram_user/delete/:username` | DELETE | 删除 Telegram 用户 |
### 通话操作
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/originate` | POST | 发起外呼 |
| `/api/transfer` | POST | 转接通话 |
| `/api/playback` | POST | 播放音频 |
| `/api/task/info` | GET | 获取任务信息 |
## 数据模型
| 模型 | 说明 | 关键字段 |
|------|------|----------|
| **User** | 系统用户 | Username, Password, Roles |
| **Tenant** | 租户 | TenantId, TenantName, ExpireTime, DefaultNumber |
| **TenantNumber** | 租户号码 | Number, TenantId, Action, WayType, RobotID |
| **Extension** | SIP 分机 | TenantId, ExtensionId, Password, Status, NetworkIP, NetworkPort |
| **ExtensionRegisterInfo** | 分机注册信息(运行时) | Number, Contact, NetworkIP, NetworkPort, IsValid |
| **Agent** | 坐席 | AgentId, ExtensionId, DisplayNumber |
| **Robot** | 机器人 | RobotID, Target, Arg, Welcome, Prompt, ToVendor |
| **Ivr** | IVR 配置 | IvrID, Type(Lua/Dify), Path, Args |
| **TeleGramUser** | Telegram 用户 | Username, TenantId, BindScript, BindNumbers, IvrId |
## 呼叫流程
### 外呼流程(Originate → Robot)
1. 调用 `POST /api/originate` 发起外呼
2. `pbx.OriginateToRobot()` 通过 ESL 发送 Lua 脚本到 FreeSWITCH
3. FreeSWITCH 发起呼叫(originate)
4. 被叫应答 → FreeSWITCH 发出 `CHANNEL_ANSWER` 事件
5. `esl_notify` 捕获事件,发布 `TOPIC_SESSION_ANSWER` 到 EventBus
6. `router` 模块收到事件,根据号码路由到对应 Robot
7. FreeSWITCH 桥接呼叫到 Robot 会话
8. ASR 结果通过 `robot::asr` 自定义事件回传
### Telegram Bot 呼叫流程
1. 用户通过 Telegram 向 Bot 发送电话号码
2. `BotContext.defaultHandler` 创建/复用 `BotBody`
3. `BotBody.OnCallNumber` 查询用户权限,随机选取在线分机
4. 发起 `OriginateToIvr` 呼叫,将客户来电桥接到 IVR
5. 通话过程中 Telegram Bot 可接收 DTMF/Answer/Hangup 回调
## 部署指南
### 本地开发环境
```bash
# 克隆仓库
git clone https://gitee.com/kolonse_zhjsh/gpbx2.git
cd gpbx2
# 安装 Go 依赖
go mod tidy
# 修改 config.kcfg 中的 FreeSWITCH 连接地址
# 编辑 freeswitch.addr 指向你的 FreeSWITCH ESL 端口
# 启动服务
go run main.go
```
启动后访问 `http://localhost:8080` 进入管理后台,默认账号 `admin` / `admin123`。
### 生产环境部署
```bash
# 编译二进制
go build -o gpbx .
# 直接运行
./gpbx
# 推荐使用 systemd 管理进程(创建 /etc/systemd/system/gpbx.service)
```
**systemd 服务示例**:
```ini
[Unit]
Description=GPBX Call Center Service
After=network.target freeswitch.service
[Service]
Type=simple
User=gpbx
WorkingDirectory=/opt/gpbx
ExecStart=/opt/gpbx/gpbx
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
### Docker 部署(规划中)
> Docker 镜像和 docker-compose 方案正在开发中,欢迎贡献。
## 安全注意事项
- 默认管理员账号:`admin` / `admin123`,**生产环境请务必修改**
- 配置文件中的 JWT Secret 请更换为随机字符串
- 建议使用 HTTPS(配置 `enable_ssl: true` + 证书)
- 使用 `sign_tool` 进行授权管理:
- `gpbx -info` 生成机器指纹
- `sign_tool -sign` 生成授权证书
- `gpbx -reg` 注册授权证书
## 常见问题 (FAQ)
GPBX 和 FreeSWITCH 是什么关系?
GPBX 不替代 FreeSWITCH,而是作为 FreeSWITCH 的上层管理系统。GPBX 通过 ESL(Event Socket Library)协议与 FreeSWITCH 通信,管理分机、路由、IVR 等业务逻辑,FreeSWITCH 负责底层的 SIP 信令和媒体处理。两者是一对一关系。
支持哪些 AI 模型?
目前支持两种方式:1) OpenAI 协议(可对接 Qwen、DeepSeek 等兼容 API);2) Dify 工作流(可视化 AI 应用编排)。机器人通过 ASR(语音识别)将用户语音转文字,发给 AI 模型处理,再将回复通过 TTS 播放给用户。
Telegram Bot 如何打电话?
用户向 Bot 发送电话号码,Bot 通过 FreeSWITCH 发起外呼,将用户和 Bot 管理员桥接。通话过程中 Bot 可接收 DTMF、Answer、Hangup 等事件回调。详见 Telegram Bot 呼叫流程。
如何贡献代码?
欢迎提交 Issue 和 Pull Request。开发前请先阅读 CODEBUDDY.md 了解项目架构和编码规范。
Made with ❤️ by kolonse | ⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!