云计算百科
云计算领域专业知识百科平台

想搭一个私人斗地主服务?从源码编译 Landlord 到远程访问完整教程

🔥承渊政道:个人主页

❄️个人专栏: 《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 行为不对,再单独看游戏逻辑,不会把几个问题混在一起.

5d9915927214a583ef6e74046628bfbd

目录

  • 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/

image-20260529162929040

项目地址是:

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

随后进入:

landlord/main/


5.开启CGO编译

执行:

CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \\
go build -o ../landlord -ldflags "-w -s"

image-20260529163005989

这里最关键的是:

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

image-20260529163334420

后面的启动、浏览器访问、防火墙和公网隧道都继续围绕 8083.


7.先前台启动确认服务没问题

回到目标目录运行:

#回到目标目录
cd /docker/landlord/
./landlord

image-20260529163419365

这里的判断标准很直接:

不闪退、不报错。

确认服务能正常保持运行以后,按 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

ac39ceeadc0dcff97c16db15fc36f12c

能看到斗地主登录界面以后,可以确认这条链已经成立:

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

image-20250725104019896

安装完成后检查服务:

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

然后通过主机 IP + 9200 打开 cpolar Web 管理页面.

这里同时出现:

http://ip:9200

和:

http://localhost:9200/

两种写法.实际使用时,以当前设备真正能访问到的管理地址为准.

8a6698b1bf26d64ba3645827fbfb1c29


13.先用随机域名验证 8083

进入【隧道管理 → 创建隧道】,配置为:

  • 隧道名称:landlord
  • 协议:http
  • 本地地址:8083
  • 域名类型:随机域名
  • 地区:China Top

image-20260529165503851

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

image-20260529172229708

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

image-20260529172431588

页面可以正常打开.

这一步确认的是:

Landlord 8083 → cpolar 随机公网地址 → 外部浏览器访问成功.


14.长期使用再换固定二级子域名

如果准备长期保留入口,再配置固定二级子域名.

进入预留功能.

image-20250918151358733

地区选择:

china Top

这次使用的名称是:

landlord

image-20260529172850938

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

image-20260529172911416

修改为:

  • 域名类型:二级子域名
  • Sub Domain:填写保留成功的名称
  • 地区:China Top

点击更新.

image-20260529172925922

之后就可以继续使用固定公网地址访问.


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 行为验证,因此更适合留到真正进入游戏之后再下结论.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!


敬请期待下一篇文章内容


每日心灵鸡汤: 当人开始期待灾难时,真正先被牺牲的往往是普通人!

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » 想搭一个私人斗地主服务?从源码编译 Landlord 到远程访问完整教程
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!