Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

llnut/dnf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

362 Commits

Repository files navigation

地下城与勇士容器版本

CI Docker Hub ghcr.io quay.io ACR license

概述

本项目基于 1995chen/dnf 适配 清风-1031 版本,将地下城与勇士(毒奶粉、DNF、DOF)打包为 Docker 镜像,支持单镜像部署和端库分离部署,支持 Debian 13Almalinux 9Ubuntu 26CentOS 7 四种基础镜像,通过环境变量和初始化脚本实现快速部署。

部署前须知


快速开始

第一步:准备 Linux 环境

参考以下指南完成服务器初始化。镜像支持 x86_64 架构的 Linux 系统。

初始化 Linux 服务器

第二步:启动服务端

# 创建目录,保存游戏数据、PVF、日志等,这里以 /data 为例
mkdir -p /data/log /data/mysql /data/data
# 启动服务
# PUBLIC_IP 公网 IP 地址,局域网部署则填局域网 IP
# DNF_DB_ROOT_PASSWORD mysql root 密码,容器启动时会自动将 root 密码修改为此值
# GATE_AES_KEY dnf-gate-server AES 通讯密钥,需与登录器配置一致,可通过 openssl rand -hex 32 生成
# --memory=1g 限制容器使用 1G 物理内存,可根据实际情况适当增加
# --shm-size=1g 【不可删除】docker 默认 64M 太小,必须增大才能保证运行
# 注意:镜像名中的 debian13 应与上一步拉取的版本一致
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

第三步:确认服务端启动成功

服务端启动约 1 分钟,首次初始化或低配硬件可能更久。启动完成后,容器日志中会出现每个已开启的频道的就绪日志:

docker logs dnf

若出现所有已开启频道的就绪日志,即代表启动成功:

s6-rc: info: service game_siroco11 successfully started
s6-rc: info: service game_siroco52 successfully started

若长时间未出现上述日志,可参考常见问题 22 排查问题。

第四步:配置客户端

下载客户端:百度网盘,提取码:sora,下载后解压。

1. 设置登录器

  • 打开游戏根目录中的 dnf-launcher.exe
  • 点击下方的 设置 按钮,进入设置界面:
    • 服务器地址:http://${PUBLIC_IP}:5505(启用 HTTPS 则为 https://${PUBLIC_IP}:5504),PUBLIC_IP 与第二步中 PUBLIC_IP 的值保持一致
    • AES 密钥:与第二步中 GATE_AES_KEY 的值保持一致
  • 滚动到底部,点击保存

2. 开始游戏

返回登录器首页,创建账号并登录游戏。


重启服务

服务占用内存较大,可能被 OOM 杀死。重启命令:

docker restart dnf

或单独重启某个服务:

docker exec dnf s6-svc -r /run/service/<service-name>

从旧版本升级

升级到替换了 llnut 登录器 0.2.1 的版本(镜像发布时间 2026年3月8日)

拉取并重启最新镜像后,需重新下载本仓库提供的 20260308 版本客户端并完成登录器设置

升级到 llnut 登录器 0.3.0 的版本(镜像发布时间 2026年3月26日)

拉取并重启最新镜像后,可通过以下任一方式更新客户端:

  • 重新下载本仓库提供的 20260326 版本客户端
  • 下载 20260308-to-20260326-升级补丁.7z,解压并覆盖到 20260308 版本的客户端目录中

新版客户端不再需要手动配置 mlpz.ini,游戏服务器 IP 由登录器自动从服务端获取。

升级到 release-20260618 版本(镜像发布时间 2026年6月18日)

拉取并重启最新镜像后,需重新下载本仓库提供的 20260618版本客户端并完成登录器设置

注意,此版本服务端变化较大,自定义脚本等文件将被备份到相同目录中,请自行确认是否需要调整以适配新版镜像。未修改过容器自带脚本的用户可忽略此提示。

从 CentOS 7 切换到 Debian 13 / Alma 9 / Ubuntu 26 镜像

Debian 13、Alma 9、Ubuntu 26 三种镜像之间可以直接切换,无需迁移数据。

CentOS 7 使用 MySQL 5.0,与其它三种镜像使用的 MySQL 5.7 不兼容,不能直接更换镜像。需要用内置的 db-tool 命令备份旧库数据再导入新库。操作方式如下(以下路径请按实际情况填写):

  1. 自行启动 Centos 7 容器,待服务端启动完成后备份数据库:

    docker exec dnf db-tool backup
  2. 关闭并删除 CentOS 7 容器,将 /data/mysql 目录改名(相当于清空数据库):

    docker stop dnf && docker rm dnf
    mv /data/mysql /data/mysql.centos7.bak
  3. 启动 Debian 13 / Alma 9 / Ubuntu 26 镜像,等待服务端启动成功。

  4. 将备份的 Centos 7 数据恢复到新容器:

    # 先确认恢复计划是否正确
    docker exec dnf db-tool restore
    # 确认无误后,使用 DB_RESTORE_CONFIRM=yes 执行恢复动作
    docker exec -e DB_RESTORE_CONFIRM=yes dnf db-tool restore
  5. 重启容器,让服务端重新加载恢复后的数据:

    docker restart dnf

高级部署

项目支持以下部署模式:

  • 一体部署:单容器包含游戏服务端和数据库,参考快速开始
  • 端库分离:游戏服务端与数据库 分别部署在独立容器中,便于数据库独立管理、备份和资源隔离。
  • 多频道 / 多大区:单容器开多个频道,或在单台/多台服务器上同时运行多个大区。
  • Kubernetes:基于 K8s 部署服务端。

点击查看详细文档


常见问题

1.点击网关登录,没反应,不出游戏(请透过Garena+执行)

  • A: 无法使用虚拟机Console、VNC等访问Windows。
  • A: WIN+R输入dxdiag检查显示-DirectX功能是否全部开启。

2.服务端不出五国

  • A: 机器内存不够,swap未配置或配置后未生效,通过free -m查看swap占用内存
  • A: 服务器磁盘空间是否足够
  • A: 如果更换过PVF,请确保PVF是未加密的,而且需要同步更换对应的等级补丁
  • A: 机器内存低于2G可以尝试修改--shm-size=2g或1g
  • A: swap占用为0,通过free -m查看swap使用率,通过sysctl -p查看设置是否正确,设置正确依旧swap占用为0,需要重启服务器。

3.镜像运行报错

  • A: 尝试更换其他镜像
  • A: 部分阉割系统可能不支持--cpus, --memory, --memory-swap, --shm-size尝试去除这些配置

4.设置登录器AES密钥时报错:"配置无效: AES key must be exactly 64 hex characters"

  • A: AES密钥长度错误,请仔细检查密钥内容

5.设置登录器AES密钥时报错:"配置无效: AES key must contain only hex characters (0-9, a-f, A-F)"

  • A: AES密钥格式错误,请仔细检查密钥内容

6.点击登录后报错: "网络错误: error sending request for url ...."

  • A: 设置界面服务器地址设置错误
  • A: 服务端网关启动失败,请用 docker exec dnf tail -f /data/log/llnut_gate/current 检查是否有报错信息
  • A: 防火墙未开放网关端口(http端口默认为5505,https端口默认为5504)

7.灰频道或频道点击无法进入

  • A: 检查Linux服务端防火墙是否关闭
  • A: 检查云服务器厂商相关端口是否放开
  • A: 客户端windows是否配置hosts
  • A: PUBLIC_IP是否填错,windows需要能够访问到这个配置的PUBLIC_IP
  • A: 若使用Dof7.6补丁需要检查DNF.toml中的IP是否为服务端PUBLIC_IP
  • A: 公钥私钥文件是否匹配

8.点击登录后报错(请重新安装Init)

  • A: PVF加密错误,需要重新加密PVF
  • A: 若使用Dof7.6补丁,需要恢复成未加密PVF

9.接收频道信息失败

  • A: 检查Linux服务端防火墙是否关闭
  • A: 检查云服务器厂商相关端口是否放开
  • A: 五国未成功跑出
  • A: 若使用原版清风2026年2月1日的客户端,请更换本项目提供的清风客户端

10.如何启用dnf-gate-server的https支持

  • A: 将ssl证书和私钥放置在/data目录中,之后设置容器的GATE_TLS_CERT_PATHGATE_TLS_KEY_PATH环境变量为正确的证书和私钥路径,重启容器即可

11.新建角色键盘无法输入

  • A: 与客户端有关,部分客户端没优化好会出现这个问题
  • A: windows7下需要用管理员权限运行启用中文输入法程序(可以加群问群友),或使用系统自带英文输入法
  • A: windows10需要使用系统自带的英文输入法
  • A: 使用Dof7.6补丁

12.如何挂载DP

  • A: 不需要挂载DP,默认已经使用DP

13.没有固定公网IP

  • A: 环境变量AUTO_PUBLIC_IP 可以启动容器时自己获取公网ip,自动重启的话需要自己写脚本去检测并重启容器
  • A: 客户端使用统一网关登录器+DOF7补丁,支持域名配置;统一补丁貌似不能用域名

14.无法连接数据库

  • A: 外网访问数据库端口默认为3000端口,不是3306
  • A: game用户默认无法外网访问,请使用root账号和root密码连接数据库

15.服务器一直卡在Init DataManager日志循环

  • A: 内存或者swap不足,可以将swap设置为10g或更大(对应docker run参数--shm-size=10g同时调整)
  • A: swap占用为0,通过free -m查看swap使用率,通过sysctl -p查看设置是否正确,设置正确依旧swap占用为0,需要重启服务器。参考 这里 进行设置

16.配置了CLIENT_POOL_SIZE之后发现df_bridge_rdf_channel_r内存占用依然都为1.3GB

  • A: 若您是从旧版本升级而来,请先删除docker挂载目录中的/data/run/start_bridge.sh/data/run/start_channel.sh,之后重启服务端即可生效(只需删除一次即可,后续启动服务端无需再次删除)。

17.游戏内包括角色职业,游戏公告等很多处地方显示乱码

  • A: 若您使用Dof补丁大合集,请编辑其配置文件,将简体PVF设置为1

18.游戏内按 Z 键无法释放技能

  • A: 游戏默认关闭了 Z 键位,请打开游戏键位设置重新设置 Z 技能。

19.更换其他登录器后无法连接频道

  • A: 为了提升安全性,本项目没有内置任何公开的游戏公私钥,而是在初次部署时生成全新的公私钥。若需要使用其他内置了私钥的登录器,可以手动获取其公钥或通过此网盘链接下载旧版本公私钥并替换到/data目录中,网盘提取码为sora。注意,使用公开的公私钥时,一旦泄露了服务端的PUBLIC_IP,攻击者即可在不知道游戏账号密码的前提下随意游玩您服务端任意账号下的任意游戏角色,请务必谨慎。

20.使用3.26及之后的客户端版本,使用补丁大合集无法启动游戏

  • A: 按照补丁大合集文档中标注的正确安装方式进行安装,即:拷贝 DNF.exe 与 DNF.toml 到游戏目录,删除游戏目录中除了补丁大合集本体、文件夹、audio.xml、Script.pvf、登录器以外的所有文件。

21.升级 Docker (或安装最新 Docker) 后很多服务频繁重启,日志显示 Could not create a UDP socket : 38

  • A: Docker 29 版本默认 seccomp 策略变更导致服务端创建 UDP socket 失败。可使用 seccomp=unconfined 快速解决(安全隐患大,不建议使用)。推荐使用 v0.2.1 版本的seccomp profile 启动容器,在宿主机下载兼容版 profile:
sudo curl -fsSL https://raw.githubusercontent.com/moby/profiles/refs/tags/seccomp/v0.2.1/seccomp/default.json \
 -o /etc/docker/seccomp-profile-v0.2.1.json

如果使用 docker compose,在 dnf 服务中加入以下配置,然后重新启动容器:

security_opt:
 - seccomp=/etc/docker/seccomp-profile-v0.2.1.json

如果使用 docker run,启动参数中加入 --security-opt seccomp=/etc/docker/seccomp-profile-v0.2.1.json 后启动容器即可。

22.服务端长时间未出现 game_sirocoXX successfully started

  • A: 查看进程,对应频道的 df_game_r 进程存在即代表频道已启动:
docker exec dnf ps -ef | grep df_game
root ... ./df_game_r siroco11 nofork
root ... ./df_game_r siroco52 nofork

之后查看频道 .init 日志。启动成功后会出现五国日志:

docker exec dnf sh -c 'tail -n 20 /home/neople/game/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 ...
  • A: 查看服务状态与日志:
# 查看正在运行的服务
docker exec dnf s6-rc -a list
# 查看 11 频道状态
docker exec dnf s6-svstat /run/service/game_siroco11
# 查看 11 频道日志
docker exec dnf tail -f /data/log/game_siroco11/current

与 1995chen/dnf 的环境变量和端口区别

新增环境变量(llnut/dnf 特有)

环境变量 默认值 说明
GATE_AES_KEY a1b2c3d4e5f678901234567890123456
7890abcdef0123456789abcdef012345
dnf-gate-server AES 通讯密钥,需与登录器配置一致
GATE_BIND_ADDRESS 0.0.0.0:5505 dnf-gate-server HTTP 监听地址
RSA_PRIVATE_KEY_PATH /data/privatekey.pem RSA 私钥路径
INITIAL_CERA 1000 新账号初始点券
INITIAL_CERA_POINT 0 新账号初始代币券
GATE_RUST_LOG info,dnf_gate_server=debug dnf-gate-server 日志级别
GATE_TLS_CERT_PATH TLS 证书路径,与 GATE_TLS_KEY_PATH 同时设置时启用 HTTPS
GATE_TLS_KEY_PATH TLS 私钥路径
GATE_TLS_BIND_ADDRESS 0.0.0.0:5504 dnf-gate-server HTTPS 监听地址
GATE_TLS_ONLY false 启用后仅允许 HTTPS 连接,拒绝 HTTP 请求
GATE_REGISTRATION_OPEN true 是否开放新用户注册,设为 false 时网关拒绝注册请求
GAME_SERVER_IP PUBLIC_IP 游戏服务器 IP,当网关与游戏服务端不在同一台机器时需单独配置

移除环境变量(1995chen/dnf 特有)

环境变量 原默认值 说明
WEB_USER root supervisor 管理页面账号
WEB_PASS 123456 supervisor 管理页面密码
GM_ACCOUNT gmuser GM 账号
GM_PASSWORD gmpass GM 密码
GM_CONNECT_KEY 763WXRBW3PFTC3IXPFWH GM 通讯密钥
GM_LANDER_VERSION 20180307 登录器版本

端口变化

用途 llnut/dnf 1995chen/dnf
登录服务 HTTP 5505 7600(统一登陆器)、881(统一网关)
登录服务 HTTPS 5504(可选,启用 TLS 后开放)

DNF 台服架构图

点击查看 DNF 台服架构图


沟通交流

QQ 1群:852685848(已满)

QQ 2群:418505204(已满)

QQ 3群:954929189(已满)

QQ 5群:738105518(已满)

QQ 6群:933010289

QQ 7群:971177373

欢迎各路大神加入。一起完善项目,成就当年梦,800万勇士冲!

(群内没有任何的收费项目)

社区

libhook.so优化CPU占用源码:https://godbolt.org/z/EKsYGh5dv
DofSlim优化服务端内存占用源码:https://github.com/llnut/DofSlim
Sorahk多功能高性能连发程序: https://github.com/llnut/Sorahk
dnf-loginllnut登录器: https://github.com/llnut/dnf-login
dnf-compat-layer新版linux镜像兼容层: https://github.com/llnut/dnf-compat-layer

申明

虽然支持外网,但是千万别拿来开服。只能拿来学习使用!!!
虽然支持外网,但是千万别拿来开服。只能拿来学习使用!!!
虽然支持外网,但是千万别拿来开服。只能拿来学习使用!!!

🤝 特别感谢

特别感谢清风和原作者 1995chen 以及 QQ 交流群各位热心人士对本项目的支持。以下是 1995chen 的话,也是我想说的话:

作为一位开源库的作者,我要衷心感谢所有支持和贡献给我项目的人。您的热情参与和无私奉献让这个项目变得更加强大和有意义。没有您的支持,这个项目将无法取得如此巨大的成功。

感谢您无私分享您的时间、知识和技能,让我们能够共同推动开源社区的发展。您的贡献不仅仅是对我个人的支持,更是对整个开源精神的认可和传承。

在未来的道路上,我将继续努力改进和完善这个项目,以回报您的支持与信任。希望我们能够继续保持联系,共同见证这个项目的成长与发展。

再次感谢您的支持与帮助!

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /