从Go+SQLite编译到浏览器开局:landlord部署、AI对局与固定地址实战

从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并安装编译依赖

执行:

shell 复制代码
# root 登录
yum clean all
yum makecache
yum -y update

# 安装编译工具 + gcc + sqlite 开发库
yum groupinstall -y "Development Tools"
yum install -y wget git sqlite sqlite-devel

这里会做几件事:

  • 刷新yum缓存;
  • 更新系统;
  • 安装Development Tools;
  • 安装wget;
  • 安装git;
  • 安装sqlite;
  • 安装sqlite-devel。

如果是长期运行的生产服务器,yum -y update 前更建议先确认系统版本和现有业务。

因为系统级更新不只是为了 landlord 一个项目服务。

4 确认gcc和sqlite3

执行:

shell 复制代码
gcc --version
sqlite3 --version

这一步确认:

编译器和SQLite命令行工具已经可用。

看到版本信息以后再继续。

5 安装Go 1.22.5

执行:

shell 复制代码
cd /root
wget https://dl.google.com/go/go1.22.5.linux-amd64.tar.gz
tar -zxf go1.22.5.linux-amd64.tar.gz
mv go /usr/local/

# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
echo 'export GOPATH=/root/go' >> /etc/profile
source /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源码

执行:

shell 复制代码
git clone https://github.com/dwg255/landlord.git

#进入目标目录
cd landlord/main/

仓库地址:

https://github.com/dwg255/landlord.git

官方 README 的思路也是:

clone → 进入 main → build

所以这一步和项目本身的运行说明是对应的。

7 开启CGO编译

执行:

shell 复制代码
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \
go build -o ../landlord -ldflags "-w -s"

这里:

CGO_ENABLED=1

是关键。

输出文件:

../landlord

也就是说:

如果当前目录是:

landlord/main/

那么生成的二进制应该回到:

landlord/landlord

这个位置后面会直接影响启动路径。

8 这里有第一个明显的目录问题

编译时当前目录是:

landlord/main/

但下一节直接写:

shell 复制代码
cd conf/
vi app.conf

如果仍然停留在:

landlord/main/

那么:

cd conf/

通常是找不到的。

项目仓库中的 conf 目录位于仓库根目录。

所以执行时应该先确认:

自己现在到底在哪个目录。

这里不直接改代码块,只提醒路径关系。

9 把HTTP端口改成8083

配置:

shell 复制代码
# 修改此部分
[product]

http_port=8083

这里因为机器80端口已经被占用,所以把服务端口改成:

8083

这个思路没有问题。

8083只是这次演示端口,不是 landlord 项目的固定要求。

10 前台启动时又出现第二个路径跳变

源步骤使用:

shell 复制代码
#回到目标目录
cd /docker/landlord/
./landlord

这里突然变成:

/docker/landlord/

但前面的 clone 流程并没有展示:

  • 把项目克隆到 /docker
  • 把源码移动到 /docker/landlord
  • 把编译后的二进制复制过去

所以如果完全照前面的命令执行,项目更可能还在:

/root/landlord

或者你实际 clone 时所在的目录。

因此启动前一定要确认:

  • landlord 二进制真实路径;
  • conf 目录真实路径;
  • 当前Working Directory。

11 "不报错"只是第一层验证

前台启动以后:

如果程序没有退出、没有明显报错,说明进程至少能够运行。

但更完整的验证还应该继续做:

浏览器真正打开8083。

这才说明:

进程 → HTTP监听 → Web页面

整个基础链已经通了。

12 防火墙是否必须,要看机器实际环境

执行:

shell 复制代码
# 开放端口
firewall-cmd --add-port=8083/tcp --permanent
firewall-cmd --reload

# 查看
firewall-cmd --list-ports

这组命令会放行:

8083/tcp

如果这台 CentOS 正在使用 firewalld,并且需要其他设备直接访问 8083,这一步确实有意义。

但"必须,否则外网访问不了"写得太绝对。

例如:

  • firewalld未启用;
  • 只在本机回环访问;
  • 网络由其他防火墙管理;

处理方式都会不同。

所以应该先确认自己的防火墙环境。

13 systemd让游戏服务后台常驻

第一段配置:

shell 复制代码
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配置重复了一遍

后面再次出现:

shell 复制代码
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-reload
  • systemctl 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

执行:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后检查:

shell 复制代码
sudo systemctl 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训练场"。

相关推荐
Rany-1 小时前
基于机器学习的长距离原水管线泄漏检测和定位
人工智能
Dawson Zhu2 小时前
《Agentic Design Patterns》第 17 章导读:推理技术
人工智能·语言模型·架构·aigc·agi
lank_M2 小时前
WebCodecs解码竖拍视频变横的?四个浏览器实测
图像处理·人工智能·计算机视觉·音视频
ybdesire2 小时前
使用agent-audit扫描Agent源码发现安全漏洞
人工智能·语言模型
kaka.liulin -study2 小时前
Colulu Agents Research:基于YOLO的端侧牛只检测课题的两阶段可审计研究
人工智能·multi agents
天真有邪09022 小时前
MVE:让 Voyager 在 VLML 上学会「取数编排」
人工智能
程序员大狐狸2 小时前
Ultra X7 358H 笔记本电脑,本地部署 Bonsai-2-27B,实测生成速度 11.6 tok/s
人工智能·llm
ViperL12 小时前
[高光谱]基于NAS的Few-Shot高光谱图像分类
人工智能·分类·数据挖掘