本文记录一次将 原生安装的《饥荒联机版(DST)》专用服务器 平滑迁移至 Docker 容器环境 的全过程。
重点不在“如何一键搭建”,而在 配置复用、端口一致性、MOD 自动管理、Shard 分片通信验证 等关键细节。


一、迁移背景与目标

原服务器为 原生 Linux 安装 的 DST Dedicated Server,运行多年,具有以下特点:

  • 世界配置(Master + Caves)稳定
  • MOD 数量多,且有复杂 modoverrides.lua
  • Shard 分片通信正常
  • Steam Workshop 自动下载机制已验证可靠

迁移目标不是“重装”,而是:

在 Docker 中完整接管运行环境,但不破坏任何已有数据结构与行为逻辑。

核心原则:

  • 数据永远在宿主机
  • 容器可随时删除 / 重建
  • 端口、世界、MOD 行为完全一致

二、整体目录结构设计(脱敏示意)

宿主机统一使用一个工作目录:

/path/to/dst/
├── compose.yml
├── data/        # 游戏世界、配置、存档(关键)
│   └── DoNotStarveTogether/
│       └── Cluster_X/
│           ├── cluster.ini
│           ├── Master/
│           │   └── server.ini
│           └── Caves/
│               └── server.ini
├── runtime/     # SteamCMD / Workshop 缓存
└── mods/        # MOD 实际下载目录(可选挂载)

关键说明:

  • data/唯一不可丢失目录
  • Docker 容器内的任何路径都视为临时运行态
  • 所有 ini / lua 均沿用原服务器文件

三、Docker 镜像选择与原则

使用的镜像类型:

  • DST 专用 Docker 镜像
  • 内置 SteamCMD
  • 支持 Master / Caves 分片模式
  • 支持环境变量接管,但允许跳过自动生成

原则:

Docker 只负责“跑”,不负责“改”。

因此明确禁止镜像行为:

  • ❌ 自动覆盖 cluster.ini
  • ❌ 自动重写 server.ini
  • ❌ 自动生成 modoverrides.lua
  • ❌ 自动 chown / chmod

四、Docker Compose 设计要点(概念说明)

1️⃣ 使用 host 网络模式

network_mode: host

原因:

  • DST 使用大量 UDP
  • Steam Master / Auth 对 NAT 敏感
  • 避免 Docker 端口映射复杂性

👉 所有端口直接由 ini 文件控制


2️⃣ Master / Caves 使用两个容器

逻辑拆分而不是合并运行:

  • Master:地表世界
  • Caves:洞穴世界

两者共享:

  • 世界数据目录
  • SteamCMD / Workshop 缓存

3️⃣ 明确“只读接管”策略

通过环境变量声明:

  • 跳过配置生成
  • 跳过权限修改
  • 跳过 MOD 覆盖

目的只有一个:

让容器行为与原生服务器 100% 一致


五、MOD 管理策略(关键经验)

❌ 不推荐的方式

  • docker cp 手动拷贝 MOD
  • 容器内临时下载 MOD
  • 容器删除即丢失 MOD

✅ 实际采用方式

  • 保留原有:
    • dedicated_server_mods_setup.lua
    • modoverrides.lua
  • DST 服务启动时自动下载 Workshop MOD
  • MOD 下载路径位于 SteamCMD 库中
  • 游戏启动日志明确显示:
    • Workshop 下载
    • MOD 注册
    • MOD 配置覆盖

结论:

Docker 环境下,DST 的 MOD 自动管理机制完全可复用,无需任何人工拷贝。


六、端口配置完整核对(脱敏说明)

服务器共使用 5 类端口,分别对应不同功能。

功能来源文件协议说明
Master 世界端口Master/server.iniUDP地表玩家连接
Caves 世界端口Caves/server.iniUDP洞穴玩家连接
Shard 通信端口cluster.iniTCPMaster ↔ Caves
Steam Master 注册server.iniUDP服务器对外可见
Steam Authserver.iniUDP玩家身份验证

验证方式:

  • 启动日志显示 shard 成功连接
  • Steam Master 注册成功
  • 客户端可见服务器
  • 洞穴 / 地表互通正常

七、日志验证关键点

迁移是否成功,只需关注以下日志信号:

✅ 分片启动

[Shard] Starting master server
[Shard] Secondary shard connected

✅ MOD 加载完成

SUCCESS: Loaded modoverrides.lua
Registering Mod workshop-xxxxxx
ModIndex: Load sequence finished successfully

✅ 世界加载完成

World generated
Server registered via geo DNS

无崩溃、无回滚、无重启循环,即为成功。


八、容器删除与数据保留策略

一旦验证成功:

  • 停止容器
  • 删除容器
  • 不删除任何宿主机目录

Docker 的角色至此明确:

只是一个“随时可启动的运行壳”。


九、旧版本清理策略

历史原生安装、旧 Steam 目录、旧 .klei 备份:

  • 已确认不再使用
  • 与当前 Docker 运行路径无交集
  • 可安全删除或归档

原则:

  • 先验证
  • 再清理
  • 绝不反向依赖

十、总结

这次迁移的核心不是 Docker,而是三点:

  1. 尊重 DST 原生配置体系
  2. 让 Docker 成为透明运行环境
  3. 以日志而非“感觉”判断成功

最终结果:

  • 世界完整
  • MOD 全量生效
  • 分片稳定
  • 数据完全可控
  • Docker 可随时丢弃

这是一次工程级成功迁移,而不是“能跑就行”。

Leave a Reply

Your email address will not be published. Required fields are marked *