如何10分钟部署DNF私服:llnut/dnf快速开始教程,从docker run到登录游戏

原创2026-10-26 20:48:511,337 阅读
文章标签:游戏开发云原生DevOps运维

如何10分钟部署DNF私服:llnut/dnf快速开始教程,从docker run到登录游戏

想在自己的服务器上运行一个地下城与勇士(DNF)私服?开源项目 llnut/dnf 将 DNF 清风-1031 版本完整打包成 Docker 镜像,内置 MySQL 数据库,一条 docker run 命令即可启动游戏服务端、网关和登录服务,全程约 10 分钟就能从部署走到登录游戏。本文面向新手,带你完成 DNF 私服 Docker 部署的完整流程:安装 Docker、启动容器、配置登录器、进入游戏。

DNF私服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 的网盘链接下载客户端并解压,然后:

  1. 打开登录器:运行游戏根目录中的 dnf-launcher.exe
  2. 进入设置(点击登录器下方的"设置"按钮):
    • 服务器地址:http://${PUBLIC_IP}:5505(启用 HTTPS 则为 https://${PUBLIC_IP}:5504),PUBLIC_IP 与启动容器时填写的值一致
    • AES 密钥:填与 GATE_AES_KEY 相同的值
  3. 滚动到底部点击保存,返回首页创建账号,即可登录游戏 🎮

常见问题快查

症状 排查方向
点击登录报"网络错误" 服务器地址填错 / 网关启动失败 / 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 常见问题章节。

进阶玩法与延伸阅读

🔒 服务占用内存较大,可能被 OOM 杀死,重启只需 docker restart dnf。项目声明本镜像仅用于学习,请勿用于公开开服。

登录后查看全文
dnf