feat: 在线双人五子棋(Socket.IO + Vue3 + Canvas)

- 服务端权威状态机:落子校验、四方向五连判胜、悔棋请求、认输、离线判负、交换黑白再来一局
- 断线重连:resumeToken 凭证 + localStorage,刷新/锁屏自动回到原座位
- 移动端 Canvas 棋盘:DPR 适配、触摸容差吸附、最后一手标记、胜利连子高亮
- Docker 多阶段构建,非 root + 只读根文件系统
- k8s 清单:单副本 Recreate(内存态房态)、Ingress WebSocket 超时与粘性会话注释
This commit is contained in:
root
2026-09-10 18:17:10 +08:00
commit 59bfc98afa
22 changed files with 5995 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
# 部署前需要改两处:
# 1. spec.ingressClassName —— 用 `kubectl get ingressclass` 确认集群里实际的 class 名
# 2. spec.rules[].host 与 spec.tls[].hosts —— 换成你自己的域名
#
# 证书二选一:
# A) cert-manager 自动签发:在 annotations 里加
# cert-manager.io/cluster-issuer: <你的 ClusterIssuer 名>
# B) 手动导入已有证书:
# kubectl -n wuziqi create secret tls wuziqi-tls \
# --cert=fullchain.pem --key=privkey.pem
# 没有域名时删掉整段 spec.tls,并去掉 annotations 里的 force-ssl-redirect(若有),
# 改为纯 HTTP 访问;Socket.IO 在 HTTP 下也能工作,但手机网络上不如 wss 稳定。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wuziqi
namespace: wuziqi
labels:
app: wuziqi
annotations:
# —— Socket.IO 长连接的关键三项 ——
# 默认 proxy-read-timeout 只有 60s,长连接会被 Ingress 直接掐断,
# 表现为手机每隔一分钟掉线一次。心跳间隔 25s,这里放宽到 1 小时。
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
# 关闭缓冲,避免事件被攒着不发导致落子延迟
nginx.ingress.kubernetes.io/proxy-buffering: "off"
# 显式声明 WebSocket Upgrade 的目标 Service
nginx.ingress.kubernetes.io/websocket-services: "wuziqi"
# —— 会话亲和性 ——
# 客户端 transports 为 [websocket, polling]WebSocket 不通时会回退到长轮询。
# 长轮询的握手与后续请求必须落到同一 Pod,否则会话丢失。
# replicas=1 时这几项是空操作,但一旦调大副本数就是必需的。
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "wuziqi-affinity"
nginx.ingress.kubernetes.io/session-cookie-max-age: "3600"
nginx.ingress.kubernetes.io/session-cookie-samesite: "Lax"
spec:
ingressClassName: nginx
tls:
- hosts:
- gomoku.example.com
secretName: wuziqi-tls
rules:
- host: gomoku.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wuziqi
port:
number: 80