Some checks failed
Build and Deploy Backend / build-and-deploy (push) Failing after 4m28s
## 变更内容
### k8s/ingress.yaml
- 新增 /xiaozhi/v1/ 路径规则,将 WebSocket 流量路由到 hw-ws-svc:8888
- Traefik 最长前缀优先,/xiaozhi/v1/ 不影响 / 下的 Django 路由
### hw_service_go/k8s/service.yaml
- Service 类型由 LoadBalancer 改为 ClusterIP
- 移除阿里云 SLB 注解(通过 Traefik Ingress 统一暴露,不再需要独立公网 IP)
### hw_service_go/k8s/deployment.yaml
- 镜像地址改为 ${CI_REGISTRY_IMAGE}/hw-ws-service:latest 占位符
- CI/CD 部署时统一通过 sed 替换为华为云 SWR 实际地址
### hw_service_go/internal/server/server.go
- 新增 GET /xiaozhi/v1/healthz 接口,返回 {"status":"ok","active_connections":N}
- 用于部署后验证服务存活及当前连接数
### .gitea/workflows/deploy.yaml
- 新增 Build and Push HW WebSocket Service 步骤,构建并推送 hw_service_go 镜像
- 部署步骤新增 kubectl apply hw_service_go/k8s/deployment.yaml 和 service.yaml
- 新增 kubectl rollout restart deployment/hw-ws-service
### run.sh
- 本地同时启动 Django + hw_service_go 的开发脚本
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
104 lines
2.9 KiB
Bash
Executable File
104 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# RTC Backend 启动脚本(同时启动 Django + hw_service_go)
|
||
|
||
DJANGO_PORT=${1:-8000}
|
||
WS_PORT=${2:-8888}
|
||
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
VENV_PYTHON="$PROJECT_DIR/venv/bin/python"
|
||
GO_SERVICE_DIR="$PROJECT_DIR/hw_service_go"
|
||
|
||
echo "=== RTC Backend 启动脚本 ==="
|
||
echo "Django 端口: $DJANGO_PORT"
|
||
echo "WebSocket 端口: $WS_PORT"
|
||
echo "项目: $PROJECT_DIR"
|
||
echo ""
|
||
|
||
# ---- 检查 Go 环境 ----
|
||
GO_BIN=$(which go 2>/dev/null)
|
||
if [ -z "$GO_BIN" ]; then
|
||
# Homebrew 安装的 Go 不在默认 PATH,尝试常见位置
|
||
for candidate in \
|
||
/opt/homebrew/bin/go \
|
||
/usr/local/go/bin/go \
|
||
/opt/homebrew/Cellar/go/*/libexec/bin/go; do
|
||
if [ -x "$candidate" ]; then
|
||
GO_BIN="$candidate"
|
||
break
|
||
fi
|
||
done
|
||
fi
|
||
if [ -z "$GO_BIN" ]; then
|
||
echo "[x] 未找到 go 命令,请安装 Go 或检查 PATH"
|
||
exit 1
|
||
fi
|
||
echo "[✓] Go: $GO_BIN"
|
||
|
||
# ---- 检查虚拟环境 ----
|
||
if [ ! -f "$VENV_PYTHON" ]; then
|
||
echo "[x] 未找到虚拟环境: $VENV_PYTHON"
|
||
exit 1
|
||
fi
|
||
echo "[✓] 虚拟环境就绪"
|
||
|
||
# ---- 释放占用端口的函数 ----
|
||
free_port() {
|
||
local port=$1
|
||
local name=$2
|
||
local pid
|
||
pid=$(lsof -ti :"$port" 2>/dev/null)
|
||
if [ -n "$pid" ]; then
|
||
echo "[!] 端口 $port ($name) 被占用,PID: $pid,正在终止..."
|
||
kill -9 "$pid" 2>/dev/null
|
||
sleep 1
|
||
pid=$(lsof -ti :"$port" 2>/dev/null)
|
||
if [ -n "$pid" ]; then
|
||
echo "[x] 端口 $port 释放失败,请手动处理"
|
||
exit 1
|
||
fi
|
||
echo "[✓] 端口 $port 已释放"
|
||
else
|
||
echo "[✓] 端口 $port 空闲"
|
||
fi
|
||
}
|
||
|
||
free_port "$DJANGO_PORT" "Django"
|
||
free_port "$WS_PORT" "hw_service_go"
|
||
|
||
# ---- 退出时清理所有子进程 ----
|
||
cleanup() {
|
||
echo ""
|
||
echo "=== 正在关闭所有服务... ==="
|
||
kill "$DJANGO_PID" "$WS_PID" 2>/dev/null
|
||
wait "$DJANGO_PID" "$WS_PID" 2>/dev/null
|
||
echo "=== 所有服务已停止 ==="
|
||
}
|
||
trap cleanup SIGINT SIGTERM EXIT
|
||
|
||
# ---- 启动 Django ----
|
||
echo ""
|
||
echo "=== 启动 Django 开发服务器 (0.0.0.0:$DJANGO_PORT) ==="
|
||
cd "$PROJECT_DIR"
|
||
$VENV_PYTHON manage.py runserver "0.0.0.0:$DJANGO_PORT" &
|
||
DJANGO_PID=$!
|
||
echo "[✓] Django PID: $DJANGO_PID"
|
||
|
||
# ---- 启动 hw_service_go ----
|
||
echo ""
|
||
echo "=== 启动 hw_service_go WebSocket 服务 (0.0.0.0:$WS_PORT) ==="
|
||
cd "$GO_SERVICE_DIR"
|
||
HW_RTC_BACKEND_URL="http://localhost:$DJANGO_PORT" \
|
||
HW_WS_PORT="$WS_PORT" \
|
||
"$GO_BIN" run ./cmd/main.go &
|
||
WS_PID=$!
|
||
echo "[✓] hw_service_go PID: $WS_PID"
|
||
|
||
echo ""
|
||
echo "=== 所有服务已启动,按 Ctrl+C 停止 ==="
|
||
echo " Django: http://localhost:$DJANGO_PORT"
|
||
echo " WebSocket: ws://localhost:$WS_PORT/xiaozhi/v1/"
|
||
echo " 健康检查: http://localhost:$WS_PORT/healthz"
|
||
echo ""
|
||
|
||
# 等待任意一个进程退出,然后触发 cleanup
|
||
wait -n "$DJANGO_PID" "$WS_PID" 2>/dev/null || wait "$DJANGO_PID" "$WS_PID"
|