不允许商用 允许转载及修改 转载修改的时候记得注明
这是一个用于管理《饥荒联机版》Linux 专用服务器的脚本项目。仓库现在同时包含:
DST_SCRIPT.sh:服务器管理脚本。dst-ws-client.go:连接 Koishidst-search的 WebSocket 客户端,用 token 鉴权后调用DST_SCRIPT.sh的 CLI 功能。config.example.json:WebSocket 客户端示例配置。.github/workflows/release-dst-ws-client.yml:推送 tag 时自动构建dst-ws-client单文件程序并发布到 GitHub Release。
- 开启一个普通存档(地上+地下)需要占用 1.5G-2G 内存。
- 创建存档的功能已移除,请先自行创建并上传。教程请参考 专栏。
- 目前功能基本可用,如有其他需求,请在 issues 中提出。
dst-ws-client会主动连接 Koishi 的 WebSocket,不提供本机 WebSocket server 或 HTTP 接口。- 编译出的
dst-ws-client是单个可执行文件,运行时不需要 Node、npm、Go 或第三方库;它仍会在运行时调用同目录的DST_SCRIPT.sh。
- 支持 Ubuntu 和 Debian。
- 游戏版本可在
[7]更改存档开启方式中选择,默认正式版 32 位,仅需更改一次,之后会保持该版本。 - 测试版使用 Steam 官方公开测试分支
updatebeta,下载到$HOME/DST_BETA,与正式版$HOME/DST互不影响,同一台机器可以同时存在正式版和测试版存档。 - 测试版服务端使用独立的存档根目录
$HOME/.klei/DoNotStarveTogetherBetaBranch(正式版是$HOME/.klei/DoNotStarveTogether),脚本会按存档配置自动解析。把正式版存档切换为测试版时,脚本会把该存档的世界和cluster_token.txt复制到测试版目录,原正式版存档保持不变。 - 切换到测试版时会先下载并校验测试版本体,只有本体完整(
version.txt、SteamCMD 清单、服务端主程序都存在)才会写入测试版32位/64位配置;下载失败会保留原来的正式版配置,不会出现“配置是测试版但本体缺失”的开服失败。 - 自动更新会按存档所用版本分别检查:正式版查询 Klei
release分支,测试版查询updatebeta分支,两者版本号都取自 Klei 官方构建列表。 - 自动游戏更新会保留待重启状态:仅无人更新配置会在下载前检查玩家,下载后玩家上线或安全关闭失败时,下次检查继续尝试重启;多个存档共用同分支本体时,每个存档都会根据启动时记录的 buildid 判断是否需要重启。开服检查成功后才清除待重启标记。
- 自动游戏更新的 SteamCMD 默认最多运行 600 秒,超时后先发送 TERM,再最多等待 30 秒强制结束,维护循环随后继续;可通过
AUTO_UPDATE_GAME_TIMEOUT_SECONDS设置正整数秒数。下载期间维护任务仍串行等待,不是精确的定时执行。 - 本体安装与更新统一刷新 Steam 应用信息,并显式选择分支:正式版为
public,测试版沿用配置的分支及密码。脚本内的本体更新使用同一把非阻塞锁,已有更新执行时本次返回失败,等待后续检查;手动启动的外部 SteamCMD 不受该锁管理。 - 只有本次 Steam 内容日志明确显示已安装 depot/manifest 的清单请求被
Access Denied拒绝,才自动重建安装状态一次。脚本将原安装清单和诊断日志保存在本体目录steamapps/dst-script-manifest-recovery.XXXXXX/,保留游戏文件并重新校验复用;不固定 depot、清单号、版本号或存档名称。普通网络错误、其他清单被拒绝以及历史错误不会触发此恢复。 - 正常更新与恢复重试共用同一 SteamCMD 超时预算。失败时保留
steamapps/.dst-script-update-incomplete,恢复重试失败还会还原原安装清单;后续自动检查优先修复未完成更新,即使磁盘版本号已变化也不会直接重启。成功后清除未完成标记,再按存档启动版本决定是否重启。备份目录保留供排查,不自动清理。 - 自动更新服务器 mod 和服务器。
- 崩档后自动重启服务器。
- 提供默认的 token 文件模板。
- 自动识别并添加 mod,无需手动添加,不再使用 Klei 提供的
dedicated_server_mods_setup.lua,改用 http 和 steamcmd 下载游戏 mod。 - 自动维护进程在无人在线时按约 125 分钟周期备份存档,备份文件位于各世界的
save_bak。 - 自动维护进程约每 10 秒采集一次玩家快照,历史快照压缩备份位于
ScriptFiles/Player。 - 控制台功能支持查看服务器信息、回档、复活所有玩家、发送公告、通过备份回档,以及玩家管理(踢出、Ban、解除 Ban、添加/移除管理员)。
- 玩家管理优先读取
ScriptFiles/playerlist.txt和ScriptFiles/Player/*.zip中的历史玩家信息;没有历史记录时才查询当前世界。 - 自动更新进程会把历史玩家快照汇总到
ScriptFiles/player_statistics.txt,并持续统计采样次数和估算游玩时长;统计间隔超过 120 秒的部分不会计入,避免停服时间造成虚增。
将脚本放到服务器目录并授权:
chmod +x DST_SCRIPT.sh
./DST_SCRIPT.sh上传游戏存档到:
$HOME/.klei/DoNotStarveTogether常用 CLI:
./DST_SCRIPT.sh -checkprocess Cluster_1
./DST_SCRIPT.sh -get_playerList Cluster_1
./DST_SCRIPT.sh -checkupdate Cluster_1
./DST_SCRIPT.sh -checkmodupdate Cluster_1
./DST_SCRIPT.sh -addmod_by_http_or_steamcmd Cluster_1
./DST_SCRIPT.sh -restart_server Cluster_1 -AUTO
./DST_SCRIPT.sh -save_mod_info Cluster_1一行初始化:
git clone "https://github.com/ChengTu-Lazy/Linux_DST_SCRIPT.git" && cp "$HOME/Linux_DST_SCRIPT/DST_SCRIPT.sh" "$HOME/DST_SCRIPT.sh" && rm -rf "$HOME/Linux_DST_SCRIPT" && chmod +x "$HOME/DST_SCRIPT.sh" && "$HOME/DST_SCRIPT.sh"脚本更新会依次尝试 GitHub 官方仓库以及内置的 ghfast.top、gh-proxy.com、ghproxy.net 镜像,每个地址最多等待 45 秒。公共镜像的安全性和稳定性不由本项目保证,网络允许时优先使用 GitHub 官方仓库。
也可以通过 DST_SCRIPT_GIT_URL 指定一个最高优先级的自定义镜像地址:
export DST_SCRIPT_GIT_URL="你的可用镜像仓库地址"
./DST_SCRIPT.sh- 在
[7]更改存档默认配置→[1]默认游戏开启版本中选择3.测试版32位或4.测试版64位即把该存档切换为测试版;切换时会自动下载测试版本体到$HOME/DST_BETA。 - 下载测试版本体必须能访问 Steam 内容服务器(
*.steamcontent.com)。如果 SteamCMD 报Failed to download ... (No connection)或一直停在Update state reconfiguring,说明是网络/代理问题,不是脚本参数问题;请先确认代理或直连可以正常下载 Steam 内容。 - 测试版相关环境变量(均可选):
DST_SCRIPT_BETA_BRANCH # Steam 测试分支名,默认 updatebeta
DST_SCRIPT_BETA_PASSWORD # 分支密码,默认留空;公开测试分支不需要
DST_SCRIPT_BETA_PATH # 测试版本体目录,默认 $HOME/DST_BETA
DST_SCRIPT_BETA_SAVE_PATH # 测试版存档根目录,默认 $HOME/.klei/DoNotStarveTogetherBetaBranch
- 分支密码不是分支名:脚本使用
-beta <分支名>,只有配置了DST_SCRIPT_BETA_PASSWORD时才会额外追加-betapassword <密码>。旧版本曾把returnofthembeta当作分支名传给-beta,会直接报ERROR! Failed to set beta。 - 切换到测试版时会校验
$HOME/DST_BETA里的本体确实是测试分支(SteamCMD 清单中带有BetaKey)。如果该目录里是正式版本体,或上次下载被中断导致文件缺失,脚本会重新下载,而不会误判为“已经装好测试版”。 - SteamCMD 默认不使用系统代理(避免代理线路到 Steam 内容 CDN 握手失败导致
Failed downloading … No connection),同时会把127.0.0.1加入no_proxy。如果需要让 SteamCMD 走代理,设置DST_SCRIPT_STEAMCMD_USE_PROXY=true。 - SteamCMD 提示
Missing game files或更新失败时,先查看 Steam 内容日志和未完成更新状态;仅凭状态码不能确定根因,不要直接删除游戏目录。旧安装清单访问被拒绝时,脚本按上述规则进行一次恢复。
GitHub Actions 只会在推送 tag 时构建并创建 GitHub Release,普通提交、pull request 或只修改 DST_SCRIPT.sh 中的 script_version 都不会主动生成版本。
当前只构建 Linux amd64:
dst-ws-client-linux-amd64
发布新版本前,需要确认 DST_SCRIPT.sh 中的 script_version、下面的 tag 示例以及 Release workflow 中的更新说明保持一致。
发布命令:
git tag v1.8.26
git push origin v1.8.26推送 tag 后,进入 GitHub 仓库的 Releases 页面,在对应 tag 的 release 中下载 dst-ws-client-linux-amd64。
本地也可以自行编译:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o dst-ws-client dst-ws-client.go如果就在 Linux 服务器本机编译:
go build -trimpath -ldflags="-s -w" -o dst-ws-client dst-ws-client.goKoishi 插件 dst-search 当前源码里的控制相关配置需要关注这几项。如果你的插件页面没有 ControlTargetAlias,说明你使用的是旧版插件,只配置 WSSPort、WSSUserList 和 CommandAlias 也可以使用。
WSSPort: WebSocket 监听端口,例如12000。WSSUserList: 新增一行即可。名称是这台被控服务器的名字;允许操作的用户填 Koishi 收到的用户 ID,QQ 机器人一般就是 QQ 号;Token要和客户端配置里的token完全一致;连接状态是隐藏字段,不用手动填。ControlTargetAlias: 可选。用于给“某台服务器里的某个存档”配置短名字,例如一服自动对应本机服务器的#1存档。CommandAlias: 可选。用于把短命令映射成真正发给客户端的命令。插件源码里已经默认内置了查进程、玩家列表、开服、关服、回档1到回档5、存档列表。
字段示例:
WSSPort: 12000
WSSUserList:
- 名称: "本机"
允许操作的用户: "123456789"
Token: "test-token"
ControlTargetAlias:
- 代称: "一服"
服务器: "本机"
存档: "#1"
- 代称: "二服"
服务器: "本机"
存档: "#2"
CommandAlias:
- 代称: "查"
指令: "查进程"
- 代称: "开"
指令: "开服"控房 <目标> <命令> 的目标可以是 WSSUserList 的序号,也可以是 WSSUserList.名称,还可以是 ControlTargetAlias.代称。现在客户端只保留单服务模式,一般只需要配置一行 WSSUserList。
DST 服务器侧推荐把程序和脚本放在同一目录,配置放到用户目录:
DST_SCRIPT.sh
dst-ws-client
~/.dst-ws-client/config.json
首次运行时如果没有配置文件,dst-ws-client 会自动创建 ~/.dst-ws-client/config.json 并提示你继续配置。推荐直接使用配置向导:
mkdir -p "$HOME/.dst-ws-client"
chmod +x DST_SCRIPT.sh dst-ws-client
./dst-ws-client config
./dst-ws-client常用配置命令:
./dst-ws-client config # 交互式修改配置
./dst-ws-client config init # 只创建默认配置
./dst-ws-client config path # 输出当前配置文件路径
./dst-ws-client config show # 查看配置,token 会隐藏如果要使用其他配置文件路径,可以加 --config:
./dst-ws-client --config ./config.json config
./dst-ws-client --config ./config.json配置示例:
{
"upstreamUrl": "ws://127.0.0.1:12000",
"scriptPath": "./DST_SCRIPT.sh",
"defaultCluster": "auto",
"clientReconnectMs": 1000,
"clientPingMs": 5000,
"clientReadTimeoutMs": 15000,
"clientRefreshMs": 30000,
"token": "test-token"
}也可以不用配置文件,直接用环境变量运行:
DST_WS_UPSTREAM="ws://127.0.0.1:12000" \
DST_WS_TOKEN="test-token" \
DST_SCRIPT_PATH="./DST_SCRIPT.sh" \
DST_DEFAULT_CLUSTER="auto" \
./dst-ws-clientupstreamUrl 填的是 Koishi 所在机器的 WebSocket 地址,不是 DST 游戏房间地址:
- Koishi 和
dst-ws-client在同一台机器:ws://127.0.0.1:12000。 - Koishi 在局域网另一台机器:
ws://<Koishi内网IP>:12000。 - Koishi 在公网机器或有域名:
ws://<Koishi公网IP或域名>:12000,同时确认防火墙和云服务器安全组放行了WSSPort对应的 TCP 端口。
不要把真实公网 IP 和 token 提交到仓库;公开文档或截图里建议用 <Koishi公网IP或域名> 这类占位符。
QQ 里可以这样使用:
控房 1 查进程
控房 1 存档列表
控房 1 开服
控房 1 关服
控房 1 回档1
控房 1 1
控房 1 2
控房 1 3
控房 1 #1 查进程
控房 1 Cluster_1 查进程
控房 本机 查进程
控房 一服 查
控房 一服 开
如果使用 ControlTargetAlias,插件会先选中对应的服务器,再把配置里的 存档 自动补到命令前面。例如 控房 一服 查 会发给客户端 #1 查进程。
upstreamUrl: Koishi WebSocket 地址,例如同机部署时使用ws://127.0.0.1:12000,跨机器部署时替换为 Koishi 机器的内网 IP、公网 IP 或域名。token: Koishi 中配置的 token。程序会在upstreamUrl未带token查询参数时自动拼接。scriptPath:DST_SCRIPT.sh路径,默认./DST_SCRIPT.sh。defaultCluster: 未指定存档时使用的存档名。为空或auto时会自动发现存档。clientReconnectMs: 断线后的重连间隔,默认1000毫秒。Koishi 重载配置导致 WebSocket 短暂断开时,程序会自动重连。clientPingMs: WebSocket ping 心跳间隔,默认5000毫秒。clientReadTimeoutMs: 收不到任何 WebSocket 帧时主动断开并重连的超时时间,默认15000毫秒,必须大于clientPingMs。clientRefreshMs: 空闲时主动刷新 WebSocket 连接的间隔,默认30000毫秒。用于处理 Koishi 重载后旧连接仍能 pong、但新插件实例不再登记该客户端的情况。clientOutputLimit: 单次回传给 Koishi 的最大字符数,默认3500。clusterAliases: 存档别名到真实存档名的映射,例如{ "一服": "Cluster_1", "二服": "Cluster_2" }。
常用环境变量:
DST_WS_CONFIG
DST_WS_UPSTREAM
DST_WS_TOKEN
DST_SCRIPT_PATH
DST_SCRIPT_SHELL
DST_DEFAULT_CLUSTER
DST_CLUSTER_ALIASES
DST_WS_CLIENT_RECONNECT_MS
DST_WS_CLIENT_PING_MS
DST_WS_CLIENT_READ_TIMEOUT_MS
DST_WS_CLIENT_REFRESH_MS
DST_WS_CLIENT_OUTPUT_LIMIT
DST_CLUSTER_ALIASES 支持两种格式:
export DST_CLUSTER_ALIASES='一服=Cluster_1,二服=Cluster_2'
export DST_CLUSTER_ALIASES='{"一服":"Cluster_1","二服":"Cluster_2"}'| action | 调用脚本参数 |
|---|---|
checkprocess |
-checkprocess <cluster> |
getPlayerList |
-get_playerList <cluster> |
restartServer |
-restart_server <cluster> [autoFlag] |
restartAuto |
-restart_server <cluster> -AUTO |
closeServer |
source 脚本后调用 close_server <cluster> -close |
rollback1 ... rollback5 |
source 脚本后向 DST 控制台发送 c_rollback(1) ... c_rollback(5) |
listClusters |
列出运行中和已保存的存档 |
服务只做白名单映射,不接受任意 shell 命令。