
🔥承渊政道:个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》
✨逆境不吐心中苦,顺境不忘来时路!✨
🎬 博主简介:

这类小游戏项目看起来不复杂,真正容易把人卡住的地方却往往不在页面,而是在编译环境.Landlord这次最典型的问题,就是Go项目里用了SQLite3:如果直接拿 CGO_ENABLED=0 的二进制去跑,go-sqlite3 驱动就可能无法正常工作.与其反复重启服务碰运气,我更愿意先把依赖关系理清楚,再从源码重新编译.本文就按这个思路来做:先在Linux上准备 gcc、SQLite 开发库和 Go 1.22,开启 CGO_ENABLED=1 编译 Landlord;然后把默认端口改到 8083,前台运行确认不闪退、不报错,再配置防火墙和 systemd 开机自启.等本地 http://IP:8083 页面真正打开以后,再安装cpolar,先用随机域名验证公网访问,最后换成固定二级子域名 landlord.我还会把“服务部署成功”和“AI 训练场已经验证”分开看:当前素材能证明的是编译、启动、登录页和公网访问,项目介绍虽然提到 AI 对战或多人联机,但没有继续展示完整 AI 牌局.对这种游戏服务,我宁愿把已验证边界写清楚,也不为了标题热闹就把未展示的能力当成结论.这样做还有一个实际好处:如果页面打不开,可以先查编译和端口;如果公网打不开,再查隧道;如果进入游戏后 AI 行为不对,再单独看游戏逻辑,不会把几个问题混在一起.
目录
- 1.Landlord这次真正的难点,不是规则,而是编译
- 2.先安装CGO需要的依赖
- 3.安装 Go 1.22.5
- 4.拉取 Landlord 源码
- 5.开启CGO编译
- 6.把Web端口改成8083
- 7.先前台启动确认服务没问题
- 8. 放行8083
- 9.配置 systemd 常驻运行
- 10.浏览器验证本地页面
- 11.本地跑通以后,再处理公网访问
- 12.安装 cpolar
- 13.先用随机域名验证 `8083`
- 14.长期使用再换固定二级子域名
- 15.总结
1.Landlord这次真正的难点,不是规则,而是编译
斗地主本身是三人参与的牌类游戏,由地主和两名农民形成 1 对 2 的对抗.放到这个项目里,landlord 指的是一个斗地主游戏服务端程序,当前说明中提到它可用于 AI 对战或多人联机.
但这篇真正碰到的技术问题很明确:
Go + SQLite3 依赖 CGO。
如果使用 CGO_ENABLED=0 编译,go-sqlite3 驱动无法正常工作.所以这次不能直接拿一个不带 CGO 的二进制就结束,而是要把 gcc、sqlite-devel 和 Go 编译环境补完整.
2.先安装CGO需要的依赖
当前要求包括:
- CGO_ENABLED=1
- gcc
- sqlite / sqlite-devel
- 本地 go build
先更新系统并安装依赖:
# root 登录
yum clean all
yum makecache
yum -y update
# 安装编译工具 + gcc + sqlite 开发库
yum groupinstall -y "Development Tools"
yum install -y wget git sqlite sqlite-devel
然后验证 gcc 和 SQLite:
gcc –version
sqlite3 –version
只要这两项正常,再继续安装Go,后面的编译就有基础.
3.安装 Go 1.22.5
这里使用:
go1.22.5.linux-amd64.tar.gz
步骤保持如下:
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
这一段会完成下载、解压、移动到 /usr/local/、设置 PATH 和 GOPATH=/root/go,最后用 go version 验证.
4.拉取 Landlord 源码
执行:
git clone https://github.com/dwg255/landlord.git
#进入目标目录
cd landlord/main/

项目地址是:
https://github.com/dwg255/landlord.git
随后进入:
landlord/main/
5.开启CGO编译
执行:
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \\
go build -o ../landlord -ldflags "-w -s"

这里最关键的是:
CGO_ENABLED=1
同时保留:
- GOOS=linux
- GOARCH=amd64
- 输出文件 ../landlord
- -ldflags "-w -s"
这一步就是为了解决 SQLite 驱动不能在 CGO_ENABLED=0 环境下正常工作的情况.
6.把Web端口改成8083
因为当前机器的 80 端口已经被占用,所以改到:
8083
先进入配置目录:
cd conf/
vi app.conf
再修改配置:
# 修改此部分
[product]
http_port=8083

后面的启动、浏览器访问、防火墙和公网隧道都继续围绕 8083.
7.先前台启动确认服务没问题
回到目标目录运行:
#回到目标目录
cd /docker/landlord/
./landlord

这里的判断标准很直接:
不闪退、不报错。
确认服务能正常保持运行以后,按 Ctrl+C 停止.
我更喜欢先这样验证,再做后台常驻.前台阶段如果已经报错,就没必要把 systemd 也卷进来一起排查.
8. 放行8083
按当前步骤继续开放防火墙端口:
# 开放端口
firewall-cmd –add-port=8083/tcp –permanent
firewall-cmd –reload
# 查看
firewall-cmd –list-ports
这组命令会永久开放 8083/tcp、重载防火墙并,查看当前开放端口.
9.配置 systemd 常驻运行
写入:
/etc/systemd/system/landlord.service
配置如下:
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
操作记录里又出现了一次相同的 service 写入命令,内容完全一致:
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
这个 service 的关键配置包括:
- WorkingDirectory=/docker/landlord
- ExecStart=/docker/landlord/landlord
- Restart=always
- RestartSec=5
10.浏览器验证本地页面
部署完成后访问:
http://IP:8083

能看到斗地主登录界面以后,可以确认这条链已经成立:
CGO 编译 → Landlord 启动 → 8083 Web 服务 → 浏览器访问
这里我不会继续把“登录页能打开”扩大成“AI 训练场全部验证完成”.当前素材没有继续展示实际牌局、Bot 出牌或三名 AI 自动开局过程,因此 AI 对战效果仍然属于后续需要进入游戏继续验证的部分.
11.本地跑通以后,再处理公网访问
如果只在局域网中使用,8083 已经可以打开.
如果还想从手机或其他网络访问,就再增加公网入口.这里 cpolar 只负责:
把 Landlord 的 8083 Web 服务映射到公网.
游戏逻辑、SQLite 和后台进程仍然由 Landlord 自己负责.
12.安装 cpolar
执行:
sudo curl https://get.cpolar.sh | sh

安装完成后检查服务:
sudo systemctl status cpolar

然后通过主机 IP + 9200 打开 cpolar Web 管理页面.
这里同时出现:
http://ip:9200
和:
http://localhost:9200/
两种写法.实际使用时,以当前设备真正能访问到的管理地址为准.

13.先用随机域名验证 8083
进入【隧道管理 → 创建隧道】,配置为:
- 隧道名称:landlord
- 协议:http
- 本地地址:8083
- 域名类型:随机域名
- 地区:China Top

创建以后,在在线隧道列表查看公网地址.

从其他电脑或移动设备访问.

页面可以正常打开.
这一步确认的是:
Landlord 8083 → cpolar 随机公网地址 → 外部浏览器访问成功.
14.长期使用再换固定二级子域名
如果准备长期保留入口,再配置固定二级子域名.
进入预留功能.

地区选择:
china Top
这次使用的名称是:
landlord

保留完成后,回到【隧道管理 → 隧道列表】找到对应隧道.

修改为:
- 域名类型:二级子域名
- Sub Domain:填写保留成功的名称
- 地区:China Top
点击更新.

之后就可以继续使用固定公网地址访问.
15.总结
这篇真正值得记住的,不是“30 秒上线一个 AI 斗地主训练场”,而是那个很典型的 Go + SQLite 编译问题:只要 go-sqlite3 参与运行,CGO 环境就不能随便省.
实际部署链路是:
gcc / sqlite-devel → Go 1.22.5 → Landlord 源码 → CGO_ENABLED=1 → 8083 → 前台启动验证 → 防火墙 → systemd → 本地浏览器 → cpolar → 随机公网地址 → 固定二级子域名 landlord.
关键技术点包括:
- Go:go1.22.5
- CGO_ENABLED=1
- GOOS=linux
- GOARCH=amd64
- 端口:8083
- 工作目录:/docker/landlord
- systemd 服务:landlord.service
- cpolar 管理端口:9200
- 隧道名称:landlord
- 地区:China Top / china Top
- 固定二级子域名:landlord
当前能够确认的是:Landlord 已经完成源码编译、服务启动、本地页面访问和公网访问.至于 AI 对局能力,当前素材没有给出完整牌局和 Bot 行为验证,因此更适合留到真正进入游戏之后再下结论.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!
敬请期待下一篇文章内容
每日心灵鸡汤: 当人开始期待灾难时,真正先被牺牲的往往是普通人!
越是长期处于匮乏、又看不到上升希望的人,越容易产生一种心理补偿:既然我很难变好,那就希望所有人一起变差,甚至期待一次集体性的灾难把差距重新抹平.但现实往往相反,真正发生危机时,富人有现金、资产、关系、信息和迁移能力,最先被伤害的还是普通人.也正因为如此,这种心理最容易被“镰刀”(制度、商业)利用:不断制造恐惧、塑造共同敌人、放大威胁,让人主动接受牺牲和服从.这套逻辑不仅存在于制度设计里,在商业、组织、投资市场和舆论环境里同样通用.真正危险的,不只是灾难,而是有人让你相信:只有更大的灾难,才能解决你现在的不公平.

网硕互联帮助中心





评论前必须登录!
注册