从零搭建DNF私服:基于Docker容器化的一键部署实战指南

📅 2026/8/21 17:18:09
从零搭建DNF私服:基于Docker容器化的一键部署实战指南
从零搭建DNF私服基于Docker容器化的一键部署实战指南【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf如果你曾经尝试过搭建地下城与勇士DNF的私服大概率体会过那种装到一半就想放弃的滋味要先准备一台干净的Linux服务器手动编译各种依赖拷贝几十个配置文件还得处理版本不对导致的诡异报错。gh_mirrors/dnf/dnf 项目把这些繁琐的步骤全部打包进了一个 Docker 镜像通过环境变量和初始化脚本即可完成服务端的快速部署让今天clone、今天开服测试成为可能。本文将以实战视角带你走完从服务器初始化、容器启动、到客户端成功登录的完整链路。一、先搞清楚这个项目到底替你解决了什么传统方式搭建 DNF 服务端你需要自己解决三件麻烦事环境依赖游戏服务端依赖特定版本的 CentOS 和系统库一旦系统环境有差异各种莫名其妙的崩溃随之而来。服务编排DNF 服务端并非单一进程而是由游戏服、频道、中继、穿透等多个进程协同工作手动启动和监控非常痛苦。初始化数据数据库建库、账号创建、PVF 资源部署每一步都需要人工干预错一步就得重来。gh_mirrors/dnf/dnf 项目以官方 CentOS-5/6/7 为基础镜像将上述所有内容固化到镜像内部对外只暴露一组环境变量。你只需要回答几个问题——公网 IP 是多少、GM 账号密码用什么、开哪几个频道——剩下的交给初始化脚本。项目还内置了 Supervisor 进程管理器所有服务进程的状态、日志、重启操作都能在一个 Web 页面上完成这也是它适合新手入门的关键原因。二、一张图看懂服务端架构那些进程都是干什么的在动手部署之前建议先花两分钟理解服务端的组成否则后面排查问题会像无头苍蝇。项目文档 doc/ArchitectureDiagram.md 中给出了完整的流程图整个服务端可以归纳为四个层次接入与转发层Relay中继当客户端之间无法建立 P2P 直连时负责数据中转需要暴露公网端口希洛克大区为 7300。Stun穿透负责 NAT 穿透UDP Hole Punching是组队功能的关键服务占用 2311-2313 端口。Channel频道向客户端下发分流频道信息端口 7001。核心业务层Game游戏服处理登录登出、地下城逻辑、角色创建、现金购买即你在日志中看到的df_game_r进程。Bridge负责分流信息档案的收集与传送同时统计在线人数等数据。Community / Monitor / Guild / Auction等辅助服务分别处理决斗场、跨服消息、公会、拍卖行等功能。数据层DBMW数据库中间件分为 guild、mnt、stat 三种是游戏逻辑与 MySQL 之间的桥梁。监控层Supervisor统一管理所有进程访问http://IP:2000即可打开管理页面。对于普通使用者你不需要逐一理解每个进程的细节但记住一句话就够了凡是架构图上标注了端口号的组件都需要在防火墙和云厂商安全组中放行。这也是绝大多数灰频道连不上网关问题的根源。三、部署第一步初始化一台合格的Linux服务器项目文档 doc/PrepareLinux.md 列出了三项必须完成的准备工作建议按顺序执行1. 安装 Dockeryum update -y curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh systemctl enable docker systemctl restart docker2. 关闭防火墙重点游戏服务端使用大量 TCP/UDP 端口如果防火墙未关闭即便容器端口映射正确也无法访问systemctl disable firewalld systemctl stop firewalld3. 配置 Swap 交换空间内存不足 8GB 时必须做服务端启动时对内存的需求远超你的想象尤其是Init DataManager阶段内存不够会直接卡死。创建一个 8GB 的 swap 文件/usr/bin/fallocate --length 8GiB /var/swap.1 mkswap /var/swap.1 swapon /var/swap.1 sed -i $a /var/swap.1 swap swap default 0 0 /etc/fstab随后确认sysctl vm.swappiness输出不为 0如果为 0需要在/etc/sysctl.conf追加vm.swappiness 100并执行sysctl -p生效。拉取镜像国内用户推荐从阿里云镜像源拉取速度更快docker pull registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos7-2.1.9.fix1 docker tag registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos7-2.1.9.fix1 1995chen/dnf:centos7-2.1.9.fix1四、最快跑起来一条 docker run 命令完成部署准备工作就绪后先创建三个数据挂载目录用于持久化日志、数据库和资源文件mkdir -p /data/log /data/mysql /data/data然后执行以下命令启动服务将x.x.x.x替换为你的公网 IP局域网测试则填写局域网 IPdocker 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四个必须注意的参数--shm-size8g不可删除。Docker 默认共享内存只有 64M过小会导致服务启动失败。PUBLIC_IP必须填写客户端能访问到的 IP填错会直接表现为灰频道。CLIENT_POOL_SIZE客户端缓冲池大小单人测试可设为 3多人按需增加上限 1000。DNF_DB_ROOT_PASSWORD容器启动时会自动把 MySQL root 密码修改为该值。五、如何确认服务端真的启动成功了这一步很多人会忽略导致后续排查浪费时间。项目给出了三层验证方法第一层看五国日志进入日志目录查看当天的初始化日志tail -f /data/log/siroco11/Log$(date %Y%m%d).init当看到类似下面的输出时说明基础服务已经就绪初始化大约需要 1 分钟请耐心等待[09:40:23] GeoIP Allow Country Code : CN [09:40:23] GeoIP Allow Country Code : HK [09:40:32] [!] Connect To Guild Server ... [09:40:32] [!] Connect To Monitor Server ...第二层确认游戏进程存活ps -ef | grep df_game如果输出中存在./df_game_r siroco11 start这样的进程代表游戏服正常运行。第三层访问 Supervisor 管理页面浏览器打开http://IP:2000默认账号 root / 123456可以看到所有进程的运行状态并支持在线查看日志、重启进程。后续服务被系统杀掉时也可以在这里手动拉起。六、客户端接入网关、补丁与登录器三步走服务端就绪后客户端还需要做三件事。相关工具都收录在 other/登录器 目录中客户端补丁则位于 other/等级补丁。安装 DOF 补丁解压DOF补丁大合集V7.6.7z编辑其中的DNF.toml将服务器地址改为你的PUBLIC_IP然后把DNF.toml、DNF.exe等文件复制到游戏客户端根目录。配置统一网关打开统一网关在线管理工具v6.4.exe在网关设置页填写网关地址为PUBLIC_IP、网关端口 881、登录账号 gmuser、登录密码 gmpass、通信密钥763WXRBW3PFTC3IXPFWH、登录器端口 7600。保存后在登录器设置页生成登录器。放置登录器将生成的登录器及Config.ini复制到游戏根目录双击运行即可。项目默认的网关参数汇总如下如果你修改了环境变量请以实际配置为准配置项默认值说明网关端口881统一网关 TCP 端口登录器端口7600统一登录器端口通信密钥763WXRBW3PFTC3IXPFWH网关与登录器之间的密钥GM 账号 / 密码gmuser / gmpass不能包含特殊字符七、进阶玩法从单机到多频道、多大区的扩展路径当你跑通单机后自然会想扩大规模。项目在 deploy/dnf/docker-compose 目录下提供了四套现成的编排方案覆盖了从入门到生产的各种场景basic基础部署一个容器跑完整服务适合个人测试。multi_channel多频道部署通过OPEN_CHANNEL变量指定开放哪些频道每个频道需要映射对应的 TCP/UDP 端口。standalone_mysql站库分离将 MySQL 独立成容器适合后续迁移。multi_server_group多大区部署支持在一台或多台服务器上同时运行卡恩cain、狄瑞吉diregie、希洛克siroco三个大区。以 basic 方案为例核心配置如下deploy/dnf/docker-compose/basic/docker-compose.yamlversion: 2.3 services: dnf-1: image: 1995chen/dnf:centos5-2.1.9.fix1 environment: - TZAsia/Shanghai - SERVER_GROUP3 - DNF_DB_ROOT_PASSWORD88888888 - GM_ACCOUNTgmuser - GM_PASSWORDgmpass - GM_CONNECT_KEY763WXRBW3PFTC3IXPFWH - GM_LANDER_VERSION20180307 - PUBLIC_IP127.0.0.1 - OPEN_CHANNEL11,52 shm_size: 8g mem_limit: 1g cpu_count: 1 restart: always ports: - 2000:180/tcp - 3000:3306/tcp - 7600:7600/tcp - 881:881/tcp - 7001:7001/tcp - 7001:7001/udp - 7300:7300/tcp - 7300:7300/udp - 30011:30011/tcp - 31011:31011/udp - 30052:30052/tcp - 31052:31052/udp - 2311-2313:2311-2313/udp volumes: - ./data:/data:Z - ./mysql:/var/lib/mysql:Z - ./log:/home/neople/game/log:Z关于大区有两个容易踩坑的知识点大区编号映射1卡恩cain、2狄瑞吉diregie、3希洛克siroco。默认SERVER_GROUP3。数据库兼容市面上的主流 PVF 和 GM 工具大多连接 cain 数据库如果遇到 GM 工具无法使用可额外设置环境变量SERVER_GROUP_DBcain显式指定。如果需要更大规模的部署如 K8s项目在 deploy/dnf/k8s-deploy 目录提供了完整的 StatefulSet、Service 与存储配置建议先阅读00-1开始一定要看前期准备.md与00-2开始一定要看注意事项.md两份文档。八、性能与成本一个人玩和一百个人玩配置差多少服务端的内存占用主要受两个因素影响频道数量和CLIENT_POOL_SIZE。其中df_bridge_r和df_channel_r两个进程各占约 1.3GB 内存这是固定开销CLIENT_POOL_SIZE则决定缓冲池大小直接关系并发能力。参考配置如下场景内存CLIENT_POOL_SIZE建议 shm-size单人测试1G32G~8G小型亲友服2G~4G10~308G大规模开服8G按需调大16G两个高性价比的优化手段调整 swap 优先级文档建议将vm.swappiness设为 100优先使用虚拟内存对个位数玩家的场景几乎无感知差异却能大幅降低物理内存门槛。升级后清理旧脚本如果你从旧版本升级CLIENT_POOL_SIZE不生效时删除挂载目录下的/data/run/start_bridge.sh和/data/run/start_channel.sh后重启即可只需删一次。另外如果你没有固定公网 IP可以设置AUTO_PUBLIC_IPtrue让容器启动时自动获取公网 IP项目还支持 Netbird 和 Tailscale 虚拟组网适合朋友间通过虚拟内网联机。九、踩坑实录五个高频问题的排查手册结合项目 README 与社区反馈这里整理五个最高频的问题全部采用现象→原因→解法的格式建议收藏备用。问题 1服务端一直卡在 Init DataManager 日志循环原因物理内存或 swap 不足进程无法完成数据加载。解法将 swap 扩容到 10G 或更大同时把--shm-size调整为 10g若 swap 占用始终为 0执行sysctl -p后重启服务器。问题 2出现灰频道或点击频道无法进入原因端口不通或 IP 配置错误客户端拿不到游戏服的真实地址。解法依次检查 Linux 防火墙是否关闭、云厂商安全组端口是否放行、PUBLIC_IP是否填错、客户端 hosts 是否配置了start.dnf.tw5.x 登录器需要、公钥私钥文件是否匹配。问题 3点击网关登录没反应不出游戏原因多半是客户端环境问题而非服务端问题。解法Win7 用管理员权限运行网关、Win10 反之不要通过虚拟机 Console/VNC 访问 Windows用dxdiag确认 DirectX 功能全部开启确认客户端补丁已正确覆盖。问题 4登录器提示版本过期原因登录器版本与网关配置不一致。解法在网关登录器设置页将登录器版本设为20180307与GM_LANDER_VERSION一致重新生成登录器。问题 5GEO 拦截导致连接频道时网络中断原因服务端内置了 GeoIP 地区限制你的 IP 不在允许列表。解法从频道日志中找到Fail Account...IP:xxx的拦截记录执行 SQL 添加白名单以 IP 192.168.48.1 为例insert into d_taiwan.geo_allow values (192.168.48.1, *, 2016-04-09 23:53:04);执行后重启服务端生效。更完整的排查清单可参考项目 README 的常见问题部分。十、写在最后能力越大责任越大至此你已经走完了从服务器初始化、容器部署、日志验证到客户端接入的完整流程。这个项目最大的价值是把一个原本需要数天甚至数周的专业运维工作压缩成了几分钟的容器操作——这正是容器化技术的魅力所在。更进一步你还可以通过 plugin 目录挂载 dnf-consoleWeb 控制台、DP 数据包处理等插件或参考 doc/OtherDeploy.md 探索 K8s 生产级部署。最后必须提醒该项目仅用于学习与研究目的。虽然服务端支持外网访问但请勿用于商业开服运营以免侵犯游戏公司的知识产权并触犯相关法律法规。在动手之前建议先阅读项目的 LICENSE 文件明确使用边界。祝你在技术探索的道路上玩得开心也欢迎加入社区 QQ 群933010289 / 971177373与其他爱好者交流共同完善这个项目。【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考