5步搭建DNF私服完整指南:Docker容器化部署地下城与勇士服务器实战
5步搭建DNF私服完整指南Docker容器化部署地下城与勇士服务器实战【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf如果你一直想拥有一台属于自己的《地下城与勇士》私服但又苦于传统端游服务端繁琐的编译、依赖、进程配置那么gh_mirrors/dnf/dnf这个开源项目就是为你准备的答案。它把整套 DNF 服务端打包进 Docker 镜像通过环境变量和初始化脚本即可快速拉起完整的游戏服务器让 DNF 私服搭建从折腾一整天变成一条命令跑通特别适合学习游戏服务器架构、研究经典端游逻辑的开发者。一、为什么选择容器化方案先想清楚三个问题在动手之前先回答三个新手最常问的问题帮你判断这条路线是否适合你环境兼容性DNF 服务端原本依赖 CentOS 5/6/7 这类老系统直接装很容易被依赖库折腾到崩溃。容器化之后官方以 CentOS 为基础镜像构建理论上可以在任何未修改过的 Linux 上运行ARM 架构除外彻底绕开系统环境地狱。可移植性镜像、数据、日志全部通过挂载目录管理换机器只需要把/data、/var/lib/mysql等目录带走配合docker-compose文件即可秒级恢复。资源可控通过--memory、--cpus、--shm-size等参数可以精确限制服务端资源占用测试机 1G 内存也能跑生产环境按需放大。一句话总结容器化把部署 DNF 私服从一项运维杂活变成了一次可重复、可回滚、可版本化的标准操作。二、先看懂台服架构服务端到底由哪些零件组成动手部署前花三分钟看懂架构图会让你后续排错事半功倍。DNF 台服服务端并非单个进程而是一组通过 TCP/UDP 端口协作的分布式组件核心组件与职责速览Game Serverdf_game_r游戏逻辑核心处理登录登出、地下城副本逻辑、现金购买、创角与等级处理每个频道独占一组 TCP/UDP 端口。Channeldf_channel_r端口 7001从分流中继服务器确认分流情报并把分流信息下发给客户端是玩家进入频道的门卫。Bridgedf_bridge_r端口 7000收集各频道分流信息开/关、在线人数、外挂玩家物品概率、死亡之塔排名等形成分流档案。Relay Server大区 3 对应 7300客户端之间无法 P2P 直连时的中继转发必须暴露外网。Stun Server2311-2313/udpP2P 组队的关键服务通过 UDP Hole Punching 实现 NAT 穿透。Community31100决斗场相关服务记录决斗场登录注销历史。Monitor / Manager监控与消息广播负责服务器认证、踢人下线、活动burning time套用等。DBMWguild/mnt/stat20203-20403三种数据库中间件把游戏组件与 MySQL 解耦。Guild30403、Auction30803、Point30603分别处理公会、拍卖行、点券交易。更详细的端口与连接关系可以参考项目内的 doc/ArchitectureDiagram.md。看完你会发现所谓部署 DNF 私服本质就是把这些进程全部正确拉起并让它们彼此连通。而容器镜像已经帮你把这件事自动化了。三、第一步准备 Linux 环境与基础目录前置条件一台 Linux 服务器云服务器或虚拟机均可已安装 Docker建议内存不低于 2G磁盘预留 20G 以上。项目在 doc/PrepareLinux.md 中提供了完整的服务器初始化指南包括配置 swap 交换空间若内存不足 8G、安装依赖等建议先按文档走一遍。核心步骤是创建三个挂载目录分别存放游戏数据、数据库和日志mkdir -p /data/log /data/mysql /data/data✅ 说明2.1.0 及之后版本在首次启动时会自动初始化 MySQL 数据无需手动导入数据库文件。四、第二步一条 docker run 命令拉起服务端这是整篇文章最核心的一步。镜像选择1995chen/dnf:centos5-2.1.9.fix1当前稳定版启动命令如下docker run -d \ -e PUBLIC_IPx.x.x.x \ -e WEB_USERroot -e WEB_PASS123456 \ -e DNF_DB_ROOT_PASSWORD88888888 \ -e GM_ACCOUNTgmuser -e GM_PASSWORDgmpass \ -e CLIENT_POOL_SIZE10 \ -v /data/log:/home/neople/game/log:Z \ -v /data/mysql:/var/lib/mysql:Z \ -v /data/data:/data:Z \ -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-addNET_ADMIN --hostnamednf \ --cpus1 --memory1g --memory-swap-1 --shm-size8g \ --namednf 1995chen/dnf:centos5-2.1.9.fix1逐项解读这些关键参数参数/变量含义建议PUBLIC_IP对外 IP公网部署填公网 IP局域网填内网 IP必须正确客户端要能访问到它GM_ACCOUNT/GM_PASSWORD网关管理员账号密码建议修改不能含特殊字符DNF_DB_ROOT_PASSWORDMySQL root 密码启动时自动修改外网访问数据库用它WEB_USER/WEB_PASSSupervisor 管理页账号密码默认 root/123456建议修改CLIENT_POOL_SIZE客户端缓冲池大小3-1000单机测试可设 3人多按需加大--shm-size8g共享内存大小不可删除Docker 默认 64M 太小会导致启动失败--memory1g --cpus1资源限制部分阉割系统不支持报错时可去掉端口映射速查为什么是这些端口2000:180Supervisor 进程监控页面3000:3306MySQL对外暴露为 3000不是 33067600统一登录器端口881统一网关端口7001Channel 频道服务TCPUDP7300Relay 中继服务TCPUDP希洛克大区30011/31011频道 11 的 TCP/UDP 端口30052/31052频道 52 的 TCP/UDP 端口2311-2313/udpStun 穿透服务如果你不想手敲这么长的命令也可以直接用项目自带的 compose 文件deploy/dnf/docker-compose/basic/docker-compose.yaml就是最精简的配置模板把PUBLIC_IP改成你的地址docker-compose up -d即可。群晖 NAS 用户尤其推荐这种方式。五、第三步三招确认服务端真的跑起来了镜像启动后不能急着连客户端先做三项检查① 看五国初始化日志进入/data/log/siroco11目录执行tail -f Log$(date %Y%m%d).init当看到GeoIP Allow Country Code : CN/HK/KR/MO/TW(CN)以及Connect To Guild Server、Connect To Monitor Server等输出时说明初始化成功。四国/五国初始化大约需要 1 分钟左右请耐心等待。② 看游戏进程ps -ef | grep df_game如果看到./df_game_r siroco11 start、./df_game_r siroco52 start这样的进程说明频道服务已拉起。③ 看 Supervisor 管理页浏览器访问http://PUBLIC_IP:2000用WEB_USER/WEB_PASS登录可以实时查看每个进程状态、在线 Tail 日志、手动重启相当于给服务端装了一个可视化控制台。⚠️ 进程被系统杀掉很常见该服务内存占用较大极可能被 OOM 干掉。恢复命令很简单docker restart dnf。六、第四步客户端配置——网关、补丁与登录器服务端就绪后剩下的是客户端侧的三件套客户端本体、DOF 补丁、统一网关。项目在other/登录器/目录下提供了配套资源流程如下安装 DOF 补丁解压DOF补丁大合集V7.6后编辑其中的DNF.toml把服务器地址改为你填写的PUBLIC_IP保存后把DNF.toml、DNF.exe、说明文件一起复制到游戏客户端根目录。配置统一网关打开统一网关在线管理工具 v6.4在网关设置页填写——网关地址PUBLIC_IP、网关端口881、登录账号gmuser、登录密码gmpass、通信密钥763WXRBW3PFTC3IXPFWH、登录器端口7600点击参数设置内容立刻生效。生成登录器切到登录器设置页服务器名称随意登录器版本填20180307游戏地址填 PUBLIC_IP通信密钥同上点击增加后再点生成登录器。启动游戏把生成的登录器与Config.ini复制到客户端根目录运行即可首次登录记得先注册账号。默认网关信息汇总部署时若未修改则如下网关端口: 881 通讯密钥: 763WXRBW3PFTC3IXPFWH 登录器版本: 20180307 登录器端口: 7600 GM账户: gmuser GM密码: gmpass 经验之谈Windows7 下请用管理员权限运行网关Windows10 则相反不要用管理员权限统一登录器 5.x 版本需要在客户端 hosts 中添加start.dnf.tw否则进不了频道。七、第五步按需定制——多频道、站库分离与多大区基础版默认只开 11、52 两个频道。当你需要承载更多玩家或做更复杂的拓扑时项目提供了由浅入深的部署矩阵多频道扩容通过OPEN_CHANNEL环境变量指定频道列表如1,6,7并在ports中为每个频道补充对应的 TCP/UDP 端口。参考deploy/dnf/docker-compose/multi_channel/docker-compose.yaml。频道端口遵循固定规律大区 N 的频道 chTCP 端口为N00chUDP 端口为N10ch例如希洛克频道 6 对应 30006/31006。站库分离数据库单独跑一个容器游戏容器通过MYSQL_HOST、MYSQL_PORT、DNF_DB_ROOT_PASSWORD指向远程库。配置模板在deploy/dnf/docker-compose/standalone_mysql/docker-compose.yaml适合把 MySQL 独立出来统一管理的场景。多大区部署项目内置 6 个大区代号——1 卡恩cain、2 狄瑞吉diregie、3 希洛克siroco、4 普雷prey、5 卡西利亚斯casillas、6 赫尔德hilder。通过SERVER_GROUP指定大区编号默认 3通过SERVER_GROUP_DBcain让 GM 工具兼容卡恩数据库。既可以用deploy/dnf/docker-compose/multi_server_group/下的cain.yaml、diregie.yaml、siroco.yaml在多台服务器分别跑各大区也可以用combine_server_group.yaml在单台机器上同时开三个大区。Kubernetes 生产级部署deploy/dnf/k8s-deploy/目录提供了从 namespace、MySQL StatefulSet、存储卷到 Service 的完整 YAML 清单其中05-dnf-server-new.yaml定义了 Deployment通过 emptyDirmedium: Memory8Gi解决共享内存问题。K8s 路线适合需要滚动更新、持久化存储和服务发现的生产环境配套说明见 doc/Kubernetes.md 与目录内的开始一定要看文档。⚠️ 升级提醒2.1.7 版本引入多大区功能后调整了端口——10011→30011、11011→31011、10052→30052、11052→31052、7200→7300。旧版本升级需新增SERVER_GROUP_DBcain并删除 data 目录下的旧运行数据PVF、登记补丁、密钥等除外。八、性能调优与资源控制要点内存是 DNF 私服的生命线。以下几个参数直接影响稳定性CLIENT_POOL_SIZE客户端缓冲池大小直接影响df_bridge_r和df_channel_r两个进程的内存占用。默认 10单机测试可调到 3上限 1000。旧版本升级后若发现这两个进程仍占 1.3G删除挂载目录中的/data/run/start_bridge.sh和/data/run/start_channel.sh再重启即可生效只需删一次。--shm-size内存不足 2G 时可尝试降到 2g 或 1g但不要低于极限。服务器一直卡在Init DataManager日志循环几乎都是 swap 不足——建议把 swap 设到 10G 以上并同步调整--shm-size10g。没有固定公网 IP 怎么办项目提供了三级备选方案AUTO_PUBLIC_IPtrue自动获取公网 IP云服务器可用重启需自己写检测脚本或开启 DDNSDDNS_ENABLEtrueDDNS_DOMAIN还可以接入 Netbird/Tailscale 虚拟内网所有客户端需加入同一虚拟网络。等级补丁方面other/等级补丁/目录内置了 50 到 99 共 11 档补丁每个目录含DNFHelper.dll与df_game_r更换时务必保证 PVF 未加密且与服务端版本配套。九、常见问题速查表把社区里被问得最多的坑整理成一张速查表遇到问题先对号入座症状优先排查方向服务端不出五国内存/swap 是否足够、磁盘空间、PVF 是否加密、--shm-size是否过小灰频道或点不进去Linux 防火墙、云厂商安全组端口、客户端 hosts、PUBLIC_IP 是否可达、公钥私钥是否匹配登录器卡在连接网关五国是否跑出、881 端口是否放通、通信密钥格式是否正确无法连接数据库外网请用 3000 端口非 3306game 用户默认禁止外网请用 root 账号被 GeoIP 拦截断线从频道日志找到拦截 IP执行insert into d_taiwan.geo_allow values (IP, *, 2016-04-09 23:53:04);添加白名单新建角色键盘无法输入客户端问题Win10 用系统自带英文输入法或换 Dof7.6 补丁生成网关提示非法字符默认账号gmuser/gmpass含下划线与 6.x 网关不兼容改用 5.x 网关或换账号密码插件方面项目在plugin/目录提供了dnf-consoleWeb 控制台、by-gate自定义网关以及 70s2_dp、70s2_dp_enhance、dp2 等数据包处理插件需镜像版本 ≥ 2.1.4.fix1按各目录内 README 操作即可。注意服务端默认已内置 DP无需额外挂载。十、写在最后从搭建到真正玩起来到这里你已经走完了从环境准备、镜像启动、五国验证、客户端接入到多频道/多大区扩展的完整链路。回顾整个流程最关键的三个决策点分别是PUBLIC_IP 填对客户端能否连上、端口全部放通防火墙 云安全组、shm-size 给足服务端能否稳定启动。把这三件事做对你的 DNF 私服就已经成功了一大半。接下来可以按这个路线继续进阶先单机跑通基础版 → 用 compose 固化配置 → 尝试多频道和站库分离 → 最后挑战多大区或 K8s 部署。项目后续还计划支持假人系统与更多登录器插件值得持续关注。需要说明的是该项目虽支持外网部署但请仅用于学习与研究目的切勿用于商业开服。祝你在 DNF 服务端的世界里玩得开心八百勇士冲【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考