想在浏览器里跟自部署的斗地主服务来一局?开源项目 landlord 走 Go + SQLite + WebSocket 的组合,自带简单出牌 AI,编译产物直接跑在 Linux 服务器上。部署过程本身不难,真正的关卡在 CGO——先把这条编译链讲清楚。
定位先摆正:能玩,但别指望高手 AI
它是一个可以自己部署的斗地主 Web 服务,带基础 AI 玩家。练规则、试牌局、朋友之间娱乐没问题;专业策略训练、记牌教练、稳定提升胜率——超出能力范围。预期管理到位,才不会部署完骂 AI 太笨。
为什么必须解决 CGO
项目的 go.mod 依赖 github.com/mattn/go-sqlite3,这个 SQLite 驱动是 CGO 包,要求 CGO_ENABLED=1 加 GCC 编译器。常见的 Go 交叉编译习惯是 CGO_ENABLED=0 追求静态单文件,到这个项目上直接翻车——SQLite 驱动没法正常工作。编译环境三件套缺一不可:
yum groupinstall -y "Development Tools"
yum install -y wget git sqlite sqlite-devel
gcc --version && sqlite3 --version
生产服务器上 yum -y update 前先确认存量业务兼容性,系统级更新影响的可不止这一个项目。
Go 环境与构建
cd /root
tar -zxf go1.22.5.linux-amd64.tar.gz -C /usr/local/
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
source /etc/profile
克隆仓库后 go build 出二进制,启动服务监听端口。SQLite 数据文件随服务落盘,玩家对局记录都能留存。
浏览器端运行的验证清单
- 连通:浏览器访问服务地址,能正常开局发牌;
- 对局闭环:完整打一局,AI 出牌、计分、结算都正常;
- 持久化:重启服务,历史数据还在(SQLite 文件读写正常);
- 并发:两个浏览器同时开局,互不干扰。
替代方案与边界
不想碰 CGO 的路子有两条:换纯 Go 实现的 SQLite 驱动(modernc.org/sqlite,性能略有损耗),或者把存储换成 PostgreSQL 彻底绕开。前者改动一行 import,后者要多维护一个数据库服务。另外 WebSocket 长连接要留意反向代理的超时配置——Nginx 默认 60 秒断连,不调 proxy_read_timeout 的话对局中途会掉线。这套"Go 编译 + 前端直连"的架构拿来改造自己的小游戏服务,成本很低,玩法扩展点都在服务端 AI 出牌逻辑上。

评论0