3分钟用Docker一键搭建DNF私服
【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf
搭建DNF私服最劝退的不是游戏本身,而是没完没了的环境配置:依赖装不上、端口对不上、服务起不来。现在,一个Docker容器化部署方案把整个服务端打包进单一镜像,几条命令就能跑通全流程,全程只需3分钟。这篇实战指南按新手最容易卡住的5个问题来组织,照做就能跑通。
准备环境:先满足三个硬性条件再动手
动手前先看清门槛,避免白折腾:
| 项目 | 要求 |
|---|---|
| 内存 | 4GB以上(2GB最低,必须配置swap) |
| 磁盘 | 至少20GB可用空间 |
| 系统 | CentOS 7+ / Ubuntu 18.04+(非ARM架构) |
| 软件 | Docker与Docker Compose |
就这些,不需要装任何游戏依赖。项目基于官方CentOS基础镜像,把登录、频道、公会、拍卖行、数据库等服务全部整合进镜像1995chen/dnf,用环境变量控制配置,所以服务器上只需一个Docker。
装好后验证一下环境是否就绪:
docker --version能看到版本号,就进入下一步。
一键部署:docker run 拉起完整游戏服务
这一节分两小步:先建数据目录,再启动容器。
前置条件:Docker已安装,内存不低于2GB。
第一步,创建数据目录。日志、数据库、PVF都落在宿主机上,方便备份和迁移:
mkdir -p /data/log /data/mysql /data/data第二步,一键启动。下面命令可直接复制,只需把PUBLIC_IP换成你的公网IP(局域网部署填内网IP):
docker run -d \ -e PUBLIC_IP=你的公网IP \ -e WEB_USER=root -e WEB_PASS=123456 \ -e DNF_DB_ROOT_PASSWORD=88888888 \ -e GM_ACCOUNT=gmuser -e GM_PASSWORD=gmpass \ -e CLIENT_POOL_SIZE=10 \ -v /data/log:/home/neople/game/log \ -v /data/mysql:/var/lib/mysql \ -v /data/data:/data \ -p 2000:180 -p 3000:3306/tcp -p 7600:7600/tcp -p 881:881/tcp \ -p 7001:7001/tcp -p 7001:7001/udp \ -p 30011:30011/tcp -p 31011:31011/udp \ -p 30052:30052/tcp -p 31052:31052/udp \ -p 7300:7300/tcp -p 7300:7300/udp \ -p 2311-2313:2311-2313/udp \ --cap-add=NET_ADMIN --hostname=dnf \ --cpus=1 --memory=1g --memory-swap=-1 --shm-size=8g \ --name=dnf 1995chen/dnf:centos5-2.1.9.fix1几个关键参数先混个脸熟:
| 参数 | 默认值 | 含义 |
|---|---|---|
| PUBLIC_IP | 无 | 对外IP,客户端靠它连服务器 |
| OPEN_CHANNEL | 11,52 | 开启的频道,可写1-20,52-56 |
| CLIENT_POOL_SIZE | 10 | 客户端缓冲池,单人玩可降到3 |
| GM_ACCOUNT / GM_PASSWORD | gmuser / gmpass | 网关登录账号密码 |
| --shm-size=8g | 不可删除 | 共享内存,Docker默认64M带不动服务 |
启动后等待1~2分钟,首次运行会自动初始化MySQL数据。
验证是否成功,看三处:
- 看初始化日志,出现5条
GeoIP Allow Country Code(圈内俗称"五国")即代表游戏服初始化完成:
tail -f /data/log/siroco11/Log$(date +%Y%m%d).init- 看游戏进程是否存活:
docker exec dnf ps -ef | grep df_game- 浏览器访问
http://你的IP:2000,用WEB_USER/WEB_PASS登录Supervisor管理页,可实时查看每个进程的状态和日志。
想用 docker-compose 管理(群晖NAS推荐)?先克隆项目:
git clone https://gitcode.com/gh_mirrors/dnf/dnf然后进入deploy/dnf/docker-compose/basic目录,执行docker-compose up -d即可,效果与上面命令一致。
读懂端口:一张架构图弄清服务分层
先看整体架构,一秒理解系统是怎么运转的:
服务大致分四层:接入层(stun打洞、relay中继、channel分流)负责客户端接入;游戏服务层(game频道服务器)承载核心玩法;功能模块层(公会、拍卖行、点券、监控)提供配套功能;数据存储层(MySQL)负责数据持久化。
对应到部署命令里,各端口作用如下:
| 端口 | 作用 |
|---|---|
| 881 | 统一网关(登录器连接入口) |
| 7600 | 登录器端口 |
| 2000 | Supervisor进程管理Web页面 |
| 3000 | MySQL数据库(注意不是3306) |
| 7001 | 频道分流服务 df_channel_r |
| 30011/31011 | 11频道游戏服务 df_game_r |
| 30052/31052 | 52频道游戏服务 |
| 7300 | P2P中继 df_relay_r |
| 2311-2313 | NAT打洞 df_stun_r |
想开更多频道?改环境变量OPEN_CHANNEL=1-20,52-56即可,每个频道大约多占200~300MB内存,按服务器配置量力而行。详细部署方式可参考doc/OtherDeploy.md。
连接客户端:三步配置网关生成登录器
服务端就绪后,客户端要完成三件事。
第一步,装补丁:打开DOF补丁里的DNF.toml,把服务器地址改成你的PUBLIC_IP,再将补丁文件复制到游戏客户端根目录。
第二步,配置统一网关,参数如下:
| 配置项 | 值 |
|---|---|
| 网关地址 | 你的PUBLIC_IP |
| 网关端口 | 881 |
| 登录账号 / 密码 | gmuser / gmpass |
| 通信密钥 | 763WXRBW3PFTC3IXPFWH |
| 登录器端口 | 7600 |
| 登录器版本 | 20180307 |
第三步,生成登录器:点击"生成登录器",把生成的登录器和Config.ini复制到游戏根目录,双击即可进游戏。首次登录记得先在游戏里注册账号。
排查故障:三个高频报错当场解决
新手翻车基本集中在这三处,对号入座即可。
坑1:服务启动失败,一直卡在 Init DataManager 日志循环
- 原因:内存或swap不足。
- 解法:执行
free -m确认swap是否生效;为服务器增加8G swap空间并同步调大--shm-size;内存实在不够就只开1个频道(OPEN_CHANNEL=11)。
坑2:客户端能进频道但点不进去(灰频道)
- 原因:防火墙或安全组未放行对应端口。
- 解法:关闭服务器防火墙;在云厂商安全组放行881、7600、3000、7001、7300、30011/31011等端口;最后确认
PUBLIC_IP是客户端能访问到的地址。
坑3:统一网关提示无法连接数据库
- 原因:数据库端口记成了3306。
- 解法:本项目MySQL对外端口是3000,用户名root、密码默认
88888888,确认3000端口已在安全组放行。
写在最后:记住这5点就够了
- 整个服务就是一个容器,数据全在
/data下,备份=打包目录,迁移=换机器重新run。 - 配置全靠环境变量,改IP、频道、密码后执行
docker restart dnf即可生效。 - 内存不够优先加swap,别硬扛;单人玩把
CLIENT_POOL_SIZE降到3,能省一大截内存。 - 进程被系统杀掉很常见,
docker restart dnf一键拉起,或在2000端口页面手动重启。 - 想上多频道、站库分离、多大区甚至K8s?项目提供了现成编排文件,入口在
deploy/dnf/docker-compose/与deploy/dnf/k8s-deploy/,插件扩展见plugin/目录,照着示例改就能用。
最后提醒:本项目仅供学习研究使用,请勿用于商业运营。把服务器跑起来,叫上朋友重温阿拉德的冒险,这才是容器化部署最快乐的地方。
【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考