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>
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"log"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
"time"
|
||
|
||
"github.com/qy/hw-ws-service/internal/config"
|
||
"github.com/qy/hw-ws-service/internal/rtcclient"
|
||
"github.com/qy/hw-ws-service/internal/server"
|
||
)
|
||
|
||
func main() {
|
||
log.SetFlags(log.LstdFlags | log.Lmsgprefix)
|
||
log.SetPrefix("[hw-ws] ")
|
||
|
||
cfg := config.Load()
|
||
addr := cfg.WSHost + ":" + cfg.WSPort
|
||
|
||
client := rtcclient.New(cfg.RTCBackendURL)
|
||
srv := server.New(addr, client)
|
||
|
||
// 后台启动服务器
|
||
serverErr := make(chan error, 1)
|
||
go func() {
|
||
serverErr <- srv.ListenAndServe()
|
||
}()
|
||
|
||
// 监听系统信号(K8s 滚动更新发送 SIGTERM)
|
||
sigCh := make(chan os.Signal, 1)
|
||
signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT)
|
||
|
||
select {
|
||
case err := <-serverErr:
|
||
log.Fatalf("server error: %v", err)
|
||
case sig := <-sigCh:
|
||
log.Printf("received signal: %v, starting graceful shutdown...", sig)
|
||
}
|
||
|
||
// 优雅关闭:最长 80s(与 K8s terminationGracePeriodSeconds=90 配合)
|
||
ctx, cancel := context.WithTimeout(context.Background(), 80*time.Second)
|
||
defer cancel()
|
||
srv.Shutdown(ctx)
|
||
|
||
log.Println("shutdown complete")
|
||
}
|