rtc_backend/run.sh
repair-agent c219ec2fcf
Some checks failed
Build and Deploy Backend / build-and-deploy (push) Failing after 4m28s
feat(hw-ws-service): 将 Go WebSocket 服务纳入 CI/CD 并通过 Traefik 统一入口
## 变更内容

### 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>
2026-03-02 17:16:26 +08:00

104 lines
2.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"