
先说结论:这套方案把服务端放在 NAS Docker 的 Wine 兼容层中运行,Windows 电脑只安装游戏客户端,不需要再建 Windows 虚拟机。NAS 侧的 Docker、MySQL、Nginx、Wine 和端口框架已经完整;剩下唯一必须由你自己补齐的,是权利方合法授权并提供给你的
server/服务端包、数据库与配套文件。
本文区分两条路线:
路线 A(推荐):NAS Docker + Wine,服务端跑在 NAS,Windows 只跑客户端;
路线 B:Windows 原生部署,服务端和客户端都放在 Windows 环境中,适合已经有一台 Windows Server 或 Windows 电脑的人。
注意:本文不提供、也不引导下载任何未经授权的《魔域》服务端、数据库或私服整合包。原版游戏程序和资源受版权保护,请先在权利方完成授权并取得合法文件。
最终架构
Windows 客户端
│
│ 登录、网关、游戏与 Web 端口
▼
NAS /你的Docker目录/moyu
├── moyu-wine Wine 11,运行 ACC、MSG、NPC、Gameserver
├── moyu-mysql MySQL 5.7,保存账号和角色数据
└── moyu-web Nginx,提供 mylist.txt 与补丁列表
Wine 不是虚拟机。它只是 Linux 容器里的 Windows 兼容层,适合运行这类老客户端/服务端程序。容器默认无头运行,不需要 RDP 管理入口。
一、准备条件
硬件与系统
x86_64 NAS,至少 8 GB 内存。
NAS 已安装 Docker / Container Manager,并能使用 SSH 终端。
至少预留 40 GB 空间,具体取决于服务端地图和数据库体积。
Windows 电脑用于运行客户端,建议与服务端处于同一局域网。
唯一不能由教程代替的文件
你需要通过权利方或正式授权渠道取得一套完整 Windows 服务端文件,解压后通常包含:
server/
├── ACCServer/
├── MSGServer/
├── Gameserver/
├── MySQL/ 或 .sql 数据库导出
└── www/ 或 mylist.txt
不要求文件名完全一致,但至少应包含账号服务、消息/地图服务、游戏世界服务和数据库文件。登录器生成器、客户端资源不要混进服务端目录。
二、路线 A:NAS Docker + Wine
1. 上传部署包
先下载本文附带的部署模板:
解压后的顶层目录名为 moyu,上传到 NAS:
mkdir -p /你的Docker目录
cd /你的Docker目录
# 通过 UGOS 文件管理器或 scp 上传压缩包后再解压
unzip moyu-server-headless.zip
cd /你的Docker目录/moyu
最终目录:
/你的Docker目录/moyu/
├── compose.yaml
├── .env
├── scripts/
├── server/
├── web/
├── mysql-init/
└── wine-home/ 空占位,实际 Wine 前缀存放在 Docker 卷
2. 填写环境变量
cd /你的Docker目录/moyu
cp .env.example .env
chmod 600 .env
vi .env
核心配置:
NAS_IP=替换成NAS局域网IP
MYSQL_ROOT_PASSWORD=替换成强密码
USER_UID=1000
USER_GID=1000
LOGIN_PORT=替换成登录端口
GAME_PORT_START=替换成游戏端口起始值
GAME_PORT_END=替换成游戏端口结束值
WEB_PORT=替换成Web端口
MOYU_MODE=config
ACC_EXE=/server/ACCServer/AccountServer.exe
MSG_EXE=/server/MSGServer/MSGServer.exe
NPC_EXE=/server/MSGServer/NPCServer.exe
GAME_EXE=/server/Gameserver/GameServer.exe用 id -u、id -g 查 NAS 登录用户的 UID/GID。四个 *_EXE 路径要在服务端文件上传后再校准。
3. 启动基础环境
chmod 755 scripts/*.sh
docker compose pull
docker compose up -d
docker compose ps正常状态:
moyu-mysql Up (healthy)
moyu-web Up
moyu-wine Up如果数据库首次初始化失败,先看:
docker logs --tail=200 moyu-mysql4. 无头初始化 Wine
docker exec -u wineuser -e HOME=/home/wineuser moyu-wine \
bash -lc '
export WINEARCH=win32
export WINEPREFIX=/home/wineuser/.wine-moyu
export WINEDLLOVERRIDES="mscoree,mshtml="
export WINEDEBUG=-all
mkdir -p "$WINEPREFIX"
xvfb-run -a -s "-screen 0 1024x768x24" wineboot -u
wineserver -k 2>/dev/null || true
wine --version
'看到 wine-11.x 一类版本号即可。Wine 前缀保存在 Docker 卷 moyu-wine-home,不要改用 NAS 共享目录;UGOS 的 ACL 可能让容器用户无法创建前缀。
5. 放入授权服务端
把授权包解压到:
/你的Docker目录/moyu/server先检查目录:
find server -maxdepth 3 -type d | sort再找程序与配置:
find server -maxdepth 4 -type f \
\( -iname '*.exe' -o -iname '*.ini' -o -iname '*.cfg' -o -iname '*.sql' \) \
-printf '%P\n' | sort按照实际结果修改 .env 中的 ACC_EXE、MSG_EXE、NPC_EXE 和 GAME_EXE。不要直接沿用示例文件名。
6. 导入数据库
如果授权包提供的是 .sql 文件:
docker exec -i moyu-mysql \
sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' \
< /你的Docker目录/moyu/server/你的数据库.sql如果提供的是 MySQL 原始 data/ 目录,不要直接热拷贝。先确认原数据库版本,再按对应版本做离线迁移;不同 MySQL 版本的数据目录不能随意互换。
7. 安装 MyODBC 并配置连接
先查找授权包内的 ODBC 安装文件:
find server -type f \( -iname '*odbc*.msi' -o -iname '*connector*.msi' \)以 MyODBC 3.51 为例,无头安装:
docker exec -u wineuser -e HOME=/home/wineuser moyu-wine \
bash -lc '
export WINEARCH=win32
export WINEPREFIX=/home/wineuser/.wine-moyu
xvfb-run -a wine msiexec /i \
/server/你的目录/mysql-connector-odbc-3.51.29-win32.msi /qn
'与数据库连接相关的文件通常出现在 ACCServer/config.ini、account.ini、authorizedb.cfg 或 Gameserver/*.ini 中。搜索:
grep -RniE 'mysql|odbc|database|dbname|serverip|account_ip|port' server \
--include='*.ini' --include='*.cfg' | head -200容器方案中数据库主机名写 mysql,数据库端口使用容器内部端口,账号密码使用 .env 中的 MYSQL_ROOT_PASSWORD。服务端对外地址使用 NAS 的局域网 IP。
8. 修改端口并启动服务端
从 config.ini、shell.ini 和网关配置确认真实端口,然后同步修改 compose.yaml:
ports:
- "${NAS_IP}:${LOGIN_PORT}:${LOGIN_PORT}/tcp"
- "${NAS_IP}:${GAME_PORT_START}-${GAME_PORT_END}:${GAME_PORT_START}-${GAME_PORT_END}/tcp"常见端口含义:
登录端口:客户端进入服务器列表时使用;
网关与游戏端口:角色选择和进入世界时使用;
Web 端口:Nginx 提供
mylist.txt与补丁文件。
端口少开放比多开放安全;只开放配置文件里实际监听的端口。
先保持 MOYU_MODE=config,确认文件路径后修改:
MOYU_MODE=run重新创建容器:
docker compose up -d --force-recreate wine
docker compose logs -f wine无头启动脚本会使用 Xvfb 在后台运行 Wine,不需要 RDP,也不需要保持任何桌面窗口。
三、Windows 客户端
客户端只部署在 Windows 玩游戏的电脑上:
安装与授权服务端版本匹配的客户端。
在登录器里填写 NAS 局域网 IP。
服务器列表地址填写
http://NAS局域网IP:Web端口/mylist.txt。登录端口与网关端口必须和服务端配置一致。
先在 Windows PowerShell 验证网络:
$NAS_IP = "替换成NAS局域网IP"
$LOGIN_PORT = 替换成登录端口
$WEB_PORT = 替换成Web端口
Test-NetConnection $NAS_IP -Port $LOGIN_PORT
Invoke-WebRequest "http://${NAS_IP}:${WEB_PORT}/mylist.txt"局域网能通后,再考虑公网访问。不要把数据库、Docker 管理服务或全部端口直接暴露到公网。
四、路线 B:Windows 原生部署
如果不想使用 Wine,或者授权服务端明确要求原生 Windows,也可以把服务端部署到独立的 Windows Server / Windows 电脑。公开教程中常见环境是 Windows Server 2012 R2,但具体版本以授权方的兼容说明为准。
准备干净的 Windows Server 环境,关闭无关服务,安装杀毒软件。
安装授权包要求的 MySQL 版本和 MyODBC 驱动。
把服务端解压到独立数据盘,例如
D:\moyu。导入授权的数据库和补丁,修改数据库账号、密码、服务端监听 IP。
在 Windows 防火墙中只开放登录、网关和游戏端口。
启动顺序通常为:MySQL → ACC → MSG → NPC → Gameserver;以授权包说明为准。
Windows 客户端填入 Windows 服务端的局域网 IP,验证服务器列表、登录、角色选择和进入世界。
Windows 方案兼容性通常更高,但功耗、备份、远程维护和安全补丁都需要自己负责。
五、本次实测踩过的坑
1. 文件管理器没有解压 `.env`
以点开头的文件在部分 NAS 文件管理器中默认隐藏。运行 ls -la 确认 .env 存在;Compose 如果报 MYSQL_ROOT_PASSWORD is missing,先检查这一点。
2. UGOS 共享目录 ACL 阻止容器写入
MySQL 数据目录和 Wine 前缀都不要放在 UGOS 共享目录中。使用 Docker 命名卷 moyu-mysql-data 和 moyu-wine-home,可以绕开 ACL 导致的 Permission denied。
3. 脚本退出码 126
chmod 755 scripts
chmod 755 scripts/*.sh4. `wineserver -w` 一直等待
如果之前打开过 Wine 图形进程,wineserver -w 会等待所有进程结束。无头初始化完成后可执行:
docker exec -u wineuser -e HOME=/home/wineuser moyu-wine \
bash -lc 'wineserver -k 2>/dev/null || true'5. 服务端文件存在,但数据库仍报错
依次检查:数据库是否已导入、ODBC 驱动是否为 32 位、主机名是否为 mysql、数据库名是否与配置一致,以及 MySQL 是否使用 --lower-case-table-names=1 完成首次初始化。
六、日常运维
cd /你的Docker目录/moyu
docker compose ps
docker compose logs --tail=200 wine
docker compose restart wine
docker compose down
docker compose up -d备份重点:MySQL 数据卷、授权服务端数据库文件、server/ 配置和 web/ 列表。Wine 注册表和 ODBC 保存在 moyu-wine-home 卷中,迁移 NAS 时也需要一起备份。
七、结语
NAS Docker + Wine 这条路线已经完成了运行框架、数据库、Web 列表、无头启动、端口映射和常见 ACL 排障。真正缺失的不是 Docker 技术,而是权利方合法提供的服务端程序、数据库和数据文件。
拿到授权包后,只需要把它放入 /你的Docker目录/moyu/server,按实际文件名校准启动路径和端口,即可继续完成启动与客户端联调。
【提示】:本文的亲测 NAS 方案部署,把对应程序放进 Docker + Wine,不创建 Windows 虚拟机。
作者:idindoo · 2026-10-18



