DNF私服搭建实战:从三天踩坑到一条 Docker 命令拉起服务端

📅 发布时间:2026/8/18 16:38:26
DNF私服搭建实战:从三天踩坑到一条 Docker 命令拉起服务端
DNF私服搭建实战从三天踩坑到一条 Docker 命令拉起服务端【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf如果你也动过 DNF 私服搭建的念头gh_mirrors/dnf/dnf这个把整套地下城与勇士服务端打包进 Docker 镜像的开源项目很可能就是让你从翻了三天的教程还停在准备阶段直接跳到今晚就能进游戏的那条捷径。它的核心价值很朴素把过去散落在几十个配置文件里的复杂度收敛成几个环境变量。先说说我手动搭 DNF 服务端时踩过的坑在没有容器方案之前搭一个能跑起来的 DNF 服务端是什么体验我形容它是一场没有文档的考古先要找到一套能用的服务端程序装一个老版本 Linux再对着各种.cfg文件改 IP、改端口、改数据库账号PVF 资源包要处理加密问题等级补丁要和客户端版本对齐MySQL 要手动建库授权……任何一步错了报错都是玄学级别的。其中最劝退的是不出五国这个黑话。所谓五国指的是服务端初始化日志里连续出现的GeoIP Allow Country Code那几行它相当于服务端在喊我活过来了。可一旦内存不够、swap 没配、PVF 不对这几行就是迟迟不出现你只能对着屏幕干瞪眼。我最初的几次尝试基本都死在这一步。直到我换了个思路与其手动管理这堆进程不如把整套环境装进容器里——这就是gh_mirrors/dnf/dnf做的事。它以官方 CentOS 5/6/7 为基础镜像通过环境变量和初始化脚本完成自动部署官方 README 里有一句我特别认同的声明这个项目虽然支持外网但只建议用来学习别拿去开服。DNF 私服搭建的本质一堆进程加一堆端口要理解它为什么能一条命令跑起来得先看懂 DNF 服务端到底是个什么东西。它不是一个单一体而是一群各司其职的进程通过固定的端口互相喊话Game Server游戏逻辑的主心骨处理登录、创角、地下城内的战斗逻辑Relay Server当两个玩家之间无法建立 P2P 直连时负责当中转Stun Server做 NAT 穿透UDP 打洞组队刷图能不能连上它很关键Channel 与 Bridge频道情报的下发与汇总你看到的频道列表就是它们维护的DBMW数据库中间件分为 guild、mnt、stat 三种相当于各服务的账房先生。用大白话打比方Game Server 是主城频道是副本入口Relay 和 Stun 是帮你把网络打通的红娘DBMW 是管账的。以前你要手动把这些进程一个个拉起来、把端口一个个配对而在这个镜像里容器内的 Supervisor 把这些进程全部托管了顺带还给你留了一个可视化的进程管理页面。这就是它省事的底层逻辑。Docker 部署 DNF 服务器的第一课把 docker run 翻译成人话动手之前先在 Linux 机器上装好 Docker 并关掉防火墙项目在doc/PrepareLinux.md里给了完整的初始化步骤包括内存不足 8GB 时如何配置 swap。然后挂三个数据目录日志、数据库、游戏数据把服务端的状态和容器生命周期解耦mkdir -p /data/log /data/mysql /data/data接着就是那条著名的启动命令。别被它吓到拆开看其实就三件事告诉容器你是谁、把端口映射出来、给足内存。环境变量是它的精髓PUBLIC_IP服务器对外 IP局域网部署就填局域网 IP。它就像你家小区的门牌号填错了所有客户端都找不到你DNF_DB_ROOT_PASSWORD容器启动时会自动把 MySQL root 密码改成这个值数据库端口对外是 3000 而不是 3306容易记错GM_ACCOUNT/GM_PASSWORD/GM_CONNECT_KEY统一网关的账号、密码和通信密钥客户端登录器要拿这三样来对暗号OPEN_CHANNEL要开放哪些频道默认11,52想开更多就加CLIENT_POOL_SIZE服务端启动时分配的客户端缓冲池单人玩填 3 就够人多再往上加它直接影响df_bridge_r和df_channel_r两个进程的内存占用--shm-size8g这个参数不能删Docker 默认共享内存只有 64M太小服务端根本起不来很多人卡在启动阶段就是这个原因。端口映射同样有规律可循881 是统一网关7600 是统一登录器2000 是 Supervisor 进程监控3000 是 MySQL7001 是频道服务30011/31011 是 11 频道的 TCP/UDP 口2311-2313 是 Stun。每个端口都对应一个门牌号转接漏一个就有一个服务在外面找不到家。如果你觉得 docker run 太长项目在deploy/dnf/docker-compose/basic/docker-compose.yaml里提供了等价的 compose 版本注释写得非常详细群晖用户可以直接拿来改。启动后别急着登录先确认五国真的出来了启动之后最忌讳的就是立刻打开客户端。服务端初始化大概需要一分钟判断它是否真正活过来有三个步骤第一看日志。进入挂载的/data/log目录找到siroco11文件夹下的Log$(date %Y%m%d).init文件siroco 是默认大区希洛克的名字执行tail -f盯住它。当连续的GeoIP Allow Country Code几行出现时恭喜你五国出来了服务端初始化成功。第二看进程。执行ps -ef | grep df_game如果能看到df_game_r siroco11 start这样的进程说明游戏主程序在跑。第三看管理页。浏览器访问http://服务器IP:2000用WEB_USER/WEB_PASS登录 Supervisor 页面在这里可以实时看每个进程的状态、点开日志、手动重启比在命令行里翻日志直观得多。从服务端到客户端DNF 私服频道配置与网关对接的最后一公里服务端跑通只是上半场下半场是让客户端连上来。这里最容易忽略的一点服务端和客户端是对暗号的关系IP、密钥、版本号三样必须完全对齐差一个字符都进不去。项目other/登录器/目录下放了统一的网关管理工具和补丁包客户端侧的对接大致是这么几步把 DOF 补丁里的DNF.toml打开把里面的服务器地址改成你部署时填写的PUBLIC_IP再把DNF.toml、DNF.exe等文件复制到客户端根目录打开统一网关在线管理工具在网关设置里填上网关地址、网关端口 881、登录账号密码和通信密钥然后在登录器设置里配好登录器端口 7600 和登录器版本点击生成登录器把生成的登录器和Config.ini复制回客户端根目录同时记得在 Windows 的 hosts 文件里加上start.dnf.tw的解析统一登录器 5.x 版本必须要这一步否则进不了频道。小贴士登录器版本要和启动命令里的GM_LANDER_VERSION一致否则客户端会提示登录器版本过期。灰频道、连不上网关DNF 私服搭建常见翻车现场我第二次部署时遇到频道列表一片灰点哪个频道都没反应排查了半天最后发现是云服务商的安全组没放行 UDP 端口。这里把项目 README 里高频问题做个汇总帮你少走弯路灰频道或进不去频道优先检查 Linux 防火墙是否关闭、云厂商安全组端口是否放行、PUBLIC_IP是否填对Windows 客户端要能访问到这个地址、hosts 是否配置、公钥私钥文件是否匹配一直卡在Init DataManager日志循环内存或 swap 不足把 swap 调到 10G 以上并同步调大--shm-size统一网关连不上数据库数据库对外端口是 3000 而不是 3306用户名用 root密码是DNF_DB_ROOT_PASSWORD的值日志里出现GeoIP Fail拦截记录这是 GEO 区域拦截找到被拦的 IP把它加进geo_allow白名单表再重启服务即可项目文档里给了现成的 SQL。这些坑基本都有同一个根因容器里服务是通的但门没给外面打开。所以排查时永远从端口能不能从外部访问开始比看日志更高效。当玩家变多多频道、多大区与站库分离如果只是自己单机研究默认配置就够了。但当你想拉几个朋友一起玩或者研究更接近生产环境的架构项目提供了完整的升级路径而且每个阶段都有现成的部署文件多频道在OPEN_CHANNEL里追加频道编号每个频道对应一组 TCP/UDP 端口。参考deploy/dnf/docker-compose/multi_channel/docker-compose.yaml它演示了同时开放 1、6、7 三个频道时的端口规划。多大区DNF 台服架构里大区有对应的代号和数据库——1 号卡恩cain、2 号狄瑞吉diregie、3 号希洛克siroco。通过SERVER_GROUP和SERVER_GROUP_DB环境变量切换。项目甚至提供了三台服务器分别跑三个大区deploy/dnf/docker-compose/multi_server_group/下的cain.yaml、diregie.yaml、siroco.yaml以及一台机器合并跑三个大区combine_server_group.yaml的完整方案。站库分离默认 MySQL 在容器内部想要数据库独立出来可以参考deploy/dnf/docker-compose/standalone_mysql/docker-compose.yaml把数据库拆成独立容器游戏服务通过MYSQL_HOST、MYSQL_PORT连过去。再往上deploy/dnf/k8s-deploy/目录下还准备了 Kubernetes 部署方案里面有命名空间脚本、MySQL StatefulSet、持久化存储和 Service 配置00-1开始一定要看前期准备.md里写清楚了集群、NFS 这些前置条件。把 DNF 服务端跑在 K8s 上听起来有点奢侈但如果你本来就在研究容器编排这反而是一份很完整的练手样例。还能怎么玩插件和等级补丁服务端跑稳之后项目还有两个可以折腾的方向。一个是插件。plugin/目录下有几个现成的dnf-console提供一个 Web 控制台默认 8088 端口可以在浏览器里管理by-gate是另一个网关实现8188 端口70s2_dp和dp2是数据包处理增强插件。用法统一得很把压缩包和.conf文件复制到容器挂载目录的conf.d下映射对应端口重启容器即可。另一个是等级补丁。other/等级补丁/目录按 50、60、70、80、85、90、95、99 分好了等级档位每个目录里是配套的DNFHelper.dll和df_game_r。想调整等级上限就选对应目录把文件换进服务端同时保证客户端用相同版本注意 PVF 必须是未加密的否则登录会报请重新安装 Init。下一步行动建议如果你想动手试试我的建议路径是先在一台内存 4G 以上的机器上按deploy/dnf/docker-compose/basic/docker-compose.yaml的配置跑通单频道PUBLIC_IP填本机局域网 IP用局域网内的另一台电脑做客户端验证跑通之后再逐步加频道、试多大区配置。想研究完整源码和所有部署文件可以git clone https://gitcode.com/gh_mirrors/dnf/dnf到本地慢慢看。最后留两个思考题给你其一如果目标是 100 人同时在线你会怎么规划CLIENT_POOL_SIZE、OPEN_CHANNEL和服务器内存之间的关系其二把游戏服务端容器化的思路能不能迁移到你正在维护的其他古董级业务系统上想清楚这两点你从这个项目里收获的就远不止一个能玩的游戏服务端了。【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考