如何10分钟部署DNF私服:llnut/dnf快速开始教程,从docker run到登录游戏
如何10分钟部署DNF私服:llnut/dnf快速开始教程,从docker run到登录游戏
想在自己的服务器上运行一个地下城与勇士(DNF)私服?开源项目 llnut/dnf 将 DNF 清风-1031 版本完整打包成 Docker 镜像,内置 MySQL 数据库,一条 docker run 命令即可启动游戏服务端、网关和登录服务,全程约 10 分钟就能从部署走到登录游戏。本文面向新手,带你完成 DNF 私服 Docker 部署的完整流程:安装 Docker、启动容器、配置登录器、进入游戏。
💡 上图为 DNF 服务端各进程(Game Server、Channel、Stun、Relay、Guild 等)与数据库的关系,来自 doc/ArchitectureDiagram.md。
为什么选择 llnut/dnf 部署DNF私服
- 单镜像一体化:游戏服务端 + MySQL 5.7 打包在一个镜像里,无需单独装数据库
- 支持多种基础系统:Debian 13、AlmaLinux 9、Ubuntu 26、CentOS 7 四款镜像任选
- 开箱即用:内置 llnut 登录器网关、自动初始化脚本、定时任务(数据库自动备份、清理 core dump 等)
- 部署方式灵活:单容器、端库分离、多频道多大区、Kubernetes 均支持,详见 doc/OtherDeploy.md
部署前准备:安装 Docker 并配置服务器
部署目标是 x86_64 架构的 Linux 服务器,建议内存 8GB 以上(内存不足时配置 Swap)。完整步骤参考 doc/PrepareLinux.md,核心操作如下:
一键安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
systemctl enable docker && systemctl restart docker
关闭防火墙与 SELinux(私服必须开放大量端口)
systemctl disable firewalld && systemctl stop firewalld
setenforce 0
内存不足 8GB 时配置 Swap
/usr/bin/fallocate --length 8GiB /var/swap.1 || /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=8000
mkswap /var/swap.1 && swapon /var/swap.1
echo '/var/swap.1 swap swap default 0 0' >> /etc/fstab
⚠️ 若使用 Docker 29 及以上版本,需提前配置 seccomp 兼容规则,否则服务端会报
Could not create a UDP socket : 38并启动失败,方法见 doc/PrepareLinux.md。
拉取DNF私服镜像
普通玩家只需拉取 full 层完整镜像(游戏服务端 + 内置 MySQL)。中国大陆用户若拉取慢,可改用阿里云 ACR 加速地址,各仓库地址说明见 doc/PrepareLinux.md:
# Docker Hub(示例:Debian 13 基础镜像)
docker pull llnut/dnf:debian13-qf1031-latest
一条 docker run 启动DNF私服服务端
先创建数据目录,保存游戏数据、PVF 和日志:
mkdir -p /data/log /data/mysql /data/data
然后执行启动命令(PUBLIC_IP 填你的公网 IP,局域网部署则填局域网 IP):
docker run -d \
-e PUBLIC_IP=x.x.x.x \
-e DNF_DB_ROOT_PASSWORD=88888888 \
-e GATE_AES_KEY=a1b2c3d4e5f6789012345678901234567890abcdef0123456789abcdef012345 \
-v /data/log:/home/neople/game/log \
-v /data/mysql:/var/lib/mysql \
-v /data/data:/data \
-p 3000:3306/tcp \
-p 5505:5505/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-add=NET_ADMIN \
--hostname=dnf --cpus=1 \
--memory=1g --memory-swap=-1 --shm-size=1g \
--name=dnf \
llnut/dnf:debian13-qf1031-latest
关键参数速查表
| 参数 | 说明 |
|---|---|
PUBLIC_IP |
服务端对外 IP,客户端要能访问到它 |
DNF_DB_ROOT_PASSWORD |
MySQL root 密码,启动时自动生效 |
GATE_AES_KEY |
网关 AES 通讯密钥,必须 64 位十六进制字符,可用 openssl rand -hex 32 生成 |
--shm-size=1g |
不可删除,Docker 默认 64M 太小会导致服务端无法运行 |
--memory=1g / --cpus=1 |
资源限制,可按硬件适当调大 |
OPEN_CHANNEL(可选) |
只开启指定频道,如 OPEN_CHANNEL='11,52',低配机器推荐 |
确认启动成功:查看容器日志
服务端启动约 1 分钟,首次初始化或低配硬件会更久。执行:
docker logs dnf
当看到已开启频道的就绪日志即代表成功:
s6-rc: info: service game_siroco11 successfully started
s6-rc: info: service game_siroco52 successfully started
如果长时间卡住,可查看进程与频道日志排查,详见 README.md 常见问题 22。
配置登录器并登录游戏
从 README.md 的网盘链接下载客户端并解压,然后:
- 打开登录器:运行游戏根目录中的
dnf-launcher.exe - 进入设置(点击登录器下方的"设置"按钮):
- 服务器地址:
http://${PUBLIC_IP}:5505(启用 HTTPS 则为https://${PUBLIC_IP}:5504),PUBLIC_IP与启动容器时填写的值一致 - AES 密钥:填与
GATE_AES_KEY相同的值
- 服务器地址:
- 滚动到底部点击保存,返回首页创建账号,即可登录游戏 🎮
常见问题快查
| 症状 | 排查方向 |
|---|---|
| 点击登录报"网络错误" | 服务器地址填错 / 网关启动失败 / 5505 端口未放行 |
| AES 密钥报错 | 必须是 64 位十六进制字符(0-9、a-f) |
| 频道无法进入 | 检查 Linux 防火墙、云厂商安全组、hosts 配置 |
卡在 Init DataManager 循环 |
内存或 Swap 不足,调大 --shm-size |
日志报 Could not create a UDP socket : 38 |
Docker 29+ 需配置 seccomp 兼容 profile |
更完整的 20+ 条问题解答见 README.md 常见问题章节。
进阶玩法与延伸阅读
- 多频道 / 多大区:单容器开多频道或多台服务器跑多大区,配置示例见 deploy/dnf/docker-compose/multi_channel/docker-compose.yaml
- Docker Compose 部署:完整 compose 文件在 deploy/dnf/docker-compose/basic/docker-compose.yaml,支持
restart: always自动拉起 - Kubernetes 部署:全套清单见 deploy/dnf/k8s-deploy/
- 端库分离、性能调优、数据库备份恢复:doc/OtherDeploy.md
🔒 服务占用内存较大,可能被 OOM 杀死,重启只需
docker restart dnf。项目声明本镜像仅用于学习,请勿用于公开开服。
