从Go+SQLite编译到浏览器开局:landlord部署、AI对局与固定地址实战
前言
这篇完整走一遍开源斗地主项目dwg255/landlord的 Linux 部署过程。项目使用 Go、SQLite3 和 WebSocket,官方仓库明确说明自带简单出牌 AI;同时go.mod依赖mattn/go-sqlite3,因此 Linux 编译时需要开启 CGO 并准备 GCC。
部署从 yum 依赖、Go 1.22.5、源码克隆和CGO_ENABLED=1编译开始,再把服务端口调整为 8083,先前台启动确认页面能正常访问,随后补上防火墙和 systemd 常驻。
最后再把 8083 页面提供给外部浏览器访问,并配置固定二级子域名。
整篇重点放在“依赖—编译—运行—常驻—远程访问”这条链路上,同时把源码目录和/docker/landlord路径不一致、systemd 配置重复以及‘30秒上线’这类夸张表述逐一收紧。
这套项目还有一个特点:仓库本身比较老,go.mod声明的是Go 1.12,而教程演示却使用Go 1.22.5。新版本Go不一定不能编译,但这种跨度值得明确写出来;如果以后出现依赖兼容问题,排查方向就不会只盯着端口和防火墙。另外,远程访问部分也不会把“页面能打开”直接写成“多人联机已经验证”。项目确实使用WebSocket,也确实带Bot,但这篇截图真正证明的是服务页面和公网入口可达。是否支持多客户端稳定对局,还应该通过真实多人进入、完整开局和断线场景继续验证。
1 先看清这个landlord项目到底是什么
这里的landlord不是一个“AI训练平台”。
它是一个开源斗地主 Web 项目。
项目官方仓库明确写到:
- Go 项目;
- SQLite3 数据库;
- Go Modules 管理依赖;
- 自带简单出牌 AI;
- 使用 WebSocket;
- 浏览器访问。
所以更准确的定位应该是:
可以自己部署的斗地主 Web 服务,带基础 AI 玩家。
拿它练规则、试牌局、自己玩都可以。
但不能把“自带无脑出牌AI”扩大成:
- 专业策略训练;
- 智能记牌教练;
- 高水平AI对手;
- 保证提升胜率。
2 为什么这篇必须先解决CGO
这个项目的go.mod里依赖:
github.com/mattn/go-sqlite3
而这个 SQLite 驱动属于 CGO 包。
它要求:
CGO_ENABLED=1- GCC编译器
- 对应Linux开发环境
这也是为什么源步骤先安装:
- Development Tools
- gcc
- sqlite
- sqlite-devel
这一层不是可有可无。
如果直接拿CGO_ENABLED=0的方式编译,SQLite驱动就可能无法正常工作。
3 先更新CentOS并安装编译依赖
执行:
# root 登录yum clean all yum makecache yum-yupdate# 安装编译工具 + gcc + sqlite 开发库yum groupinstall-y"Development Tools"yuminstall-ywgetgitsqlite sqlite-devel这里会做几件事:
- 刷新yum缓存;
- 更新系统;
- 安装Development Tools;
- 安装wget;
- 安装git;
- 安装sqlite;
- 安装sqlite-devel。
如果是长期运行的生产服务器,yum -y update前更建议先确认系统版本和现有业务。
因为系统级更新不只是为了 landlord 一个项目服务。
4 确认gcc和sqlite3
执行:
gcc--versionsqlite3--version这一步确认:
编译器和SQLite命令行工具已经可用。
看到版本信息以后再继续。
5 安装Go 1.22.5
执行:
cd/rootwgethttps://dl.google.com/go/go1.22.5.linux-amd64.tar.gztar-zxfgo1.22.5.linux-amd64.tar.gzmvgo /usr/local/# 配置环境变量echo'export PATH=$PATH:/usr/local/go/bin'>>/etc/profileecho'export GOPATH=/root/go'>>/etc/profilesource/etc/profile# 验证go version这里安装:
go1.22.5
并把:
/usr/local/go/bin
加入 PATH。
需要注意:
项目仓库自己的go.mod写的是:
go 1.12
也就是说这是一个比较老的 Go 项目。
使用 Go 1.22.5 不代表一定有问题,但也不能简单写成:
“官方推荐版本就是1.22”
更准确的是:
这篇演示使用 Go 1.22.5 编译。
如果新版本 Go 出现兼容问题,可以回头检查项目依赖和原始Go版本。
6 拉取landlord源码
执行:
gitclone https://github.com/dwg255/landlord.git#进入目标目录cdlandlord/main/仓库地址:
https://github.com/dwg255/landlord.git
官方 README 的思路也是:
clone → 进入 main → build
所以这一步和项目本身的运行说明是对应的。
7 开启CGO编译
执行:
CGO_ENABLED=1GOOS=linuxGOARCH=amd64\go build-o../landlord-ldflags"-w -s"这里:
CGO_ENABLED=1
是关键。
输出文件:
../landlord
也就是说:
如果当前目录是:
landlord/main/
那么生成的二进制应该回到:
landlord/landlord
这个位置后面会直接影响启动路径。
8 这里有第一个明显的目录问题
编译时当前目录是:
landlord/main/
但下一节直接写:
cdconf/viapp.conf如果仍然停留在:
landlord/main/
那么:
cd conf/
通常是找不到的。
项目仓库中的conf目录位于仓库根目录。
所以执行时应该先确认:
自己现在到底在哪个目录。
这里不直接改代码块,只提醒路径关系。
9 把HTTP端口改成8083
配置:
# 修改此部分[product]http_port=8083这里因为机器80端口已经被占用,所以把服务端口改成:
8083
这个思路没有问题。
8083只是这次演示端口,不是 landlord 项目的固定要求。
10 前台启动时又出现第二个路径跳变
源步骤使用:
#回到目标目录cd/docker/landlord/ ./landlord这里突然变成:
/docker/landlord/
但前面的 clone 流程并没有展示:
- 把项目克隆到
/docker - 把源码移动到
/docker/landlord - 把编译后的二进制复制过去
所以如果完全照前面的命令执行,项目更可能还在:
/root/landlord
或者你实际 clone 时所在的目录。
因此启动前一定要确认:
landlord二进制真实路径;conf目录真实路径;- 当前Working Directory。
11 “不报错”只是第一层验证
前台启动以后:
如果程序没有退出、没有明显报错,说明进程至少能够运行。
但更完整的验证还应该继续做:
浏览器真正打开8083。
这才说明:
进程 → HTTP监听 → Web页面
整个基础链已经通了。
12 防火墙是否必须,要看机器实际环境
执行:
# 开放端口firewall-cmd --add-port=8083/tcp--permanentfirewall-cmd--reload# 查看firewall-cmd --list-ports这组命令会放行:
8083/tcp
如果这台 CentOS 正在使用 firewalld,并且需要其他设备直接访问 8083,这一步确实有意义。
但“必须,否则外网访问不了”写得太绝对。
例如:
- firewalld未启用;
- 只在本机回环访问;
- 网络由其他防火墙管理;
处理方式都会不同。
所以应该先确认自己的防火墙环境。
13 systemd让游戏服务后台常驻
第一段配置:
cat>/etc/systemd/system/landlord.service<<'EOF' [Unit] Description=Landlord Game Server After=network.target [Service] Type=simple WorkingDirectory=/docker/landlord ExecStart=/docker/landlord/landlord Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF这里设置:
- WorkingDirectory:
/docker/landlord - ExecStart:
/docker/landlord/landlord - Restart:
always
目的就是让 landlord:
退出后自动重启,并随系统服务方式管理。
14 源步骤把同一个systemd配置重复了一遍
后面再次出现:
cat>/etc/systemd/system/landlord.service<<'EOF' [Unit] Description=Landlord Game Server After=network.target [Service] Type=simple WorkingDirectory=/docker/landlord ExecStart=/docker/landlord/landlord Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF两段内容完全一致。
所以这不是两套不同配置。
执行一遍就已经写入:
/etc/systemd/system/landlord.service
第二遍只是重复覆盖同一个文件。
更需要关注的是:
这里的/docker/landlord是否真的和前面编译目录一致。
15 systemd配置还缺少后续启用命令展示
写入 service 文件以后,正常还需要类似:
systemctl daemon-reloadsystemctl enable ...systemctl start ...systemctl status ...
来真正加载和启动服务。
但源步骤没有把这些命令展示出来。
所以这里只能说:
service文件已经准备。
不能把它直接描述成:
已经完成开机自启验证。
16 最终还是要从浏览器验证8083
浏览器访问:
http://IP:8083
能看到斗地主登录页面以后,才说明:
服务器 → landlord进程 → 8083 → 浏览器
这一条链真正跑通。
这里比“程序没闪退”更有说服力。
17 AI这部分应该怎么描述才准确
项目官方README明确写:
自带无脑出牌AI。
所以:
支持AI玩家
这个说法是有依据的。
但它没有证明:
- 三个AI会自动完整开局;
- AI具备高级策略;
- 可以做专业训练;
- AI水平能模拟真人高手。
所以更稳妥的定位是:
带基础Bot的私人斗地主练习场。
18 “30秒上线”不符合这篇真实流程
这篇实际步骤包括:
- yum更新;
- 开发工具安装;
- Go下载;
- 环境变量;
- git clone;
- CGO编译;
- 改配置;
- 调端口;
- 前台测试;
- 防火墙;
- systemd。
这些都不可能稳定压缩成统一的“30秒”。
所以新版不再保留这个时间承诺。
真正值得强调的是:
流程完整、能复现。
19 本地能玩以后,再考虑远程
如果只在家里或者局域网玩:
http://IP:8083
已经够用。
只有需要:
- 手机在外面打开;
- 异地自己访问;
- 临时让朋友进入;
才有必要继续增加公网入口。
20 安装cpolar
执行:
sudocurlhttps://get.cpolar.sh|sh安装完成后检查:
sudosystemctl status cpolar然后进入:
主机IP:9200
后面的隧道都在这里配置。
21 给8083创建随机公网地址
参数:
- 隧道名称:
landlord - 协议:
http - 本地地址:
8083 - 域名类型:随机域名
- 地区:
China Top
创建成功以后:
再从外部浏览器打开:
页面能加载以后,说明:
外部浏览器 → 公网地址 → cpolar → landlord:8083
网络链已经通了。
22 公网访问不等于“多人联网能力已经验证”
这里还要区分两个概念:
Web页面能从公网打开
和:
多人实时联网对局已经完整验证
不是一回事。
项目本身使用WebSocket,确实具备网页游戏通信基础。
但这篇截图只证明:
- 页面能打开;
- 服务端能响应。
没有实际展示:
- 两个外部客户端同时进入;
- 房间匹配;
- 断线重连;
- 多人完整一局。
所以正文不再扩大描述。
23 随机地址适合先测试
先验证:
- 页面打开;
- 静态资源正常;
- WebSocket没有被阻断;
- 登录和牌局功能正常。
这些都没问题以后,再决定是否需要固定地址。
24 配置固定二级子域名
进入预留页面:
保留:
landlord
然后进入隧道列表:
把域名类型改为:
二级子域名
更新以后使用新的固定地址。
25 固定地址解决的是入口稳定,不是游戏能力
源步骤写:
永久不会变化。
更稳妥的表述是:
在账号、套餐和对应服务条件持续有效的情况下,固定地址不需要像随机地址那样频繁变化。
它解决的是:
- 地址好记;
- 书签稳定;
- 不需要反复换访问链接。
它不会自动提升:
- AI水平;
- 房间人数;
- 游戏服务器性能;
- 账号安全。
26 这套部署真正完成了什么
依赖层:
CentOS → GCC → SQLite → Go
编译层:
源码 → CGO → landlord二进制
运行层:
app.conf → 8083 → 浏览器
常驻层:
systemd service文件
远程层:
公网地址 → cpolar → 8083
真正完成:
- Go环境;
- SQLite依赖;
- CGO编译;
- 8083端口;
- Web页面;
- systemd配置文件;
- 随机公网访问;
- 固定二级子域名。
需要特别注意:
- 项目官方只确认基础AI;
go.mod声明Go 1.12;- 教程使用Go 1.22.5;
conf路径前后不一致;/docker/landlord没有迁移步骤;- systemd配置重复;
- service后续启用命令没有展示;
- “30秒上线”不符合实际部署链。
总结
整套流程可以拆成五层:系统依赖、Go与CGO编译、8083服务启动、systemd常驻配置、外部访问入口。
本文已经完整保留gcc、sqlite-devel、Go 1.22.5、源码编译、端口修改、防火墙、systemd和公网访问步骤。
需要特别修正的是:项目官方只写明自带简单AI;源码目录与/docker/landlord路径存在跳变;systemd配置重复,而且没有展示真正enable/start的后续命令。
把这些细节说明白以后,这篇更准确的定位是:从源码把一个Go版斗地主Web项目完整跑起来,再把本地8083页面扩展到远程访问,而不是“30秒上线的专业AI训练场”。