# 从零开一个 tModLoader 服务器:tml-panel 一键面板指北
朋友想联机打泰拉瑞亚的模组(tModLoader),我给他们开了个专用服。开着开着发现痛点全在运维上:装 tModLoader 本体要跟 GitHub / Steam 斗智斗勇,装工坊模组得手抄一串数字 ID 还得自己补前置依赖,本体一更新客户端就连不进来,改配置得 SSH 进去手撸 serverconfig.txt……
索性把这套自用的管理面板剥出来开源了:tml-panel —— 仓库 KoishiVI2035/tml-panel(MIT)。一个网页面板搞定:一键装 tModLoader、一键开服、工坊搜模组自动补前置、本体一键升级带失败回滚、世界自动备份、可视化改配置、网页里发游戏命令。界面中英双语。
这篇是纯部署手记,照着抄能跑起来。
它能干什么
先说清楚定位,省得你装完发现不是要的东西:
- 它管一台 tModLoader 专用服(单实例),不是通用多游戏面板。
- 裸机 + systemd 方案,不依赖 Docker——面板直接用
systemctl/journalctl管宿主机上的服务。 - 面向自建服的小圈子:你有台 Linux VPS,想开个稳定的 tML 服跟朋友玩。
前置条件
- 一台 Linux VPS(Debian/Ubuntu/RHEL 系都行),有 root。
- 装好
git和curl(很多云镜像的最小系统不带,先补上)。 - 云厂商安全组 / 防火墙的管理权限(后面要放行游戏端口)。
- 内存建议 2G 起;只要装了灾厄这种大模组,4G 更稳。
Node 不用你操心——部署脚本在系统没有合适 Node 时会自动下一份隔离版塞进项目目录,不污染系统。
一键部署面板
# 最小系统先补齐 git/curl(RHEL 系换成 dnf install -y git curl)
apt update && apt install -y git curl
git clone https://github.com/KoishiVI2035/tml-panel.git
cd tml-panel
sudo bash deploy/install.sh # 国际网络
# 国内服务器加 --cn:Node/npm 走国内镜像,面板区域设为 cn(下载自动走加速源)
sudo bash deploy/install.sh --cn
脚本会自动:装隔离版 Node → 装依赖 → 构建前端 → 生成 systemd 单元并启动面板。跑完你会看到一段输出,记下这两样:
- 访问地址,形如
http://127.0.0.1:8765 - 一次性 setup token(首次设管理员密码要用,形如
a1b2c3d4e5f6...)
看到 部署完成 (服务状态: active) 就代表面板装好了。 下面是我在一台干净 Ubuntu 上 --cn 跑 install.sh 的真实输出(末尾 systemctl is-active 返回 active、/api/state 返回 200,就是活的):

首次进面板
面板默认只监听 127.0.0.1,这是刻意的安全设计——它以 root 跑、能读写服务器文件,绝不能裸奔在公网。从你自己电脑访问云服务器时,用 SSH 端口转发把它”隧道”过来:
# 在你自己的电脑上执行
ssh -L 8765:127.0.0.1:8765 root@<你的服务器IP>
# 保持这个 ssh 连着,然后本机浏览器打开:
# http://127.0.0.1:8765
打开后:输入 setup token → 设一个管理员密码(≥8 位)→ 进面板。

一键安装 tModLoader 服务端
第一次进面板、检测到还没装 tModLoader,会直接进安装向导。填几个参数:
- 世界名:只能英文字母 / 数字 / 空格 /
_-(世界不存在时首启会自动按下面的设置生成)。 - 世界大小:小 / 中 / 大。难度:经典 / 专家 / 大师 / 旅行。
- 游戏端口:默认
7777。最大玩家数、服务器密码(留空=无密码)、MOTD。 - 勾上 安装 steamcmd(工坊模组下载需要)和 装完立即启动。

点 🚀 一键安装,向导会跑一条流水线:环境检查 → 建目录 → 从 GitHub 下载 tModLoader 本体 → 解压 → 生成 serverconfig.txt → 注册 systemd 服务 → 装 steamcmd → 首次启动。全程有进度条。
8 个步骤全部打 ✅、右上角出现「✅ 完成」、底部冒出「进入面板」按钮,就代表 tModLoader 装好、服务器也起来了:

装完向导消失,进入正式面板。这时服务器已经在跑了。
让玩家进得来
服务器在监听 7777,但云厂商的安全组 / 防火墙默认不放行。去控制台把游戏端口(默认 7777/TCP)放行,玩家就能用你的公网 IP + 端口在游戏里「加入 IP」进服了。
日常怎么用
进了面板,功能都在顶部几个 tab 里。先看一眼管理台——状态、资源/在线监控、本体升级、世界备份、游戏控制台和实时日志都在这一屏:

具体每个 tab:
- 管理:启停 / 重启、实时日志、CPU/内存/在线人数监控、世界备份/恢复,还有——
- 游戏控制台:网页里直接发
save/say 内容/playing/kick 玩家名(面板给服务端进程接了个 FIFO 当输入,解决了 tML 服务化后发不了命令的老问题)。 - 本体一键升级:检测 GitHub 最新版 → 下载 → 自动备份 → 停服覆盖 → 健康检查,失败自动回滚到旧版。客户端更新后连不进来时,点这个对齐版本就行。
- 游戏控制台:网页里直接发
- 配置:可视化改
serverconfig.txt——世界、难度、端口、密码全是图形化的,不用手撸文本。 - 添加模组:填 Steam Web API Key 后能站内搜工坊,订阅时自动递归补前置依赖;「检查更新 → 一键更新」带版本归档和回滚;也能 pin 到历史版本。
- 开服档案 / 模组预设:把「世界 + 配置 + 一套模组」存成档案,一键切换重开。


国内服务器:—cn 模式
大陆机器直连 GitHub 下 tModLoader 基本是龟速甚至断流。部署时加 --cn,或给面板设 PANEL_REGION=cn,下载会优先走国内 GitHub 加速镜像(gh-proxy 等),Steam API 也会自动降级兼容。
改配置:用 drop-in,别直接改主单元
面板的各种环境变量(数据目录 TMOD_DIR、绑定地址、镜像等)通过 systemd 覆盖来配。用 systemctl edit 写 drop-in,这样重跑安装脚本升级面板时你的配置不会被覆盖掉:
sudo systemctl edit tml-panel
在打开的编辑器里写(示例):
[Service]
Environment=TMOD_DIR=/data/tmod
Environment=TML_GH_PROXY=https://your-mirror
保存后 sudo systemctl restart tml-panel 生效。常用变量:PANEL_BIND / PANEL_PORT / PANEL_REGION / PANEL_SERVICE / TMOD_DIR / STEAMCMD / TML_GH_PROXY / WORLD_BACKUP_KEEP,完整表在仓库 README。
安全须知(务必看)
| 项 | 默认 | 说明 |
|---|---|---|
| 监听地址 | 127.0.0.1 | 远程管理走 VPN 或 TLS 反代,别绑 0.0.0.0 |
| 运行身份 | root | 装服务 / 管进程需要;面板密码等同 root,设强密码 |
| 首次设密 | 需 setup token | 防”端口先可达、密码后设置”期间被人抢注管理员 |
| 文件管理 | 限制在 TMOD_DIR 内 | 默认 jail,含符号链接越狱防护 |
常见问题
首次启动一直转 / 健康检查超时? 首启要下 .NET + 建世界,弱网下可能超 10 分钟。去「管理」页看实时日志确认在推进就行,不用管。
大陆机器 GitHub 下载失败? 用 --cn 部署,或设 PANEL_REGION=cn;还不行就自建镜像设 TML_GH_PROXY。
升级面板自己?
cd tml-panel && git pull && sudo bash deploy/install.sh # --cn 记得带上
幂等的,会重新构建并重启面板,你写在 drop-in 里的配置不受影响。
结尾
代码在 github.com/KoishiVI2035/tml-panel,MIT 随便用。目前的边界是:单实例、裸机 systemd、x86_64;Docker 和多实例还在 roadmap 上。发布前跑了一轮对抗式代码审查修了一批坑,装服 / 升级链路我自己在用,算稳。有问题欢迎去仓库开 issue。
祝开服顺利,模组愉快 🌳