返回列表 发布新帖

[用户教程] 【邪修】在绿联NAS上部署魔兽世界服务器-AzerothCore WotLK

276 7
发表于 2026-6-11 01:16:24 | 查看全部 阅读模式 IP:–河南 /全省通用

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 0001 于 2026-6-11 02:02 编辑

曾经跟大家分享交流过传奇3的docker部署流程,评论区有个用户朋友留言问nas能不能部署魔兽世界服务器?现在补上这个坑。
项目资料:开源框架AzerothCore群晖第三方套件WoWServer_v1.0.52_x64_DMS7.2.spk (WoWServer v1.0.52)
AzerothCore 是一个采用 AGPL v3.0 开源协议的游戏服务器框架,由全球开发者社区共同维护。它不包含任何受版权保护的游戏资源(模型、贴图、音乐等),仅实现了网络通信与游戏逻辑模拟的服务器端功能。)
声明: 本文仅用于技术学习与交流。请遵守当地法律法规及游戏用户协议。本文不提供任何游戏客户端资源的获取方式。
一次在家用 NAS 上部署 Docker 容器化游戏服务端的技术记录,涵盖 Compose 编排、数据库管理、网络配置等实战经验。

本文记录我在绿联 NAS 上通过 Docker 部署该框架的技术过程,涉及容器编排、服务依赖管理、数据库迁移等常见 DevOps 场景,适合对 Docker 和家庭服务器感兴趣的读者参考。

我把项目放到了我的仓库:http://github.com/asm0x1/wow-docker,并打包了镜像推送到了hub docker,可直接拉取。
截屏2026-06-11 00.04.50.png
部署方式我写了两种,一种是给本地用户使用命令行学习使用,另一种我适配了绿联nas docker项目部署方式,给绿联的朋友学习使用docker-compose(先写好的上一种,为了绿联nas的docker-compose限制又返回修改适配,真磨人)
截屏2026-06-09 17.32.25.png
游戏画面
截屏2026-06-10 08.52.29.png 截屏2026-06-10 08.53.07.png 截屏2026-06-10 12.03.59.png 截屏2026-06-10 12.04.03.png 截屏2026-06-10 12.04.22.png 截屏2026-06-11 01.14.28.png 截屏2026-06-11 01.15.16.png
本地部署
本文不做过多介绍,详细文档请查看仓库 README.md。
  1. # 1. 克隆项目到本地
  2. git clone https://github.com/asm0x1/wow-docker.git
  3. cd wow-docker

  4. # 2. 复制 .env 模板并编辑
  5. cp .env.dist .env

  6. # 3. Apple Silicon Mac 必须设置 (Intel Mac 跳过)
  7. export DOCKER_DEFAULT_PLATFORM=linux/amd64

  8. # 4. 启动
  9. docker compose up -d
复制代码

NAS部署
项目结构
采用 Docker Compose 管理多服务依赖,运行时共 4 个容器:
  1. ac-database
  2.     ├─► ac-worldserver (游戏世界)
  3.     ├─► ac-authserver (认证 + realm初始化 + 账户创建)
  4.     │     └─► ac-registration (Web 注册)
  5.     └─► phpmyadmin (可选)
复制代码
截屏2026-06-10 13.29.56.png 截屏2026-06-10 13.30.01.png
技术栈一览:
组件技术
数据库MariaDB 10.11
服务器C++ 编译的 AzerothCore 二进制
WebApache 2.4 + PHP 8.2
容器编排Docker Compose v3
脚本Bash (entrypoint 自动初始化)


部署步骤

1. 准备地图数据
首先需要客户端地图数据(服务端加载世界场景用)。这部分需要自行查阅 AzerothCore 社区文档(AAzerothCore 官方 wiki 的提取教程:https://www.azerothcore.org/wiki/client-setup),使用地图提取工具从游戏客户端(3.3.5a (build 12340))导出。
将提取的数据放入项目目录:
  1. docker/wow/
  2.            └── data/
  3.                       ├── maps/
  4.                       ├── dbc/
  5.                       ├── vmaps/
  6.                       ├── mmaps/
  7.                       └── cameras/
复制代码
地图数据约 2-3GB,不包含在项目仓库中。

2. 复制 docker-compose
将我写好的内容复制到剪贴板
  1. # ============================================
  2. # AzerothCore WotLK 3.3.5a - 绿联 NAS Docker Compose
  3. # 适配: DXP4800 Plus (Intel 8505 x86_64) 及其他绿联 x86 NAS
  4. # Author: asm0x1
  5. # ============================================
  6. #
  7. # 部署方式 (绿联 Docker 管理界面):
  8. #   1. 将此文件内容粘贴到 Docker → 项目 → 新建项目 → Compose 编辑器
  9. #   2. 修改下面「部署配置」中的 REALM_IP 和 DB_ROOT_PASS(各一处)
  10. #   3. 点击「部署」
  11. #
  12. #   所有镜像从 Docker Hub 自动拉取,无需构建。
  13. #   Realm 初始化和账户创建已内置在 authserver 中,不再有一次性容器。
  14. # ============================================

  15. # ============================================
  16. # 部署配置 —— 只需改这里!
  17. # ============================================
  18. x-deploy-config:
  19.   REALM_IP:      &REALM_IP      192.168.1.100   # ← 必改:NAS 的局域网 IP
  20.   DB_ROOT_PASS:  &DB_ROOT_PASS  wow@asm0x1       # 数据库密码(按需修改)

  21. # 以下通常无需修改
  22. x-port-config:
  23.   REALM_PORT:    &REALM_PORT    8085
  24.   DB_EXT_PORT:   &DB_EXT_PORT   63306
  25.   AUTH_PORT:     &AUTH_PORT     3724
  26.   REG_PORT:      &REG_PORT      8765
  27.   SOAP_PORT:     &SOAP_PORT     7878

  28. x-bot-config:
  29.   BOT_MIN_COUNT:     &BOT_MIN_COUNT     15
  30.   BOT_MAX_COUNT:     &BOT_MAX_COUNT     20
  31.   BOT_MIN_LEVEL:     &BOT_MIN_LEVEL     1
  32.   BOT_MAX_LEVEL:     &BOT_MAX_LEVEL     80
  33.   BOT_ALLIANCE_RATIO: &BOT_ALLIANCE_RATIO 50
  34.   BOT_HORDE_RATIO:   &BOT_HORDE_RATIO   50

  35. services:
  36.   # ============================================
  37.   # MariaDB 10.11 数据库
  38.   # ============================================
  39.   ac-database:
  40.     image: mariadb:10.11
  41.     container_name: acore-database
  42.     restart: unless-stopped
  43.     cap_add:
  44.       - SYS_NICE
  45.     ports:
  46.       - "63306:3306"
  47.     environment:
  48.       MARIADB_ROOT_PASSWORD: *DB_ROOT_PASS
  49.       DB_EXT_PORT: *DB_EXT_PORT
  50.     volumes:
  51.       - ac-database-data:/var/lib/mysql
  52.     healthcheck:
  53.       test: '/usr/bin/mariadb --user=root --password=$$MARIADB_ROOT_PASSWORD --execute "SHOW DATABASES;"'
  54.       interval: 5s
  55.       timeout: 40s
  56.       retries: 20
  57.     networks:
  58.       - ac-network

  59.   # ============================================
  60.   # 世界服务器 (从 Docker Hub 拉取)
  61.   # ============================================
  62.   ac-worldserver:
  63.     image: asm0x1/wow-worldserver:latest
  64.     container_name: acore-worldserver
  65.     restart: unless-stopped
  66.     stdin_open: true
  67.     tty: true
  68.     cap_add:
  69.       - SYS_NICE
  70.     ports:
  71.       - "8085:8085"
  72.       - "7878:7878"
  73.     environment:
  74.       DB_PASSWORD: *DB_ROOT_PASS
  75.       REALM_PORT: *REALM_PORT
  76.       SOAP_PORT: *SOAP_PORT
  77.       BOT_MIN_COUNT: *BOT_MIN_COUNT
  78.       BOT_MAX_COUNT: *BOT_MAX_COUNT
  79.       BOT_MIN_LEVEL: *BOT_MIN_LEVEL
  80.       BOT_MAX_LEVEL: *BOT_MAX_LEVEL
  81.       BOT_ALLIANCE_RATIO: *BOT_ALLIANCE_RATIO
  82.       BOT_HORDE_RATIO: *BOT_HORDE_RATIO
  83.     volumes:
  84.       - acore-logs:/opt/wow/logs
  85.       - ./data:/opt/wow/data:ro
  86.     depends_on:
  87.       ac-database:
  88.         condition: service_healthy
  89.     networks:
  90.       - ac-network

  91.   # ============================================
  92.   # 认证服务器 (从 Docker Hub 拉取)
  93.   # 启动时自动完成:Realm IP 初始化 + 默认账户创建
  94.   # ============================================
  95.   ac-authserver:
  96.     image: asm0x1/wow-authserver:latest
  97.     container_name: acore-authserver
  98.     restart: unless-stopped
  99.     stdin_open: true
  100.     tty: true
  101.     ports:
  102.       - "3724:3724"
  103.     environment:
  104.       DB_HOST: ac-database
  105.       DB_USER: root
  106.       DB_PASSWORD: *DB_ROOT_PASS
  107.       REALM_IP: *REALM_IP
  108.       REALM_PORT: *REALM_PORT
  109.       AUTH_PORT: *AUTH_PORT
  110.       DEFAULT_ACCOUNT_USER: ""
  111.       DEFAULT_ACCOUNT_PASS: ""
  112.       DEFAULT_ACCOUNT_GMLEVEL: 3
  113.       DEFAULT_ACCOUNT_EXPANSION: 2
  114.     volumes:
  115.       - acore-logs:/opt/wow/logs
  116.     depends_on:
  117.       ac-database:
  118.         condition: service_healthy
  119.       ac-worldserver:
  120.         condition: service_started
  121.     networks:
  122.       - ac-network

  123.   # ============================================
  124.   # Web 注册页面 (从 Docker Hub 拉取)
  125.   # ============================================
  126.   ac-registration:
  127.     image: asm0x1/wow-registration:latest
  128.     container_name: acore-registration
  129.     restart: unless-stopped
  130.     ports:
  131.       - "8765:80"
  132.     environment:
  133.       REALM_IP: *REALM_IP
  134.       REG_PORT: *REG_PORT
  135.     depends_on:
  136.       ac-authserver:
  137.         condition: service_started
  138.     command: >
  139.       sh -c "
  140.       envsubst '$$REALM_IP' < /var/www/html/application/config/config.php > /tmp/config.php && mv /tmp/config.php /var/www/html/application/config/config.php;
  141.       apache2-foreground
  142.       "
  143.     networks:
  144.       - ac-network

  145.   # ============================================
  146.   # phpMyAdmin (可选管理工具)
  147.   # 取消下面注释即可启用
  148.   # ============================================
  149.   # phpmyadmin:
  150.   #   image: phpmyadmin
  151.   #   ports:
  152.   #     - "8081:80"
  153.   #   environment:
  154.   #     - PMA_ARBITRARY=1
  155.   #     - PMA_HOST=ac-database
  156.   #     - PMA_USER=root
  157.   #     - PMA_PASSWORD=*DB_ROOT_PASS
  158.   #   depends_on:
  159.   #     ac-database:
  160.   #       condition: service_healthy
  161.   #   networks:
  162.   #     - ac-network

  163. networks:
  164.   ac-network:
  165.     driver: bridge

  166. volumes:
  167.   ac-database-data:
  168.   acore-logs:
复制代码

3. 修改并部署
绿联 NAS(Docker → 项目 → 新建项目):
  - 项目名称:wow
  - 项目文件夹:选择步骤 1 创建的目录
  - 将剪贴板内容粘贴到编辑器,修改编辑器顶部修改两个值
  1. x-deploy-config:
  2.   REALM_IP:              &REALM_IP              192.168.1.100         # ← 改成 NAS 的局域网 IP
  3.   DB_ROOT_PASS:     &DB_ROOT_PASS     wow@asm0x1        # 数据库密码,按需修改
复制代码
  项目使用 YAML 锚点(&name / *name)实现配置集中管理——顶部定义一次,下方所有服务自动引用,告别"一处改、处处改"的维护噩梦。
  - 点击
「部署」
其他支持 Docker Compose 的环境(命令行):
  1. docker compose -f nas/docker-compose.yml up -d
复制代码


关键技术细节
容器启动顺序与依赖管理
服务间有严格的启动顺序依赖,通过 depends_on + healthcheck 实现:
  1. ac-worldserver:
  2.    depends_on:
  3.       ac-database:
  4.          condition: service_healthy  # 等待数据库健康检查通过
复制代码

入口脚本 entrypoint-worldserver.sh 在启动时自动完成:
  • 数据库创建(CREATE DATABASE IF NOT EXISTS)
  • 配置文件模板渲染(sed 替换占位符)
  • 数据完整性修复(如缺失路径点的生物自动修正)
  • 模块配置生成

这种 "entrypoint 自动化" 模式避免了手动执行 SQL 脚本的繁琐操作。

NAS 环境的特殊处理

部分 NAS 的 Docker UI 不支持 Compose 的 ${VAR:-default} 变量替换语法。项目采用了锚点 + 直接值的方案,彻底规避此问题:
  1. # ❌ 不可靠的写法(依赖 Compose 解析 .env)
  2. environment:
  3.    REALM_IP: ${REALM_IP:-127.0.0.1}

  4. # ✅ 可靠的写法(锚点引用 + 直接值)
  5. x-deploy-config:
  6.    REALM_IP: &REALM_IP 192.168.1.100

  7. environment:
  8.    REALM_IP: *REALM_IP
复制代码

数据持久化
所有持久数据存储在 Docker 命名卷 ac-database-data 中,包括账户、角色、世界状态等。容器删除后数据依然保留,重新部署自动恢复。
如需完全重置,删除项目时勾选「同时删除卷」。


防火墙配置

确保 NAS 防火墙放行以下端口:
端口协议用途
3724TCP游戏登录认证
8085TCP游戏世界通信
8765TCPWeb 注册页面
常见问题:1.开启了防火墙,禁止了对应IP段连接导致连接服务器失败。2.只放了 3724 而忽略 8085,导致能登录但进不去游戏世界。



日常运维

调整服务参数
编辑 YAML 中 x-bot-config 部分,修改后重新部署:
  1. x-bot-config:
  2.    BOT_MIN_COUNT:     10   # AI 玩家最小在线数
  3.    BOT_MAX_COUNT:     30   # AI 玩家最大在线数查看日志
复制代码
查看日志
命令行环境下:
  1. docker compose -f nas/docker-compose.yml logs -f ac-worldserver
复制代码
绿联 Docker UI:点击容器 → 日志。

更新镜像
  • 删除旧容器和镜像
  • 重新部署,自动拉取最新 asm0x1/wow-* 镜像



踩坑记录

  • Apple Silicon Mac 本地开发:需要 export DOCKER_DEFAULT_PLATFORM=linux/amd64,因为二进制是 x86_64 编译的
  • NAS 上 realmlist 地址错误:客户端能登录但进不去世界——排查发现 REALM_IP 配错了,改对后问题消失
  • 端口没放全:NAS 防火墙容易只放 3724 忽略 8085,导致"能选服不能进"的尴尬



总结

通过这个项目,可以实践以下 Docker/DevOps 技能:
  • 多容器编排:服务依赖、健康检查、启动顺序
  • 配置管理:YAML 锚点、模板渲染、环境变量注入
  • 数据持久化:Docker 卷、数据库备份
  • 网络调试:端口映射、防火墙规则、客户端-服务端通信

对于一个家庭 NAS 来说,这也是检验其性能的好机会——2-3GB 地图数据加载、数百 MB 内存占用、多客户端并发连接,对 CPU 和磁盘 I/O 都是不小的考验。

关于 AzerothCore: 这是一个采用 AGPL v3.0 协议的开源项目,源代码完全公开,不含任何受版权保护的游戏素材。所有代码由社区贡献者出于技术研究目的编写。本项目仅涉及服务端框架的技术部署,使用前请确保你了解并遵守适用的法律、法规及用户协议。


评论7

云深不知处Lv.4绿联NAS社区会员用户 发表于 2026-6-11 09:52:20 | 查看全部 IP:–海南–海口
这能干啥用?
0001楼主Lv.1 发表于 2026-6-11 11:26:36 来自手机 | 查看全部 IP:–河南 /全省通用
云深不知处 发表于 2026-6-11 09:52
这能干啥用?

00后可能觉得毫无用处,但在80后眼里,构建的不是代码,是情怀,是回不去的青春。
绿联NAS私有云Lv.9绿联NAS社区管理员 绿联NAS社区会员用户 发表于 2026-6-11 11:38:09 | 查看全部 IP:–海南–海口
兽人永不为奴😎
绿联NAS产品功能问题回复、产品功能动态更新、产品需求进度更新、产品公测组织相关事项~
云深不知处Lv.4绿联NAS社区会员用户 发表于 2026-6-11 13:18:26 | 查看全部 IP:–海南–海口
0001 发表于 2026-6-11 11:26
00后可能觉得毫无用处,但在80后眼里,构建的不是代码,是情怀,是回不去的青春。 ...

我也玩了几年魔兽世界,不过后来被剑侠三挖走了
0001楼主Lv.1 发表于 2026-6-11 14:53:28 来自手机 | 查看全部 IP:–广东–佛山–高明区
绿联NAS私有云 发表于 2026-6-11 11:38
兽人永不为奴😎

你竟然还知道这个口号
0001楼主Lv.1 发表于 2026-6-11 14:54:10 来自手机 | 查看全部 IP:–广东–佛山–高明区
云深不知处 发表于 2026-6-11 13:18
我也玩了几年魔兽世界,不过后来被剑侠三挖走了

那你的网龄比我大,我只会上窝窝吧聊天
PPWyl0Lv.1绿联NAS社区会员用户 发表于 2026-6-11 15:58:07 | 查看全部 IP:–广东–佛山–高明区
很棒诶,有没有其他版本,想尝试其他的版本

评论

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2026 绿联NAS私有云社区 版权所有 All Rights Reserved. 粤公网安备44030002002555号| 粤ICP备12028978号
关灯 在本版发帖
联系技术支持
返回顶部
快速回复 返回顶部 返回列表