☰
从Go+SQLite编译到浏览器开局:landlord部署、AI对局与固定地址实战
2026/10/14 20:23:29 网站建设 项目流程

从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-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

执行:

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训练场”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询