Skip to content

About

适用于Ubuntu,一键部署,自动更新服务器和存档的mod,崩档自启,每隔4-5小时备份一次,保存3-4天的备份文件

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Latest commit

 

History

201 Commits

Folders and files

Repository files navigation

Linux_DST_SCRIPT

不允许商用 允许转载及修改 转载修改的时候记得注明

这是一个用于管理《饥荒联机版》Linux 专用服务器的脚本项目。仓库现在同时包含:

  • DST_SCRIPT.sh:服务器管理脚本。
  • dst-ws-client.go:连接 Koishi dst-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。

DST 脚本功能

  • 支持 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 秒的部分不会计入,避免停服时间造成虚增。

DST 脚本用法

将脚本放到服务器目录并授权:

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

测试版(beta)服务器

  • 在 [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.go

接入 Koishi dst-search

Koishi 插件 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-client

upstreamUrl 填的是 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 命令。

About

适用于Ubuntu,一键部署,自动更新服务器和存档的mod,崩档自启,每隔4-5小时备份一次,保存3-4天的备份文件

Topics

Resources

Stars

16 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages