手把手教程:使用开源项目在NAS上搭建私人H5棋牌游戏室

今天将介绍一款基于H5技术的棋牌游戏平台。这是一个商用级别的项目,旨在让用户摆脱公共平台的种种限制,创造一个无后台监控、无人工干预、完全公平公正的游戏环境。该平台兼容性强,支持在手机、电脑、平板等任何带有浏览器的设备上运行,真正做到即开即玩。

重要提示:对于初次尝试部署的朋友,强烈建议严格遵循本教程的每一步操作。请勿在没有充分理解的情况下随意修改配置文件,也无需急于配置外网访问,按部就班完成内网部署是成功的第一步。
准备工作
首先,访问该项目的GitHub仓库地址:https://github.com/openinggame/qp,下载整个项目源码。

在你的NAS设备上,创建一个名为openinggame的文件夹,并将刚刚下载的ZIP压缩包放入其中。

解压这个ZIP文件。解压后,你会看到多个文件和文件夹,为了部署清晰,我们只需要保留以下三个核心文件:docker-compose.yml、mongo_data.tar.gz和mysql.tar.gz。可以将其它不必要的文件暂时移开或删除。

接下来,分别解压mongo_data.tar.gz和mysql.tar.gz这两个压缩包。解压完成后,你的文件夹结构应整理成类似下图所示的样子,包含必要的数据库数据目录和配置文件。

目录说明:mongo_data文件夹内部用于存放MongoDB数据库的数据文件。

目录说明:mysql文件夹内部则用于存放MySQL数据库的数据文件。

安装与部署
现在进入部署环节。在你的NAS的Docker管理界面(如Portainer或群晖的Docker套件)中,创建一个新项目(Stack)。选择项目路径为我们刚才准备的openinggame目录,并导入其中的docker-compose.yml文件作为模板。

原始的docker-compose.yml模板内容较为全面,但部分配置可能需要根据你的实际环境进行调整,例如网络配置等。其完整内容如下:
version: "3.0"
services:
web:
container_name: web0
image: openinggame/web:v1
ports:
- "80:80"
environment:
- API_HOST=<ip address>
networks:
- game
depends_on:
- server
server:
container_name: server0
image: openinggame/server:v1
ports:
- "81:81"
networks:
- game
depends_on:
- etcd
- kafka
- redis1
- mysql
- mongodb
mysql:
image: mysql:8.0.23
container_name: mysql0
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- /data/mysql:/var/lib/mysql
- mysqlconf:/etc/mysql/conf.d
networks:
- game
redis0:
container_name: redis0
image: redis:latest
volumes:
- redisdata0:/data
command: redis-server --requirepass 123456
networks:
- game
depends_on:
- etcd
redis1:
container_name: redis1
image: redis:latest
volumes:
- redisdata1:/data
command: redis-server --requirepass 123456
networks:
- game
depends_on:
- etcd
redis2:
container_name: redis2
image: redis:latest
volumes:
- redisdata2:/data
command: redis-server --requirepass 123456
networks:
- game
depends_on:
- mysql
- etcd
- redis1
zookeeper:
container_name: zookeeper
image: wurstmeister/zookeeper
restart: always
networks:
- game
kafka:
container_name: kafka0
image: wurstmeister/kafka:2.12-2.3.0
environment:
- KAFKA_BROKER_ID=0
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka0:9092
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
depends_on:
- zookeeper
networks:
- game
etcd:
image: quay.io/coreos/etcd:v3.2.32
container_name: etcd0
environment:
ETCDCTL_API: 3
command:
- etcd
- --name=etcd0
- --data-dir=/data/etcd-data
- --advertise-client-urls=http://etcd0:2379
- --listen-client-urls=http://0.0.0.0:2379
restart: always
volumes:
- etcd0_data:/etcd-data
networks:
- game
mongodb:
container_name: mongodb0
image: mongo:4.4.4
restart: always
volumes:
- /data/mongo_data:/data/db
- mongodb_logs:/data/logs
command: --auth
networks:
- game
depends_on:
- etcd
volumes:
mysqlconf:
mongodb_logs:
etcd0_data:
redisdata0:
redisdata1:
redisdata2:
networks:
game:
external:
true
为了简化部署过程,我使用了一个经过调整的模板。这个简化版主要修改了卷的挂载方式(使用相对路径./),并移除了自定义网络声明,让Docker Compose自动管理。你唯一需要修改的地方就是将environment中的API_HOST值,替换为你自己NAS在内网中的实际IP地址。
services:
web:
container_name: web0
image: openinggame/web:v1
ports:
- "8080:80"
environment:
- API_HOST=192.168.31.90 # 请修改为你的NAS内网IP
depends_on:
- server
server:
container_name: server0
image: openinggame/server:v1
ports:
- "81:81"
depends_on:
- etcd
- kafka
- redis1
- mysql
- mongodb
mysql:
image: mysql:8.0.23
container_name: mysql0
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlconf:/etc/mysql/conf.d
redis0:
container_name: redis0
image: redis:latest
volumes:
- ./redisdata0:/data
command: redis-server --requirepass 123456
depends_on:
- etcd
redis1:
container_name: redis1
image: redis:latest
volumes:
- ./redisdata1:/data
command: redis-server --requirepass 123456
depends_on:
- etcd
redis2:
container_name: redis2
image: redis:latest
volumes:
- ./redisdata2:/data
command: redis-server --requirepass 123456
depends_on:
- mysql
- etcd
- redis1
zookeeper:
container_name: zookeeper
image: wurstmeister/zookeeper
restart: always
kafka:
container_name: kafka0
image: wurstmeister/kafka:2.12-2.3.0
environment:
- KAFKA_BROKER_ID=0
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka0:9092
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
depends_on:
- zookeeper
etcd:
image: quay.io/coreos/etcd:v3.2.32
container_name: etcd0
environment:
ETCDCTL_API: 3
command:
- etcd
- --name=etcd0
- --data-dir=/data/etcd-data
- --advertise-client-urls=http://etcd0:2379
- --listen-client-urls=http://0.0.0.0:2379
restart: always
volumes:
- ./etcd0_data:/etcd-data
mongodb:
container_name: mongodb0
image: mongo:4.4.4
restart: always
volumes:
- ./mongo_data:/data/db
- ./mongodb_logs:/data/logs
command: --auth
depends_on:
- etcd
保存配置并启动项目。如果一切顺利,在Docker管理界面中,你应该能看到所有相关的容器(如web0、server0、mysql0、redis0/1/2、mongodb0、etcd0、kafka0、zookeeper)都成功运行起来,状态显示为“Up”。

开始使用
部署完成后,打开你的浏览器,在地址栏输入 http://你的NAS内网IP:8080 即可访问游戏大厅界面。

初次启动时,由于后台服务仍在初始化,页面可能会短暂显示“不可用”或加载缓慢。请耐心等待一两分钟,或者尝试在Docker中重启整个项目堆栈。

页面正常加载后,点击首页的“游客登录”按钮进入。

跳转后可能会弹出一个模拟的广告窗口,请不要关闭这个弹窗,直接点击广告图下方的“注册”按钮。

在注册页面,需要输入一个11位的手机号码(号码可随意编造,但格式要正确,通常需要以数字1开头),并填写昵称、密码等信息完成账号绑定。

成功登录后,你就可以畅玩游戏大厅了。平台内置了相当丰富的游戏种类,如斗地主、麻将、扑克等。

以斗地主为例,你可以根据自己想要的底分选择不同的游戏分区进入。

游戏体验与常见的在线棋牌游戏基本一致。你可以与AI对战,系统会提供出牌提示,游戏内也具备聊天对话功能。

值得一提的是,游戏中接管的AI对手智能水平并不低,能提供有挑战性的对局。(需要注意的是,此开源版本似乎缺少后台管理系统,如果游戏积分输光,可能需要重新注册账号来获得初始积分。)

如果你想和朋友们一起玩,可以创建私人房间。在大厅找到“开房”或“创建房间”的选项,设置好房间密码和规则后,将房间号分享给朋友即可。

在私人房间中的游戏操作与公开房间完全相同。

该平台的跨设备特性在此体现:直接在手机上打开浏览器,访问相同的NAS地址和端口,也能完美进入游戏并进行操作,体验良好。

关于资源占用,由于需要同时运行Web服务器、游戏逻辑服务器、多个数据库(MySQL、MongoDB、Redis)及中间件(Kafka, Zookeeper, Etcd),整体对内存的需求会相对高一些,CPU占用在空闲时则较为平稳。

总结与评价
总体而言,这款H5棋牌游戏开源项目虽然已经有一段时间未更新,但核心功能完整且稳定。对于想与朋友进行线上组队娱乐的场景来说,它能提供不错的体验。其最大的优势在于基于网页,无需安装任何客户端,真正做到即点即玩,非常方便。
当然,它也存在一些明显的不足,主要是缺乏一个可视化的后台管理功能,例如无法直接重置用户积分、查看游戏记录等。一旦积分耗尽,玩家只能通过重新注册账号来“续命”。
综合推荐指数:⭐⭐⭐(非常适合与朋友在私人环境中娱乐消遣) 使用体验指数:⭐⭐⭐(跨设备、免安装的网页访问方式极具便利性) 部署难度指数:⭐⭐⭐(属于中等难度,主要挑战在于需要拉取和协调的Docker镜像数量较多)