从零搭建自己的DNF私服:一条docker run命令搞定容器化服务器部署
2026/8/21 3:52:06 网站建设 项目流程

从零搭建自己的DNF私服:一条docker run命令搞定容器化服务器部署

【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf

项目名称:gh_mirrors/dnf/dnf。它做什么:把地下城与勇士(DNF)的整套服务端打包成 Docker 镜像,你用一条命令就能在自己服务器上跑起来。它能给你带来什么:不用再对着几十个依赖包、配置文件、启动脚本发呆——这个项目把过去要折腾几天的部署过程,压缩成了几个环境变量的填写,新手也能在半小时内看到自己的服务器跑出"五国"。

如果你和我一样,是第一次接触游戏服务端这类东西,先把心态放平:这个项目最大的价值不是"教你怎么改游戏数据",而是"让服务先跑起来"。本文会带着你从头走一遍,遇到卡点的地方我会标注出来,因为这些坑我几乎都踩过。

出发前:一台服务器够不够用

这一节要解决的问题:你手上需要有什么,才不会在启动之后才发现缺东西。

先看看你有没有这些"入场券":

  • 一台 Linux 服务器(云主机、虚拟机、群晖 NAS 都可以),ARM 架构的不行,这是项目里明确写过的限制
  • Docker 环境,如果还没装,可以按项目里的Linux服务器初始化指南一步步来
  • 至少 1G 可用内存 + 8G 的 swap 交换空间(后面会解释 swap 为什么重要)
  • 一个能访问到你服务器的公网 IP(局域网联机就填局域网 IP)

关于 swap 多说一句。这是新手最容易忽略的一环。DNF 服务端启动时内存吃得很凶,物理内存不够时系统会杀进程,表现就是"启动到一半自动挂了"。项目文档里给了一段创建 swap 的命令,我第一次部署时直接照抄:

# 创建 8G 的 swap 文件 fallocate --length 8GiB /var/swap.1 mkswap /var/swap.1 swapon /var/swap.1 # 写入开机自启 echo '/var/swap.1 swap swap default 0 0' >> /etc/fstab

创建完用free -m看一眼,Swap 一栏不是 0 就说明生效了。这一步别偷懒,后面"不出五国"的报错,有一半跟它有关。

第一次启动:把"看不懂"的环境变量逐个讲明白

这一节要解决的问题:docker run 那串又长又吓人的命令,到底每段在干什么。

这是项目 README 里的核心启动命令,我给你加上了逐段注释。不用背,照着填就行:

docker run -d \ -e PUBLIC_IP=你的公网IP \ # 客户端要连的IP,填错=连不上 -e WEB_USER=root \ # 进程管理页面账号(默认root) -e WEB_PASS=123456 \ # 进程管理页面密码,上线前务必改 -e DNF_DB_ROOT_PASSWORD=88888888 \ # 内置MySQL的root密码 -e GM_ACCOUNT=gmuser \ # 统一网关登录账号 -e GM_PASSWORD=gmpass \ # 统一网关登录密码 -e CLIENT_POOL_SIZE=10 \ # 客户端缓冲池,单人玩可调小到3 -v /data/log:/home/neople/game/log \ # 日志目录,挂出来方便看 -v /data/mysql:/var/lib/mysql \ # 数据库目录,删容器数据不丢 -v /data/data:/data \ # 游戏数据、PVF等 -p 2000:180 -p 3000:3306/tcp \ # supervisor页面 / MySQL -p 7600:7600/tcp -p 881:881/tcp \ # 统一登录器 / 统一网关 -p 7001:7001/tcp -p 7001:7001/udp \ # 频道服务 -p 30011:30011/tcp -p 31011:31011/udp \ # 频道11的游戏端口 -p 30052:30052/tcp -p 31052:31052/udp \ # 频道52的游戏端口 -p 7300:7300/tcp -p 7300:7300/udp \ # 中继服务 -p 2311-2313:2311-2313/udp \ # NAT穿透服务 --hostname=dnf --cpus=1 --memory=1g --memory-swap=-1 \ --shm-size=8g \ # ← 这一行绝对不能删! --name=dnf 1995chen/dnf:centos5-2.1.9.fix1

命令里的--shm-size=8g保命参数:Docker 默认只给容器 64M 共享内存,而这个游戏服务端需要的远不止这么多,不调大会直接启动失败。项目注释里专门用"【不可删除】"标了出来。

如果你觉得 docker run 太长不直观,仓库里也准备了现成的 compose 文件,改改 IP 就能用:

  • 基础版:deploy/dnf/docker-compose/basic/docker-compose.yaml
  • 多频道版:deploy/dnf/docker-compose/multi_channel/docker-compose.yaml

镜像方面,国内用户建议直接拉阿里云的源,速度快很多:

docker pull registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos7-2.1.9.fix1

等"五国":怎么确认服务真的起来了

这一节要解决的问题:启动之后,你怎么知道它到底成功没有,而不是干等着。

DNF 服务端有个圈内黑话叫"出五国",指的是初始化日志里出现五段GeoIP Allow Country Code记录(CN、HK、KR、MO、TW)。这是服务端初始化成功的标志,也是你判断部署是否顺利的第一个信号。

看日志的方式很简单,进入你挂载的日志目录,tail当天日期的 init 文件:

tail -f /data/log/siroco11/Log$(date +%Y%m%d).init

看到下面这样的输出,就说明服务端核心进程已经活了:

[09:40:23] GeoIP Allow Country Code : CN [09:40:23] GeoIP Allow Country Code : HK [09:40:23] GeoIP Allow Country Code : KR [09:40:23] GeoIP Allow Country Code : MO [09:40:23] GeoIP Allow Country Code : TW(CN) [09:40:32] [!] Connect To Guild Server ... [09:40:32] [!] Connect To Monitor Server ...

如果一直等不到五国怎么办?按优先级排查,我整理成了一张速查表:

现象最可能的原因处理办法
日志卡在Init DataManager循环swap 没配或没生效回看第一节,free -m确认 swap 非 0
进程反复被杀物理内存不够调低--shm-size到 2g 或 1g 再试
日志报错但进程在磁盘满了df -h检查挂载目录空间
换过 PVF 之后不出五国PVF 被加密了换回未加密 PVF,并同步换等级补丁

进程是否存活,也可以直接看:

ps -ef | grep df_game

能看到./df_game_r siroco11 start这样的进程,基本就稳了。再稳一点的做法是打开浏览器访问http://你的IP:2000,用WEB_USER/WEB_PASS登录进程管理页面,所有服务的状态和实时日志都在那里,后面排查问题全靠它。

小提示:服务内存占用大,容易被系统 OOM 杀掉。挂了不用慌,docker restart dnf一条命令重启即可。

客户端那头:还差三步才能进游戏

这一节要解决的问题:服务端跑起来了,你的 Windows 电脑要怎么连进来。

服务端只是半边,客户端还需要配置三样东西,缺一个都进不了频道:

第一步,改 hosts。用管理员身份打开C:\Windows\System32\drivers\etc\hosts,加一行:

你的服务器IP start.dnf.tw

统一登录器 5.x 版本依赖这个域名解析,不加的话会卡在"接收频道信息失败"。我第一次就是漏了这步,在频道列表前卡了半小时。

第二步,配统一网关。仓库的other/登录器/目录下提供了网关工具,打开"网关设置"页签,填:

  • 网关地址:你的 PUBLIC_IP
  • 网关端口:881
  • 登录账号/密码:GM_ACCOUNT / GM_PASSWORD(默认 gmuser / gmpass)
  • 通信密钥:763WXRBW3PFTC3IXPFWH
  • 登录器端口:7600

设置完成后点"生成登录器",把生成的登录器和Config.ini一起复制到游戏根目录。

第三步,装补丁。other/登录器/解压 DOF 补丁,编辑里面的DNF.toml,把服务器地址改成你的 PUBLIC_IP,再把补丁文件覆盖到客户端根目录。

另外提醒一个很反直觉的坑:Windows 7 要用管理员权限运行网关,Windows 10 反而不能用管理员权限运行,否则会点击登录没反应。这是 README 常见问题里专门写过的。

把服务调舒服:内存、日志、频道

这一节要解决的问题:服务能玩了,怎么让它更省资源、更好管,顺便多开几个频道。

1. 内存按需分配。单人自测可以把CLIENT_POOL_SIZE调到 3,服务端会按这个值给df_bridge_rdf_channel_r分配缓冲池,直接影响这两个进程各占 1.3G 还是更少。多人玩再按人数调大,上限 1000。

2. 学会看日志结构。日志目录按频道分文件夹,每个频道里同时有init(初始化)、log(运行)、errormoney等多种日志。遇到问题先看对应频道的error文件,比瞎猜高效得多。

3. 多开频道。想开更多频道,改OPEN_CHANNEL环境变量就行,同时给每个频道配上对应端口。频道和端口的对应关系(比如希洛克大区的 11 频道是 30011/tcp + 31011/udp)在详细部署文档里有完整表格,照着填不会错。已经开好频道模板的可以直接抄多频道 compose 配置。

4. 被 GEO 拦截了?如果玩家连频道时网络中断,大概率是地区限制拦截。日志里会出现类似Fail Account:xxxx, IP:192.168.x.x的记录,把被拦的 IP 加进白名单即可:

insert into d_taiwan.geo_allow values ('被拦截的IP', "*", "2016-04-09 23:53:04");

再进一步:多服务器、多大区与站库分离

这一节要解决的问题:想带更多人玩,或者想体验"一个大区一个服务器"的架构,该怎么升级。

基础版是把数据库和游戏服务装在一个容器里,够用但不灵活。项目针对不同规模提供了几套进阶方案,都在deploy/dnf/docker-compose/下:

场景配置文件说明
数据库独立成容器standalone_mysql站库分离,数据库可单独迁移、备份
一台机器开三个大区combine_server_group卡恩、狄瑞吉、希洛克同时在线
多台机器各跑一个大区cain.yaml 等通过MAIN_MYSQL_HOSTMAIN_BRIDGE_IP等变量互联

这里会用到几个新的环境变量,含义分别是:

  • SERVER_GROUP:大区编号,1=卡恩、2=狄瑞吉、3=希洛克
  • SERVER_GROUP_DB:指定大区数据库(默认 siroco,很多 GM 工具连的是 cain,建议显式指定)
  • MAIN_MYSQL_HOST / MAIN_MYSQL_PORT:主数据库的地址和端口,让多个大区共享一份账号数据
  • MYSQL_HOST / MYSQL_PORT:本大区数据库的地址和端口

想了解每个变量含义的完整清单,直接看环境变量与部署文档,里面还有大区代号映射表和端口规划表,是进阶配置时的必备手册。

另外,项目还支持插件机制,把.tgz.conf文件丢进容器的/data/data/conf.d目录就能生效。比如plugin/dnf-console/里的 Web 控制台插件,装上之后就能在浏览器里管理服务器,适合不习惯敲命令的朋友。

结尾:从"跑起来"到"跑得明白"

回头看你已经完成的事:准备好服务器 → 一条命令拉起容器 → 等到"五国" → 配置客户端进游戏 → 按需调内存、开频道。整个过程中,你真正手工处理的只有环境变量和端口映射,其余复杂的服务编排全被 Docker 镜像包掉了——这就是容器化部署最直观的价值。

接下来想继续深入,推荐按这个顺序走:

  1. 先把服务架构说明读一遍,搞清楚 bridge、channel、relay、stun 各自干什么——排查网络问题时会非常有用
  2. 熟悉PUBLIC_IP:2000的进程管理页面,把"重启服务""看日志"这些日常操作练顺手
  3. 需要多人联机或对外发布时,再研究多频道、多大区的配置,并务必改掉所有默认密码

最后提醒一句:这个项目官方明确声明"只能拿来学习使用,千万别拿来开服"。把它当成理解游戏服务器架构、练习容器化部署的教材,是它最好的打开方式。玩得开心,也玩得合规。

【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询