开发准备与步骤指南
为了让开发过程高效且有序,以下是基于Kamailio的VoIP管理系统的详细开发流程,结合您选择的技术栈(MySQL + Redis + Gin + Vue.js)和容器化部署。
1. 环境准备
(1) 安装基础工具
- Docker & Docker Compose:
# Ubuntu示例 sudo apt-get update sudo apt-get install docker.io docker-compose sudo systemctl start docker sudo systemctl enable docker
- 代码编辑器:推荐VS Code或JetBrains GoLand。
- Git:用于版本控制。
(2) 克隆项目模板(可选)
- 创建项目目录结构:
mkdir voip-system cd voip-system mkdir -p {backend,frontend,kamailio,config}
2. 项目初始化
(1) Kamailio配置
- 创建基础配置文件:
- 在
kamailio/
目录下创建kamailio.cfg
,参考之前的示例配置。 - 核心模块加载:确保启用
mysql
和redis
模块:loadmodule "db_mysql.so" loadmodule "ndb_redis.so"
- 在
- 数据库连接配置:
# MySQL连接参数 modparam("auth_db", "db_url", "mysql://root:your_password@mysql/voip_db")# Redis连接 modparam("ndb_redis", "server", "name=redis;addr=redis:6379")
(2) 数据库设计
- MySQL表结构:
- 在
backend/sql/init.sql
中定义表结构(用户表、CDR表、费率表等)。 - 使用Docker启动MySQL后执行初始化:
docker exec -i mysql mysql -uroot -p your_password voip_db < backend/sql/init.sql
- 在
(3) Gin后端初始化
- Go项目初始化:
cd backend go mod init voip-admin # 安装依赖 go get -u github.com/gin-gonic/gin go get -u gorm.io/gorm gorm.io/driver/mysql go get -u github.com/redis/go-redis/v9
- 项目结构:
backend/ ├── main.go # 入口文件 ├── models/ # 数据模型(User、CDR等) ├── routes/ # API路由 ├── services/ # 业务逻辑(计费、认证) └── Dockerfile # 容器构建文件
(4) Vue.js前端初始化
- 创建Vue项目:
cd frontend npm create vue@latest # 选择需要的配置(Router、Pinia等)
- 安装依赖:
npm install axios vue-router pinia @element-plus/icons-vue
3. 开发阶段
(1) Kamailio核心功能开发
- 实现SIP注册与认证:
- 在
kamailio.cfg
中配置MySQL用户认证:route[AUTH] {if (!is_present_hf("Authorization")) {www_challenge("kamailio", "0");exit;}if (!auth_db_check("$fu", "$avp(password)", "subscriber")) {sl_send_reply("401", "Unauthorized");exit;} }
- 在
- 呼叫路由逻辑:
- 根据被叫号码前缀路由到不同网关:
if ($rU =~ "^0086") { # 中国号码$du = "sip:cn-gateway.example.com"; }
- 根据被叫号码前缀路由到不同网关:
(2) Gin后端开发
- 用户管理API:
// routes/user.go func SetupUserRoutes(r *gin.Engine) {r.POST("/api/register", services.RegisterUser)r.POST("/api/login", services.LoginUser)r.GET("/api/users", middleware.AuthAdmin(), services.ListUsers) }
- CDR查询接口:
// services/cdr.go func GetCDR(c *gin.Context) {var cdrs []models.CDRdb.Where("caller = ?", c.Query("caller")).Find(&cdrs)c.JSON(200, cdrs) }
(3) Vue.js前端开发
- 用户登录页面:
<!-- frontend/src/views/LoginView.vue --> <template><form @submit.prevent="login"><input v-model="username" placeholder="用户名"><input v-model="password" type="password"><button>登录</button></form> </template> <script setup> import { ref } from 'vue' import { useUserStore } from '@/stores/user'const userStore = useUserStore() const username = ref('') const password = ref('')const login = async () => {await userStore.login(username.value, password.value) } </script>
(4) 容器化整合
- 编写Dockerfile:
- Gin后端:
FROM golang:1.20-alpine WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o voip-admin CMD ["./voip-admin"]
- Vue前端:
FROM node:18 as build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run buildFROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf
- Gin后端:
4. 联调与测试
(1) 启动所有服务
docker-compose up -d --build
- 检查容器状态:
docker-compose ps
(2) 测试SIP注册
- 使用SIP客户端(如Zoiper)注册到Kamailio:
- 服务器地址:
Docker宿主机的IP
- 用户名/密码:MySQL中预先插入的测试用户。
- 服务器地址:
(3) 验证API接口
# 测试用户登录
curl -X POST http://localhost:8080/api/login -d '{"username":"test", "password":"123456"}'
(4) 前端功能验证
- 访问
http://localhost
,测试用户登录、CDR查询等功能。
5. 开发注意事项
- Kamailio调试:
- 启用调试日志:
debug=3 # 日志级别(0-3)
- 查看日志:
docker-compose logs -f kamailio
- 启用调试日志:
- 数据库连接问题:
- 确保MySQL容器名称与Kamailio配置中的
db_url
一致(如mysql:3306
)。
- 确保MySQL容器名称与Kamailio配置中的
- 缓存一致性:
- 在Gin中更新用户数据时,同步清理Redis缓存:
redisClient.Del(ctx, "user:" + userID)
- 在Gin中更新用户数据时,同步清理Redis缓存:
6. 后续迭代计划
- 第一阶段(MVP):
- 完成用户注册、呼叫路由、CDR记录。
- 第二阶段:
- 实现计费模块、实时监控。
- 第三阶段:
- 开发管理界面、安全加固(防火墙规则)。
总结
通过以上步骤,可以从零开始搭建一个基于Kamailio的VoIP管理系统。关键点包括:
- 分阶段开发:优先实现核心功能(SIP通信、用户管理),再逐步扩展。
- 容器化协作:利用Docker快速部署和联调各服务。
- 持续测试:结合SIP工具(如SIPP)、Postman和前端自动化测试,确保系统稳定。