背景
最近发现了一个 Docker 化的 DNF 服务端项目:
https://github.com/1995chen/dnf这个仓库把 DNF / DOF 服务端封装成 Docker 镜像,通过 Docker 容器、环境变量和挂载目录完成快速部署。
这篇文章记录一下我在阿里云 ECS 上从零部署到可以进入游戏的完整过程。
服务器信息
我先登录阿里云服务器,将服务器系统更换为新系统。
本次使用的 ECS 配置如下:
CPU & 内存:2 核 2GB
公网地址:39.105.29.15
操作系统:Alibaba Cloud Linux 4 LTS 64 位 容器优化版Alibaba Cloud Linux 4 的主要包管理器是 dnf/yum,和 Ubuntu / Debian 系统常见的 apt 不一样。
一、初始化系统环境
进入新系统后,先安装一些常用命令行工具和开发工具。
我安装了:
git
zsh
oh-my-zsh
zsh 插件
Docker / Moby其中 git、zsh、oh-my-zsh 是为了日常操作方便,Docker 是运行 dnf 容器必须的环境。
Alibaba Cloud Linux 4 容器优化版推荐使用 Moby / Docker 兼容运行时,安装完成后需要确认 Docker 服务正常:
docker --version
systemctl status docker --no-pager如果 Docker 没有启动,可以执行:
sudo systemctl enable --now docker由于服务器只有 2GB 内存,所以还需要配置 swap。否则服务端初始化时可能因为内存不足导致五国不出、进程被系统杀掉等问题。
二、拉取 dnf-docker 镜像
我拉取的是阿里云国内仓库里的镜像:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos5-2.1.9.fix1拉取完成后可以查看镜像:
docker images | grep dnf本次实际使用的镜像是:
registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos5-2.1.9.fix1三、创建数据目录
根据仓库 README 的快速开始说明,先创建容器需要挂载的数据目录:
sudo mkdir -p /data/log /data/mysql /data/data
sudo chmod -R 755 /data目录用途大致如下:
/data/log 游戏服务端日志
/data/mysql MySQL 数据
/data/data PVF、DP、补丁、密钥、配置等数据需要注意的是,容器启动后 /data 目录下会生成一些账号、密码、密钥、配置等信息,后续不要随便公开这个目录的截图或文件内容。
四、配置启动变量
启动容器前,先配置环境变量。
export PUBLIC_IP="39.105.29.15"
# 网页日志监控 / Supervisor 管理页面的账号密码
export WEB_USER="YPJCoding"
export WEB_PASS="xxxxx"
# MySQL root 用户密码
export DNF_DB_ROOT_PASSWORD="xxxxx"
# 网关账号和密码
# 注意:GM_PASSWORD 不建议使用特殊符号,最好只用英文和数字
export GM_ACCOUNT="YPJCoding"
export GM_PASSWORD="xxxxx"
# 客户端连接池大小
export CLIENT_POOL_SIZE="10"
# 使用的镜像
export IMAGE="registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos5-2.1.9.fix1"这里有几个注意点:
PUBLIC_IP 要填写服务器公网 IP。
WEB_USER / WEB_PASS 是 Supervisor 网页管理页面账号密码。
DNF_DB_ROOT_PASSWORD 是 MySQL root 密码。
GM_ACCOUNT / GM_PASSWORD 是生成网关 / 登录器时会用到的账号密码。
GM_PASSWORD 不要用特殊符号,避免登录器兼容问题。实际执行命令时,变量值两边要使用英文半角引号 ",不要使用中文弯引号。
五、启动 Docker 容器
如果之前已经创建过同名容器,可以先删除旧容器。
注意:这里只删除容器,不删除 /data,所以数据目录会保留。
sudo docker rm -f dnf 2>/dev/null || true然后启动容器:
sudo docker run -d \
-e PUBLIC_IP="$PUBLIC_IP" \
-e WEB_USER="$WEB_USER" \
-e WEB_PASS="$WEB_PASS" \
-e DNF_DB_ROOT_PASSWORD="$DNF_DB_ROOT_PASSWORD" \
-e GM_ACCOUNT="$GM_ACCOUNT" \
-e GM_PASSWORD="$GM_PASSWORD" \
-e CLIENT_POOL_SIZE="$CLIENT_POOL_SIZE" \
-v /data/log:/home/neople/game/log:Z \
-v /data/mysql:/var/lib/mysql:Z \
-v /data/data:/data:Z \
-p 2000:180 \
-p 3000:3306/tcp \
-p 7600:7600/tcp \
-p 881:881/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=2 \
--memory=2g \
--memory-swap=-1 \
--shm-size=8g \
--name=dnf \
"$IMAGE"启动后查看容器状态:
sudo docker ps如果容器状态是 Up,说明容器已经启动。
六、查看初始化日志
服务端是否启动成功,主要看是否跑出“五国”。
实时查看初始化日志:
tail -f $(find /data/log -name "Log$(date +%Y%m%d).init" | head -n 1)如果日志中出现类似下面的内容,基本说明服务端初始化成功:
GeoIP Allow Country Code : CN
GeoIP Allow Country Code : HK
GeoIP Allow Country Code : KR
GeoIP Allow Country Code : MO
GeoIP Allow Country Code : TW(CN)也就是常说的“五国”。
这一步完成后,说明 dnf-docker 服务端已经正常启动。
七、阿里云安全组配置
这次我为了方便测试,在阿里云安全组里默认开放了全部端口。
不过这个做法只适合临时测试,正式使用不推荐。
后续建议只开放必要端口:
TCP: 22
TCP: 2000
TCP: 3000
TCP: 7600
TCP: 881
TCP: 7001
UDP: 7001
TCP: 30011
UDP: 31011
TCP: 30052
UDP: 31052
TCP: 7300
UDP: 7300
UDP: 2311-2313其中管理类端口建议只允许自己的公网 IP 访问:
22 SSH
2000 Supervisor 管理页面
3000 MySQL游戏相关端口再按需要开放给玩家。
八、容器启动后的数据
容器启动成功后,/data 目录下会生成一些配置和账号密码相关文件。
可以进入目录查看:
ls -lah /data
ls -lah /data/data这里面包含服务端运行需要的数据、补丁、DP、PVF、密钥等内容。
修改这些内容前,建议先备份:
sudo tar -czf /root/dnf-data-backup-$(date +%Y%m%d-%H%M%S).tar.gz /data九、客户端选择
我这次使用的客户端是:
清风 1031 最终版这个客户端默认的 DNF.exe 是 0725 版本。
也可以把 DNF.exe 替换成 DOF 大合集 7.6 版本,但这样会缺少清风客户端里已经修复好的一些功能,所以最终还是按实际兼容性取舍。
简单理解:
1031 / 0725 / 0627 这类数字一般是客户端或补丁批次。
20180307 是网关 / 登录器配置里的版本号。这几个不是同一个概念。
十、替换 DP2 和上传 Script.pvf
服务端跑起来之后,我又下载了 DP2 的压缩包。
操作方式是直接替换容器挂载目录里的 DP 目录:
/data/data/dpDP2 的配置理论上无需额外修改。
然后把 Script.pvf 上传到:
/data/data修改 DP 或 PVF 之前,建议先备份原目录:
sudo cp -a /data/data/dp /data/data/dp.backup.$(date +%Y%m%d-%H%M%S)
sudo cp -a /data/data/Script.pvf /data/data/Script.pvf.backup.$(date +%Y%m%d-%H%M%S) 2>/dev/null || true替换完成后,重启容器:
docker restart dnf重启后再次看初始化日志,确认五国正常。
十一、生成登录器
接着下载网关工具,根据服务端生成的信息填写配置。
主要配置包括:
网关地址:服务器公网 IP
网关端口:881
登录器端口:7600
登录器版本:20180307
通信密钥:根据服务端配置填写
GM 账号:GM_ACCOUNT
GM 密码:GM_PASSWORD填写完成后生成登录器。
然后把生成的登录器复制到游戏客户端根目录。
客户端根目录里还需要确认相关配置文件中的 IP 地址和服务器公网 IP 一致,比如:
DNF.toml
登录器配置
hosts 配置如果 IP、端口、密钥、登录器版本不一致,可能会出现灰频道、无法连接网关、点击频道无反应、接收频道信息失败等问题。
十二、最终结果
完成以上步骤后,服务端可以正常跑出五国,客户端可以通过生成的登录器进入游戏。
目前测试结果:
可以进入游戏
可以组队
可以 PK整体部署流程完成。
常用维护命令
查看容器状态:
docker ps查看容器日志:
docker logs -f --tail=200 dnf查看初始化日志:
tail -f $(find /data/log -name "Log$(date +%Y%m%d).init" | head -n 1)重启服务:
docker restart dnf停止服务:
docker stop dnf启动服务:
docker start dnf进入容器:
docker exec -it dnf bash查看资源占用:
docker stats dnf经验总结
这次部署最关键的几个点:
1. 系统要使用 x86_64,不要用 ARM。
2. 2GB 内存必须配置 swap。
3. Docker 镜像、PVF、DP、客户端补丁、登录器版本要尽量匹配。
4. PUBLIC_IP 必须填写公网 IP。
5. 阿里云安全组端口必须放行。
6. GM_PASSWORD 不要使用特殊符号。
7. 修改 /data/data 里的 DP、PVF、密钥前一定要备份。
8. 跑出五国基本代表服务端启动成功。这次最终使用的是:
服务端镜像:
registry.cn-hangzhou.aliyuncs.com/1995chen/dnf:centos5-2.1.9.fix1
服务器:
Alibaba Cloud Linux 4 LTS 64 位 容器优化版
客户端:
清风 1031 最终版
PVF:
Script.pvf 上传到 /data/data
DP:
替换为 DP2最终实现了阿里云 ECS 上部署 dnf-docker,并成功进入游戏。