从零搭建自己的DNF私服:一条docker run命令搞定容器化服务器部署
从零搭建自己的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_USERroot \ # 进程管理页面账号默认root -e WEB_PASS123456 \ # 进程管理页面密码上线前务必改 -e DNF_DB_ROOT_PASSWORD88888888 \ # 内置MySQL的root密码 -e GM_ACCOUNTgmuser \ # 统一网关登录账号 -e GM_PASSWORDgmpass \ # 统一网关登录密码 -e CLIENT_POOL_SIZE10 \ # 客户端缓冲池单人玩可调小到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穿透服务 --hostnamednf --cpus1 --memory1g --memory-swap-1 \ --shm-size8g \ # ← 这一行绝对不能删 --namednf 1995chen/dnf:centos5-2.1.9.fix1命令里的--shm-size8g是保命参数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_r和df_channel_r分配缓冲池直接影响这两个进程各占 1.3G 还是更少。多人玩再按人数调大上限 1000。2. 学会看日志结构。日志目录按频道分文件夹每个频道里同时有init初始化、log运行、error、money等多种日志。遇到问题先看对应频道的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_HOST、MAIN_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 镜像包掉了——这就是容器化部署最直观的价值。接下来想继续深入推荐按这个顺序走先把服务架构说明读一遍搞清楚 bridge、channel、relay、stun 各自干什么——排查网络问题时会非常有用熟悉PUBLIC_IP:2000的进程管理页面把重启服务看日志这些日常操作练顺手需要多人联机或对外发布时再研究多频道、多大区的配置并务必改掉所有默认密码最后提醒一句这个项目官方明确声明只能拿来学习使用千万别拿来开服。把它当成理解游戏服务器架构、练习容器化部署的教材是它最好的打开方式。玩得开心也玩得合规。【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考