本帖最后由 zhajx 于 2026-5-28 17:17 编辑
下面是markdown文档,下载文件也有,按照步骤,先部署服务器,然后本地客户端使用,使用统一网关生成器来生成适配自己公网的客户端
统一网关下载
链接:https://pan.baidu.com/s/1Ea80rBlPQ4tY5P18ikucfw?pwd=bbd0 提取码:bbd0 Dof7补丁下载
链接:https://pan.baidu.com/s/1rxlGfkfHTeGwzMKUNAbSlQ?pwd=ier2 提取码:ier2
如果还有不明白自接把我这份文档喂给它,给他服务器ip,然后服务器源码是在https://github.com/1995chen/dnf这个项目里面,实际部署只需要镜像就行了
# 1995chen/dnf 部署流程
本文档记录一次已跑通的 `1995chen/dnf` 服务端部署流程。公网地址统一写成 `<你的服务器公网IP>`,部署时替换为自己的服务器公网 IP。
适用目标:
- Docker 部署 DNF 服务端
- 使用 `1995chen/dnf:centos7-latest`
- 使用已准备好的部署资料包
- 开放 11、52 两个频道
- Web 管理页使用 `2001`
- 网关端口使用 `881`
- 登录端口使用 `7600`
部署资料包示例:
```text
dnf86\
├─ Script.pvf
├─ df_game_r
├─ 客户端压缩包.zip / .7z / .rar
├─ DNF工具或登录器工具.zip
├─ 版本说明.txt
├─ 活动图片.png
└─ 其他说明文件
```
文件名不要求完全一致,但必须能找到这三个核心文件:
```text
Script.pvf
df_game_r
客户端压缩包
```
其中:
- `Script.pvf`:服务端和客户端共用的 PVF,必须一致。
- `df_game_r`:服务端游戏服程序,必须放到服务器 `/data1995/data/`。
- `客户端压缩包`:给玩家本地解压使用,文件名可以自定义。
## 1. 服务器要求
最低能启动:
- 2 核 4G
- swap 8G+
- 磁盘 40G+
推荐实际游玩:
- 4 核 8G 起步
- swap 8G+
- 磁盘 60G+
2 核 4G 能进游戏,但服务端 CPU 和内存会很紧,进图、切图可能卡顿。
## 2. 安装 Docker
CentOS / Alibaba Cloud Linux 可参考:
```bash
yum install -y docker
systemctl enable docker
systemctl start docker
docker version
```
如果服务器已经装好 Docker,跳过本节。
## 3. 准备目录
```bash
mkdir -p /data1995/log
mkdir -p /data1995/mysql
mkdir -p /data1995/data
```
目录用途:
- `/data1995/log`:游戏日志
- `/data1995/mysql`:MySQL 数据
- `/data1995/data`:PVF、网关配置、密钥等服务端数据
## 4. 拉取镜像
```bash
docker pull 1995chen/dnf:centos7-latest
```
## 5. 上传部署包里的服务端文件
在本地资料包目录里找到:
```text
Script.pvf
df_game_r
```
上传到服务器:
```powershell
$Server = "<你的服务器公网IP>"
$Key = "$HOME\.ssh\dnf_server_rsa"
$PackDir = "D:\你的dnf86资料包目录"
scp -i $Key "$PackDir\Script.pvf" root@$Server:/data1995/data/Script.pvf
scp -i $Key "$PackDir\df_game_r" root@$Server:/data1995/data/df_game_r
```
如果不用 SSH key,也可以使用密码:
```powershell
scp "D:\你的dnf86资料包目录\Script.pvf" root@<你的服务器公网IP>:/data1995/data/Script.pvf
scp "D:\你的dnf86资料包目录\df_game_r" root@<你的服务器公网IP>:/data1995/data/df_game_r
```
上传后在服务器执行:
```bash
chmod 777 /data1995/data/Script.pvf
chmod 777 /data1995/data/df_game_r
ls -lh /data1995/data/Script.pvf /data1995/data/df_game_r
sha256sum /data1995/data/Script.pvf /data1995/data/df_game_r
```
注意:
- 必须在首次启动容器前放好这两个文件。
- 如果容器已经启动过,替换这两个文件后需要重新创建容器或至少重启服务端。
- `Script.pvf` 和 `df_game_r` 要来自同一个版本包,不要混用。
## 6. 启动容器
先把下面命令里的 `<你的服务器公网IP>` 换成自己的公网 IP。
```bash
docker run -d \
-e PUBLIC_IP=<你的服务器公网IP> \
-e SERVER_GROUP_DB=cain \
-e WEB_USER=root \
-e WEB_PASS='dnf@2026' \
-e DNF_DB_ROOT_PASSWORD='dnfdb@2026' \
-e GM_ACCOUNT=gmuser \
-e GM_PASSWORD=gmpass \
-e GM_CONNECT_KEY=763WXRBW3PFTC3IXPFWH \
-e GM_LANDER_VERSION=20180307 \
-e CLIENT_POOL_SIZE=3 \
-v /data1995/log:/home/neople/game/log \
-v /data1995/mysql:/var/lib/mysql \
-v /data1995/data:/data \
-p 2001:180/tcp \
-p 3001:3306/tcp \
-p 7600:7600/tcp \
-p 881:881/tcp \
-p 7000:7000/tcp -p 7000:7000/udp \
-p 7001:7001/tcp -p 7001:7001/udp \
-p 7200:7200/tcp -p 7200:7200/udp \
-p 7300:7200/tcp -p 7300:7200/udp \
-p 10011:10011/tcp -p 11011:11011/udp \
-p 10052:10052/tcp -p 11052:11052/udp \
-p 30011:10011/tcp -p 31011:11011/udp \
-p 30052:10052/tcp -p 31052:11052/udp \
-p 2311-2313:2311-2313/udp \
--cap-add=NET_ADMIN \
--hostname=dnf \
--cpus=2 \
--memory=3g \
--memory-swap=-1 \
--shm-size=8g \
--restart unless-stopped \
--name=dnf1995 \
1995chen/dnf:centos7-latest
```
说明:
- `PUBLIC_IP` 必须是服务器公网 IP。
- `CLIENT_POOL_SIZE=3` 适合低配服务器和少人测试。
- 同时映射了 `10011/10052` 和兼容的 `30011/30052`。
- 容器内实际游戏服监听的是 `10011/10052` TCP、`11011/11052` UDP。
- `30011/30052` 只是额外映射到同一组游戏端口,方便兼容部分登录器/配置。
## 7. 云防火墙/安全组放行端口
至少放行:
| 端口 | 协议 | 用途 |
| --- | --- | --- |
| 2001 | TCP | Web 管理页 |
| 7600 | TCP | 登录端口 |
| 881 | TCP | 网关端口 |
| 7000 | TCP/UDP | bridge |
| 7001 | TCP/UDP | channel |
| 7200 | TCP/UDP | relay |
| 7300 | TCP/UDP | relay 兼容映射 |
| 10011 | TCP | 11 频道游戏服 |
| 11011 | UDP | 11 频道游戏服 |
| 10052 | TCP | 52 频道游戏服 |
| 11052 | UDP | 52 频道游戏服 |
| 30011 | TCP | 11 频道兼容端口 |
| 31011 | UDP | 11 频道兼容端口 |
| 30052 | TCP | 52 频道兼容端口 |
| 31052 | UDP | 52 频道兼容端口 |
| 2311-2313 | UDP | stun |
如需远程连接 MySQL,再放行:
| 端口 | 协议 | 用途 |
| --- | --- | --- |
| 3001 | TCP | MySQL |
MySQL 端口不建议长期公开给公网。
## 8. 等待服务端完全启动
第一次启动很慢,PVF 和脚本加载大约需要 7 分钟。
查看容器状态:
```bash
docker ps --filter name=dnf1995
```
查看启动日志:
```bash
docker logs -f dnf1995
```
确认核心进程:
```bash
docker exec dnf1995 sh -lc "ps -ef | grep -E 'DnfGate|df_game|df_channel|df_bridge|df_relay|df_stun|secagent|mysql' | grep -v grep"
```
确认端口监听:
```bash
docker exec dnf1995 sh -lc "ss -lntup | grep -E '(:881|:7600|:7000|:7001|:7200|:10011|:11011|:10052|:11052)'"
```
正常应看到:
- `DnfGateServer` 监听 `7600`、`881`
- `df_channel_r` 监听 `7001`
- `df_bridge_r` 监听 `7000`
- `df_relay_r` 监听 `7200`
- `df_game_r` 监听 `10011`、`10052`
- `df_game_r` 监听 UDP `11011`、`11052`
确认游戏服启动成功:
```bash
docker exec dnf1995 sh -lc "grep -n 'server has been started successfully' /home/neople/game/log/siroco11/Log*.init /home/neople/game/log/siroco52/Log*.init"
```
看到类似输出即可:
```text
The siroco11 channel 11('ch.11') server has been started successfully.
The siroco52 channel 52('ch.52') server has been started successfully.
```
## 9. Web 管理页
访问:
```text
http://<你的服务器公网IP>:2001/
```
默认账号:
```text
账号:root
密码:dnf@2026
```
## 10. 生成并保存网关配置
服务端首次启动后,`/data1995/data` 里会有当前网关配置和密钥。客户端需要用到 `Config.ini`。
在服务器上确认:
```bash
ls -lh /data1995/data
docker exec dnf1995 sha256sum /data/Script.pvf /home/neople/game/Script.pvf
```
一般会看到这些文件:
```text
Script.pvf
df_game_r
Config.ini
publickey.pem
privatekey.pem
```
其中:
- `Script.pvf`:来自你的资料包,客户端和服务端必须匹配。
- `Config.ini`:统一网关/登录器配置文件。
- `publickey.pem`、`privatekey.pem`:网关/登录器相关密钥。
- `df_game_r`:来自你的资料包,服务端游戏服程序,客户端不需要。
在 Windows 本地下载服务端生成的 `Config.ini`:
```powershell
$Server = "<你的服务器公网IP>"
$Key = "$HOME\.ssh\dnf_server_rsa"
$ClientDir = "D:\你的DNF客户端目录"
scp -i $Key root@$Server:/data1995/data/Config.ini "$ClientDir\Config.ini"
```
如果没有 SSH key,使用密码登录也可以:
```powershell
scp root@<你的服务器公网IP>:/data1995/data/Config.ini "D:\你的DNF客户端目录\Config.ini"
```
`Script.pvf` 不需要从服务器下载,直接使用资料包里的同一个 `Script.pvf` 覆盖客户端即可。
## 11. 客户端本地文件适配
部署者把资料包里的客户端压缩包解压到本地,例如:
```text
D:\DNF\client-test
```
客户端压缩包文件名可以自定义,例如:
```text
英雄无敌游戏客户端.7z
DNF客户端.zip
查老师DNF-客户端.zip
```
解压后需要确认客户端目录里至少有:
```text
DNF.exe
DNF.toml
Script.pvf
ImagePacks2\
SoundPacks\
Music\
Mp3\
audio.xml
```
### 11.1 替换客户端 Script.pvf
把资料包根目录里的 `Script.pvf` 复制到客户端根目录,覆盖客户端原来的:
```text
D:\DNF\client-test\Script.pvf
```
替换前建议备份客户端原始 PVF:
```powershell
Rename-Item "D:\你的DNF客户端目录\Script.pvf" "Script.pvf.client-original.bak"
Copy-Item "D:\你的dnf86资料包目录\Script.pvf" "D:\你的DNF客户端目录\Script.pvf" -Force
```
客户端和服务端 PVF 不一致时,常见表现:
- 登录后进图闪退
- 加载界面报运行库错误
- 创建角色/进入频道异常
- 物品、技能、地图显示错乱
校验本地 PVF:
```powershell
Get-FileHash "D:\你的dnf86资料包目录\Script.pvf" -Algorithm SHA256
Get-FileHash "D:\你的DNF客户端目录\Script.pvf" -Algorithm SHA256
```
两边 hash 应一致。
服务端校验:
```bash
sha256sum /data1995/data/Script.pvf
docker exec dnf1995 sha256sum /data/Script.pvf /home/neople/game/Script.pvf
```
### 11.2 配置 DNF.toml
客户端目录里的 `DNF.toml` 设置服务器地址:
```toml
"服务器地址" = "<你的服务器公网IP>"
```
本次跑通的配置示例:
```toml
"服务器地址" = "<你的服务器公网IP>"
"角色等级上限" = 95
"一键卖分品级" = 2
"含宠物装备" = 0
"SSS评分开关" = 1
"本地GM开关" = 0
"英雄级开关" = 1
"物品图标开关" = 1
"name2开关" = 1
"品级文本开关" = 1
```
如果用的是 DOF 补丁,通常需要把 DOF 补丁里的:
```text
DNF.exe
DNF.toml
```
复制到客户端根目录。
### 11.3 放入 Config.ini
把第 10 步从服务器下载的 `Config.ini` 放到客户端根目录:
```text
D:\DNF\client-test\Config.ini
```
如果需要手动生成或修改,配置必须和服务端启动参数一致:
```text
服务器公网 IP:<你的服务器公网IP>
网关端口:881
登录端口:7600
GM 账号:gmuser
GM 密码:gmpass
通信 KEY:763WXRBW3PFTC3IXPFWH
登录器版本:20180307
```
`Config.ini` 里不要保留旧服务器 IP,否则会出现:
- 登录器能打开但连不上服务器
- 选频道失败
- 进频道后一直卡住
- 连接服务器失败
## 12. 本地网关/登录器适配
本次跑通的关键配置:
```text
服务器公网 IP:<你的服务器公网IP>
网关端口:881
登录端口:7600
GM 账号:gmuser
GM 密码:gmpass
通信 KEY:763WXRBW3PFTC3IXPFWH
登录器版本:20180307
```
如果使用 1995chen 项目自带的统一网关在线管理工具,常见配置项如下:
```text
首页 / 管理页地址:http://<你的服务器公网IP>:2001/
管理页账号:root
管理页密码:dnf@2026
网关地址:<你的服务器公网IP>
网关端口:881
登录端口:7600
GM 账号:gmuser
GM 密码:gmpass
通信 KEY:763WXRBW3PFTC3IXPFWH
登录器版本:20180307
```
适配步骤:
1. 打开统一网关在线管理工具。
2. 连接服务器管理页:`http://<你的服务器公网IP>:2001/`。
3. 使用 `root / dnf@2026` 登录。
4. 检查网关端口为 `881`。
5. 检查登录端口为 `7600`。
6. 检查通信 KEY 为 `763WXRBW3PFTC3IXPFWH`。
7. 生成或导出登录器配置。
8. 将生成的 `Config.ini` 放到客户端根目录。
注意:
- 登录器工具、补丁、第三方 exe 请只使用你自己信任的来源。
- 如果系统安全组件拦截某个登录器文件,不建议通过关闭安全组件来处理;更稳妥的做法是换用来源明确、可验证的登录器或只分发已确认安全的客户端文件。
- 生成登录器后,最好在一台干净机器上解压测试一次,确认能登录、选角、进频道、进图。
## 13. 最终给玩家的客户端包
给玩家使用时,建议重新整理成一个干净目录,例如:
```text
查老师DNF-客户端\
```
目录里保留:
```text
DNF.exe
DNF.toml
Config.ini
Script.pvf
ImagePacks2\
SoundPacks\
Music\
Mp3\
Fonts\
audio.xml
必要 DLL
启动说明.txt
启动游戏.bat
```
建议排除:
```text
_1995_gateway_tools\
*.bak
*.log
*.tmp
旧 Script.pvf 备份
GM 工具
数据库工具
服务端密钥备份
```
示例启动脚本 `启动游戏.bat`:
```bat
@echo off
cd /d "%~dp0"
if exist "英雄无敌86.exe" (
start "" "英雄无敌86.exe"
exit /b
)
if exist "DNF.exe" (
start "" "DNF.exe"
exit /b
)
echo 没找到启动程序,请确认文件完整解压。
pause
```
打包前建议检查:
```bash
docker exec dnf1995 sha256sum /data/Script.pvf
```
Windows 本地检查:
```powershell
Get-FileHash "D:\DNF\client-test\Script.pvf" -Algorithm SHA256
```
两边 hash 一致,再压缩分发。
推荐最终分发结构:
```text
给玩家的压缩包.zip
└─ 查老师DNF-客户端\
├─ DNF.exe
├─ DNF.toml
├─ Config.ini
├─ Script.pvf
├─ ImagePacks2\
├─ SoundPacks\
├─ Music\
├─ Mp3\
├─ 启动游戏.bat
└─ 启动说明.txt
```
玩家只需要:
1. 解压整个压缩包。
2. 进入客户端目录。
3. 双击 `启动游戏.bat` 或对应登录器。
## 14. 清理默认封禁模板
这个镜像初始化后,默认账号可能带有一条永久封禁模板记录。为了避免新注册账号继承封禁,部署后建议清理一次。
执行:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
DELETE FROM d_taiwan.member_punish_info;
DELETE FROM d_taiwan_secu.member_punish_info;
DELETE FROM d_taiwan.member_punish_hack;
DELETE FROM d_taiwan.user_ban;
DELETE FROM taiwan_login.auto_punish_first_user;
DELETE FROM taiwan_login.auto_punish_second_user;
SQL
```
确认:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
SELECT 'member_punish_info' AS tbl, COUNT(*) AS cnt FROM d_taiwan.member_punish_info
UNION ALL SELECT 'secu_punish_info', COUNT(*) FROM d_taiwan_secu.member_punish_info
UNION ALL SELECT 'member_punish_hack', COUNT(*) FROM d_taiwan.member_punish_hack
UNION ALL SELECT 'user_ban', COUNT(*) FROM d_taiwan.user_ban
UNION ALL SELECT 'auto_punish_first', COUNT(*) FROM taiwan_login.auto_punish_first_user
UNION ALL SELECT 'auto_punish_second', COUNT(*) FROM taiwan_login.auto_punish_second_user;
SQL
```
都为 `0` 即可。
如果某个账号仍提示永久停封,可查:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
SELECT * FROM d_taiwan.member_info ORDER BY m_id DESC LIMIT 20;
SELECT * FROM d_taiwan.member_punish_info ORDER BY m_id;
SQL
```
## 15. 常用账号查询
列出账号:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
SELECT m_id,user_id,state,updt_date,last_play_time
FROM d_taiwan.member_info
ORDER BY m_id DESC
LIMIT 30;
SQL
```
列出角色:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
SELECT charac_no,m_id,charac_name,lev,delete_flag
FROM taiwan_cain.charac_info
ORDER BY charac_no DESC
LIMIT 50;
SQL
```
## 16. 性能检查
查看宿主机负载:
```bash
uptime
free -h
vmstat 1 5
```
查看容器资源:
```bash
docker stats --no-stream dnf1995
```
查看高 CPU 进程:
```bash
ps -eo pid,ppid,pcpu,pmem,comm,args --sort=-pcpu | head -25
```
如果出现:
- CPU 接近 `200%`
- 内存接近容器上限
- swap 使用明显增加
- load average 远高于 CPU 核数
说明服务器资源不足,建议升级到 `4 核 8G` 或更高。
## 17. 常见问题
### 17.1 进频道卡住
先确认游戏服是否完全启动:
```bash
docker exec dnf1995 sh -lc "grep -n 'server has been started successfully' /home/neople/game/log/siroco11/Log*.init /home/neople/game/log/siroco52/Log*.init"
```
再确认端口是否监听:
```bash
docker exec dnf1995 sh -lc "ss -lntup | grep -E '(:10011|:11011|:10052|:11052)'"
```
如果没有启动成功,继续等待几分钟或查看日志:
```bash
docker logs --tail 200 dnf1995
docker exec dnf1995 sh -lc "tail -120 /home/neople/game/log/siroco11/Log*.init"
docker exec dnf1995 sh -lc "tail -120 /home/neople/game/log/siroco52/Log*.init"
```
### 17.2 选角提示永久停封
查封禁表:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
SELECT * FROM d_taiwan.member_punish_info ORDER BY m_id;
SQL
```
清理某个账号,例如 `18000001`:
```bash
docker exec -i dnf1995 mysql -uroot -pdnfdb@2026 --default-character-set=utf8 <<'SQL'
DELETE FROM d_taiwan.member_punish_info WHERE m_id=18000001;
DELETE FROM d_taiwan_secu.member_punish_info WHERE m_id=18000001;
DELETE FROM d_taiwan.member_punish_hack WHERE m_id=18000001;
DELETE FROM d_taiwan.user_ban WHERE m_id=18000001;
DELETE FROM taiwan_login.auto_punish_first_user WHERE m_id=18000001;
DELETE FROM taiwan_login.auto_punish_second_user WHERE m_id=18000001;
SQL
```
### 17.3 客户端提示连接服务器失败
排查顺序:
1. 浏览器访问 `http://<你的服务器公网IP>:2001/`,确认 Web 管理页能打开。
2. 本地测试 TCP 端口:
```powershell
Test-NetConnection <你的服务器公网IP> -Port 881
Test-NetConnection <你的服务器公网IP> -Port 7600
Test-NetConnection <你的服务器公网IP> -Port 7001
Test-NetConnection <你的服务器公网IP> -Port 10011
Test-NetConnection <你的服务器公网IP> -Port 10052
```
3. 检查云安全组是否放行 UDP:
```text
11011/udp
11052/udp
31011/udp
31052/udp
2311-2313/udp
```
4. 检查客户端 `DNF.toml` 和 `Config.ini` 是否仍然写着旧 IP。
### 17.4 客户端进图闪退
优先检查客户端和服务端 `Script.pvf` 是否一致。
服务端:
```bash
docker exec dnf1995 sha256sum /data/Script.pvf
```
本地:
```powershell
Get-FileHash "D:\DNF\client-test\Script.pvf" -Algorithm SHA256
```
如果不一致,用资料包根目录里的 `Script.pvf` 同时确认服务端和客户端。
### 17.5 服务端卡顿
2 核 4G 容易卡。可以临时降低人数和频道数量,但根本解决方式是升级服务器。
推荐:
- 单人测试:4 核 8G
- 多人稳定:8 核 16G
### 17.6 拍卖服务报错
日志中可能出现:
```text
Fail to exec(select count(*) from auction_history). process exits.
```
这表示拍卖相关表缺失。基础登录、选角、进图通常不受影响,可以先忽略。
## 18. 重启/停止
重启:
```bash
docker restart dnf1995
```
停止:
```bash
docker stop dnf1995
```
删除容器但保留数据卷目录:
```bash
docker rm -f dnf1995
```
只要不删除 `/data1995/mysql`、`/data1995/data`、`/data1995/log`,数据库和服务端数据仍在。
## 19. 备份
建议备份:
```bash
tar czf /root/dnf1995-backup-$(date +%Y%m%d-%H%M%S).tar.gz /data1995
```
恢复时先停止容器,再还原 `/data1995`。
|