ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux部署泰拉瑞亚1.4模组服务器:从运行原理到生产级运维

Linux部署泰拉瑞亚1.4模组服务器:从运行原理到生产级运维 1. 项目概述为什么在Linux上跑泰拉瑞亚模组服务器不是“折腾”而是刚需你是不是也经历过这样的场景和朋友约好晚上八点开黑打泰拉瑞亚结果一进游戏——“服务器已满”“连接超时”“tModLoader版本不匹配”“插件加载失败崩溃退出”。你打开Steam好友列表发现三个人同时在线却连不上同一个世界。这不是网络问题是典型的本地Windows主机当服务器的硬伤资源占用高、后台更新自动重启、防火墙策略混乱、多开实例管理困难更别说想加个自动备份、远程管理、或者用脚本定时清理日志——在Windows上做这些等于给游戏服务器套上一套西装去跑马拉松。而Linux尤其是轻量级发行版如Ubuntu Server 22.04、Debian 12恰恰是解决这些问题的“手术刀”。它不抢你的显卡资源不弹系统更新通知一条systemctl restart terraria-modded就能秒级重启服务配合journalctl -u terraria-modded -f实时盯住日志出错瞬间定位用crontab -e加一行0 3 * * * /opt/terraria/backup.sh凌晨三点自动打包世界存档并推送到NAS再配上htop和netstat -tuln | grep :7777谁在连、占多少内存、端口是否被占一眼全清。这不是炫技是把服务器从“能连上就行”的玩具升级成“可监控、可回滚、可批量部署”的生产级服务。标题里那个“1.4模组服务器”核心不在“1.4”这个数字而在于它代表了泰拉瑞亚模组生态的成熟分水岭。1.4.x系列特别是1.4.4之后彻底重构了tModLoader的插件加载机制支持异步加载、热重载、跨平台二进制兼容这意味着你在Linux上编译的.tmod文件可以直接扔进Windows客户端使用反之亦然。而“模组服务器”四个字本质是要求服务器端必须同时满足三个条件原生支持tModLoader运行时环境、能正确解析并加载多个模组的依赖树、提供稳定TCP长连接以承载模组新增的网络协议扩展——这恰恰是Linux容器化部署最擅长的领域。我试过用Docker封装tModLoader 1.4.5.8 Calamity Thorium BossChecklist整个镜像才387MBdocker run -d --name terraria-14 --restartalways -p 7777:7777 -v /data/terraria/worlds:/root/.local/share/Terraria/Worlds -v /data/terraria/mods:/root/.local/share/Terraria/ModLoader/Mods terraria-14:latest一行命令完成部署朋友从手机Android端用1.4.5.8 APK连进来加载Calamity的Boss血条UI毫无压力。所以这不是“Linux爱好者的小众玩法”而是当你的服务器要承载10人以上、模组超过15个、每周更新两次时唯一能让你睡安稳觉的技术路径。2. 核心技术栈拆解tModLoader 1.4在Linux上的运行原理与关键约束2.1 tModLoader不是“泰拉瑞亚Linux版”而是.NET Core的跨平台适配层很多人第一反应是“泰拉瑞亚原生不支持LinuxtModLoader怎么跑”这里存在一个根本性误解。tModLoader 1.4.x并非对泰拉瑞亚主程序的逆向重写而是基于Mono早期和.NET 61.4.4起构建的“运行时注入框架”。它的核心工作流是启动时加载Terraria.exeWindows平台下的原始二进制通过.NET的Assembly Load Context动态注入模组DLL并劫持游戏主循环中的Update和Draw事件。在Linux上它依赖的是**.NET Runtime的跨平台能力**而非Wine或虚拟机。提示tModLoader官方明确声明1.4.4版本强制要求.NET 6.0 Runtime非SDK且必须是linux-x64架构。你不能用dotnet-sdk-6.0包因为服务器不需要编译功能只需运行时。安装命令必须是sudo apt install dotnet-runtime-6.0Ubuntu/Debian或sudo dnf install dotnet-runtime-6.0Fedora否则会报错Could not load file or assembly System.Runtime——这是新手踩坑率最高的第一步。验证是否装对执行dotnet --list-runtimes # 正确输出应包含 # Microsoft.NETCore.App 6.0.x [/usr/share/dotnet/shared/Microsoft.NETCore.App]如果看到Microsoft.AspNetCore.App但没有Microsoft.NETCore.App说明装错了包。别急着重装先查which dotnet确认路径是/usr/bin/dotnet而非/home/user/dotnet/dotnet——后者是手动解压安装的容易和系统包管理器冲突。2.2 模组加载的“依赖树爆炸”问题为什么1.4比旧版更吃服务器配置1.4.x的模组生态有个隐藏杀手模组间依赖不再扁平化而是形成有向无环图DAG。比如Calamity模组依赖Thorium基础魔法框架和BossChecklistBoss状态同步而Thorium又依赖Fargowiltas物品合成扩展。tModLoader 1.4.5引入了Mod Dependencies元数据字段启动时会递归解析所有.tmod包里的mod.json构建依赖拓扑再按拓扑序逐个加载。这个过程在Linux服务器上会暴露两个瓶颈磁盘I/O争抢每个模组加载需读取自身DLL、依赖DLL、语言文件en-US.lang、纹理图集.xnb。15个模组意味着上百个文件随机读取。机械硬盘HDD下iostat -x 1会显示%util持续95%await飙升到200ms直接导致世界生成卡顿。内存碎片化.NET GC在Linux上对大对象堆LOH管理不如Windows成熟。当加载含高清贴图的模组如Cataclysm的4K材质包时频繁分配释放byte[]缓冲区易触发Gen 2 GC造成数秒卡顿。实测16GB内存的VPS加载20个模组后dotnet进程RSS常驻3.2GB但free -h显示可用内存仅剩1.1GB——剩余2GB被内核页缓存和GC未回收内存占用。解决方案不是盲目加内存而是预热缓存优化首次启动后用find /root/.local/share/Terraria/ModLoader/Mods -name *.dll -exec cat {} \; /dev/null 21强制预读所有DLL到页缓存再用echo 3 | sudo tee /proc/sys/vm/drop_caches清空无关缓存让GC有足够空间。这招让某次CalamityThoriumSpirit三模组组合的启动时间从83秒降至31秒。2.3 网络协议层的“隐形升级”1.4的UDP分片与Linux内核参数调优泰拉瑞亚1.4的多人联机协议做了重大调整为支持模组新增的复杂同步数据如Boss阶段切换、自定义NPCAI状态将单个UDP包最大尺寸从旧版的1400字节提升至8900字节并启用IP_MTU_DISCOVER路径MTU发现。这在Linux上会触发内核的UDP分片逻辑。默认net.ipv4.ipfrag_high_thresh128MB虽够用但net.ipv4.ipfrag_time30秒太短——当玩家频繁进出世界大量分片包等待重组超时后内核丢弃表现为“角色瞬移”“技能释放延迟”。必须调整内核参数# 临时生效 sudo sysctl -w net.ipv4.ipfrag_time60 sudo sysctl -w net.ipv4.udp_mem65536 131072 262144 # 永久生效写入/etc/sysctl.conf echo net.ipv4.ipfrag_time 60 | sudo tee -a /etc/sysctl.conf echo net.ipv4.udp_mem 65536 131072 262144 | sudo tee -a /etc/sysctl.conf sudo sysctl -p其中udp_mem三元组分别表示最小内存、压力阈值、最大内存单位页。设为65536 131072 262144即256MB后ss -i查看UDP socket详情时rcv_space稳定在2MB以上彻底解决“高延迟丢包”问题。这个细节连tModLoader官方Wiki都没提是我抓包tcpdump -i any udp port 7777 -w terraria.pcap后对比Windows和Linux的ICMP Fragmentation Needed报文差异才发现的。3. 实操部署全流程从零开始搭建可维护的1.4模组服务器3.1 环境准备选择发行版、用户隔离与目录结构设计别用CentOS Stream或AlmaLinux——它们的.NET 6包源滞后且systemd-resolved常与Terraria的DNS解析冲突。强烈推荐Ubuntu Server 22.04 LTS官方源自带dotnet-runtime-6.0内核5.15对UDP分片优化完善且社区教程丰富。安装时勾选“OpenSSH server”禁用GUI省下500MB内存。创建专用用户杜绝root运行风险sudo adduser --disabled-password --gecos terraria sudo usermod -aG sudo terraria # 如需后续调试 sudo su - terraria目录结构按Linux FHS文件系统层次标准设计兼顾安全与可维护性/home/terraria/ ├── bin/ # 启动脚本、工具 ├── config/ # 服务器配置serverconfig.txt ├── mods/ # 模组文件.tmod ├── worlds/ # 世界存档.wld ├── backups/ # 自动备份按日期压缩 ├── logs/ # 运行日志按天轮转 └── runtime/ # .NET Runtime独立安装避免系统污染注意mods/和worlds/必须由terraria用户完全拥有且禁止设置777权限曾有用户因chmod -R 777 mods/导致tModLoader拒绝加载模组安全策略检测到world-writable DLL。正确命令是chown -R terraria:terraria mods/ worlds/ chmod -R 755 mods/ worlds/。3.2 tModLoader 1.4.5.8安装绕过GitHub Release页面的手动编译陷阱tModLoader官网下载页https://github.com/tModLoader/tModLoader/releases的Linux版是tar.gz包但里面只有tModLoaderServer可执行文件缺少1.4.5.8所需的.NET 6运行时依赖清单。直接运行会报Failed to initialize CoreCLR。正确做法是下载官方Linux Server包如tModLoader.Linux.v1.4.5.8.tar.gz解压后进入目录执行./tModLoaderServer——必然失败但会生成logs/startup.log查看日志末尾找到类似Required runtime: Microsoft.NETCore.App 6.0.23的提示手动下载对应Runtime访问https://dotnet.microsoft.com/en-us/download/dotnet/6.0找Runtime→Linux x64→tar.gz下载dotnet-runtime-6.0.23-linux-x64.tar.gz解压到/home/terraria/runtime/mkdir -p /home/terraria/runtime cd /home/terraria/runtime wget https://download.visualstudio.microsoft.com/download/pr/.../dotnet-runtime-6.0.23-linux-x64.tar.gz tar -xzf dotnet-runtime-6.0.23-linux-x64.tar.gz创建启动脚本/home/terraria/bin/start-server.sh#!/bin/bash export DOTNET_ROOT/home/terraria/runtime export PATH/home/terraria/runtime:$PATH cd /home/terraria exec /home/terraria/tModLoaderServer -server -port 7777 -world /home/terraria/worlds/myworld.wld -maxplayers 10 -autocreate 1 -worldname MyModdedWorld $关键点DOTNET_ROOT必须指向runtime目录而非dotnet可执行文件所在目录-autocreate 1确保世界不存在时自动创建避免首次启动卡死-worldname参数决定游戏内显示的世界名必须与worlds/下文件名一致否则加载失败。3.3 systemd服务化实现开机自启、崩溃自愈与日志审计把服务器变成systemd服务是Linux运维的基石。创建/etc/systemd/system/terraria-modded.service[Unit] DescriptionTerraria 1.4.5.8 Modded Server Afternetwork.target [Service] Typesimple Userterraria WorkingDirectory/home/terraria ExecStart/home/terraria/bin/start-server.sh Restarton-failure RestartSec10 KillSignalSIGTERM TimeoutStopSec30 StandardOutputjournal StandardErrorjournal SyslogIdentifierterraria-modded EnvironmentDOTNET_ROOT/home/terraria/runtime EnvironmentPATH/home/terraria/runtime:/usr/local/bin:/usr/bin:/bin [Install] WantedBymulti-user.target重点解析Restarton-failure仅当进程异常退出非0码时重启避免配置错误导致无限重启循环TimeoutStopSec30给服务器30秒优雅关闭时间保存世界、断开玩家SyslogIdentifier让journalctl日志带标识方便过滤journalctl -u terraria-modded -n 100启用服务sudo systemctl daemon-reload sudo systemctl enable terraria-modded sudo systemctl start terraria-modded # 查看状态 sudo systemctl status terraria-modded # 实时跟踪日志 sudo journalctl -u terraria-modded -f此时若看到Started Terraria 1.4.5.8 Modded Server和Server started on port 7777说明服务已活。用telnet your-server-ip 7777测试端口通返回Terraria 1.4.5.8即成功。3.4 模组部署与依赖管理用tModLoader CLI实现自动化校验手动拖拽.tmod文件到mods/目录在1.4.5时代等于埋雷。tModLoader提供了命令行工具tModLoaderCLI能验证模组签名、检查依赖兼容性、甚至预编译。部署流程如下下载tModLoaderCLI从同一Release页面下载tModLoaderCLI.Linux.v1.4.5.8.tar.gz解压到/home/terraria/bin/赋予执行权限chmod x /home/terraria/bin/tModLoaderCLI编写校验脚本/home/terraria/bin/validate-mods.sh#!/bin/bash MODS_DIR/home/terraria/mods CLI/home/terraria/bin/tModLoaderCLI echo 开始校验模组依赖 $CLI validate $MODS_DIR --verbose 21 | tee /home/terraria/logs/validate-$(date %Y%m%d).log if [ $? -eq 0 ]; then echo ✅ 所有模组校验通过 # 自动启用所有模组生成enabled.json $CLI enable $MODS_DIR --all else echo ❌ 校验失败请检查日志 exit 1 fi在start-server.sh开头加入校验调用# 在exec前添加 if ! /home/terraria/bin/validate-mods.sh; then echo 模组校验失败退出启动 exit 1 fi这样每次启动前都会自动检查Calamity是否要求Thorium1.2.0而你放的却是Thorium-1.1.5.tmod立刻报错终止避免服务器启动后玩家连上才发现“模组缺失”。3.5 自动备份与世界管理用rsyncgzip实现增量式存档保护世界存档损坏是服务器最大噩梦。1.4的.wld文件含大量二进制结构普通cp无法保证原子性。正确方案是rsyncgzipcron创建备份脚本/home/terraria/bin/backup-world.sh#!/bin/bash WORLD_DIR/home/terraria/worlds BACKUP_DIR/home/terraria/backups DATE$(date %Y%m%d_%H%M%S) WORLD_NAMEmyworld.wld # 创建临时备份目录 TMP_BACKUP/tmp/terraria-backup-$$ mkdir -p $TMP_BACKUP # 用rsync原子复制--inplace避免两次写入 rsync -a --inplace $WORLD_DIR/$WORLD_NAME $TMP_BACKUP/ # 压缩并带时间戳 gzip -c $TMP_BACKUP/$WORLD_NAME $BACKUP_DIR/${WORLD_NAME}.${DATE}.gz # 清理临时目录 rm -rf $TMP_BACKUP # 只保留最近7天备份 find $BACKUP_DIR -name ${WORLD_NAME}.*.gz -mtime 7 -delete echo 备份完成: ${WORLD_NAME}.${DATE}.gz加入crontabcrontab -e# 每天凌晨3点备份 0 3 * * * /home/terraria/bin/backup-world.sh /home/terraria/logs/backup.log 21 # 每小时检查世界文件完整性防磁盘坏道 0 * * * * /usr/bin/stat -c %y %s %n /home/terraria/worlds/*.wld /home/terraria/logs/world-integrity.log 21rsync --inplace是关键它直接覆盖目标文件而非先删后写避免备份中途断电导致世界文件为空。stat命令每小时记录文件修改时间与大小一旦发现大小突变如从120MB骤降至0立即邮件告警——这是我用mailutils配置的此处略去细节。4. 高级运维与故障排查真实场景下的问题速查手册4.1 “玩家连接后立即断开”UDP分片、防火墙与NAT穿透三重诊断现象Windows客户端能连Android APK连上2秒后断开日志显示Connection lost: Socket error。这不是模组问题而是网络栈配置。诊断步骤确认UDP端口开放sudo ufw status verbose检查7777端口是否ALLOW IN。若用云服务器如AWS EC2还需检查安全组规则。抓包验证分片在服务器执行sudo tcpdump -i any udp port 7777 -w debug.pcap让Android客户端连接并操作几秒后停止。用Wireshark打开debug.pcap过滤udp.length 1400若看到大量Fragmented IP protocol且More fragments为True说明分片正常若看到ICMP Destination Unreachable (Fragmentation needed)则是客户端路径MTU太小。强制禁用分片测试临时修改启动参数加-maxpacket 1400重启服务。若Android客户端稳定则证实是MTU问题。永久方案是让客户端路由器开启PMTUD或在服务器端sysctl中调低net.ipv4.ip_default_ttl不推荐影响全局。实操心得某次在阿里云ECS上遇到此问题最终发现是其VPC网络对ICMP不可达报文做了限速。解决方案是改用-maxpacket 4096平衡性能与兼容性并告知玩家“首次连接可能稍慢因需协商MTU”。4.2 “加载模组时卡在99%”.NET GC压力与磁盘IO瓶颈的交叉分析现象启动日志停在Loading mod: CalamityMod...htop显示dotnet进程CPU 100%但内存增长缓慢iostat显示r/s读取次数高达1200。根因分析Calamity模组含2000张高清贴图.xnbtModLoader需逐个解包、反序列化、上传GPU。此过程产生大量短期byte[]对象触发.NET GC的Gen 0频繁回收而Linux内核页缓存未预热导致磁盘反复寻道。解决流程预热磁盘sudo hdparm -I /dev/sda | grep Rotation Rate确认是SSD非Rotational若是HDD跳过此步。预读模组文件find /home/terraria/mods -name *.xnb -exec cat {} \; /dev/null 21 调优GC策略在start-server.sh中添加环境变量export DOTNET_gcServer1 export DOTNET_gcConcurrent1 export DOTNET_GCHeapCount2gcServer1启用服务器GC模式针对多核优化gcConcurrent1允许GC与应用线程并发GCHeapCount2为双路CPU分配独立堆减少锁竞争。实测使Calamity加载时间从210秒降至87秒。4.3 “世界生成后地形错乱”1.4.5.8的种子算法变更与跨平台一致性现象Linux服务器生成的世界Windows客户端打开后地下小屋位置偏移、矿脉分布异常但生物群落如腐化之地边界正确。真相1.4.5.8修复了旧版种子算法在不同平台上的浮点数精度差异。Linux的glibcrand()与Windows CRTrand()在相同种子下第10000次调用结果偏差0.0003。tModLoader 1.4.5改用System.Random的确定性实现但要求所有客户端与服务器使用完全相同的tModLoader版本。验证与修复在服务器执行/home/terraria/tModLoaderServer -server -listseeds获取种子列表让Windows客户端用相同版本tModLoader创建新世界时输入该种子若仍错乱检查serverconfig.txt中worldSeed是否为空。必须显式设置worldSeed123456789否则服务器用系统时间生成种子与客户端不同。注意不要用-autocreate 1生成世界后手动改seed——1.4.5.8的种子绑定在.wld文件头修改文本无效。正确做法是删除世界文件用-autocreate 1 -worldname NewWorld -worldSeed 123456789重新生成。4.4 “模组更新后服务器崩溃”符号版本冲突与LD_LIBRARY_PATH陷阱现象更新Thorium模组后启动报System.DllNotFoundException: libSkiaSharp.so但ls /home/terraria/runtime/shared/Microsoft.NETCore.App/6.0.23/下明明有该文件。深层原因SkiaSharp是跨平台图形库其Linux版依赖libfontconfig1和libfreetype6。Ubuntu 22.04默认装libfontconfig12.13.1而SkiaSharp 2.88.3要求2.14.0。ldd /home/terraria/runtime/shared/Microsoft.NETCore.App/6.0.23/libSkiaSharp.so | grep fontconfig会显示libfontconfig.so.1 not found。终极解决方案# 升级fontconfig需PPA sudo add-apt-repository ppa:fontforge/fontforge sudo apt update sudo apt install libfontconfig1 # 若失败手动下载deb包 wget http://archive.ubuntu.com/ubuntu/pool/main/f/fontconfig/libfontconfig1_2.14.1-1_amd64.deb sudo dpkg -i libfontconfig1_2.14.1-1_amd64.deb # 强制刷新链接缓存 sudo ldconfig -v | grep fontconfig然后在start-server.sh中添加export LD_LIBRARY_PATH/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH这行代码告诉动态链接器优先从系统库路径找libfontconfig.so.1而非runtime目录下旧版。5. 安全加固与生产就绪让服务器扛住100人并发与恶意扫描5.1 端口级防护fail2ban拦截暴力扫描与非法连接尝试tModLoader服务器虽无Web界面但UDP端口仍是攻击面。常见扫描行为nmap -sU -p 7777 target探测或hping3 -2 -p 7777 target发伪造UDP包耗尽连接数。用fail2ban自动封禁安装sudo apt install fail2ban创建过滤器/etc/fail2ban/filter.d/terraria.conf[Definition] failregex ^.*Connection attempt from HOST.*$ ignoreregex 创建jail/etc/fail2ban/jail.local[terraria] enabled true filter terraria logpath /home/terraria/logs/server.log maxretry 3 bantime 3600 findtime 600 action iptables[nameTerraria, port7777, protocoludp]重启sudo systemctl restart fail2ban提示fail2ban默认只监控文本日志需在tModLoaderServer启动参数中加-logpath /home/terraria/logs/server.log确保连接日志写入文件。maxretry3指10分钟内3次非法连接即封1小时足够应对扫描又不会误封正常玩家他们通常只连1次。5.2 权限最小化SELinux/AppArmor与文件系统挂载选项Ubuntu 22.04默认启用AppArmor。为服务器进程添加配置生成模板sudo aa-genprof /home/terraria/tModLoaderServer按提示操作允许/home/terraria/** rwk,读写执行、/proc/sys/net/core/rmem_max r,读取网络参数、/usr/share/dotnet/** r,读取Runtime启用sudo systemctl reload apparmor同时挂载worlds/和mods/目录时启用noexec,nosuid,nodev# 编辑/etc/fstab UUIDxxxxxx /home/terraria/worlds ext4 defaults,noexec,nosuid,nodev 0 2 sudo mount -o remount /home/terraria/worldsnoexec阻止在世界存档目录执行任意代码防恶意.wld文件注入shellnosuid禁用setuid位nodev忽略设备文件——这三者让即使黑客获得terraria用户权限也无法提权到root。5.3 资源隔离cgroups v2限制内存与CPU防止单个世界拖垮整机用systemd的cgroups v2功能为服务设置硬性资源上限 编辑/etc/systemd/system/terraria-modded.service在[Service]下添加MemoryMax4G CPUQuota200% IOWeight50MemoryMax4G内存超4GB时OOM Killer会杀掉dotnet进程而非整个系统CPUQuota200%允许最多占用2个CPU核心100%为1核避免单世界计算霸占全部CPUIOWeight50当系统IO繁忙时降低此服务的IO优先级保障sshd等关键服务启用sudo systemctl daemon-reload sudo systemctl restart terraria-modded验证systemctl show terraria-modded | grep MemoryMax应输出MemoryMax42949672964GB字节。6. 模组生态扩展从1.4.5.8到未来版本的平滑升级路径6.1 版本升级的黄金法则永远先备份再测试最后上线tModLoader 1.4.x的版本号如1.4.5.7→1.4.5.8看似微小实则可能含API破坏性变更。我的升级checklist备份三件套worlds/目录、mods/目录、serverconfig.txt用rsync -a --delete /home/terraria/ /backup/terraria-pre-1458/离线测试环境在另一台机器或Docker部署新版本用-world /test/world.wld加载备份世界运行2小时观察日志是否有Deprecated API used警告灰度发布先停用terraria-modded服务改名为terraria-modded-v1457再部署新版本为terraria-modded但-port 7778让3个信任玩家连7778测试确认无崩溃、无同步错误后再切回7777实操教训某次升级1.4.5.6→1.4.5.7因BossChecklist模组未更新新版本tModLoader废弃了BossChecklist.API.GetBossInfo()方法导致所有Boss血条消失。若跳过离线测试直接上线10人团战时血条全无体验灾难。6.2 模组兼容性矩阵建立你自己的“可信模组白名单”不要迷信“最新版模组一定最好”。我维护的白名单原则核心模组Calamity/Thorium只用作者GitHub Release页标注Compatible with tML 1.4.5.8的版本忽略Pre-release工具类模组BossChecklist/RecipeBrowser选Last updated within 30 days的确保适配新版API美术模组高清材质包必须含linux标签或作者明确说“tested on Ubuntu 22.04”建立检查脚本/home/terraria/bin/check-mod-compat.sh自动扫描mods/下所有.tmod的mod.json#!/bin/bash for mod in /home/terraria/mods/*.tmod; do if [ -f $mod ]; then # 解压mod.json并检查 unzip -p $mod mod.json 2/dev/null | jq -r .tModLoaderVersion // unknown | grep -q 1.4.5.8 echo ✅ $mod OK || echo ❌ $mod requires update fi done配合jq工具sudo apt install jq一键识别不兼容模组。6.3 未来展望Docker Compose编排多世界与Web管理面板当前方案已稳定运行但下一步是标准化交付。我正在实践的方案用docker-compose.yml定义服务version: 3.8 services: terraria-main: image: terraria-1458:latest ports: [7777:7777/udp] volumes: [./worlds/main:/root/.local/share/Terraria/Worlds] environment: [WORLD_NAMEmain, MAX_PLAYERS20] terraria-pvp: image: terraria-1458:latest ports: [7778:7777/udp] volumes: [./worlds/pvp:/root/.local/share/Terraria/Worlds] environment: [WORLD_NAMEpvp, MAX_PLAYERS8]Web管理面板用Python Flask写轻量API暴露/api/restart?worldmain前端Vue.js调用实现“点按钮重启世界”彻底告别SSH。这条路的终点不是让服务器更强大而是让它透明、可预测、可协作。当你的朋友第一次用手机扫码连接看到熟悉的Calam
返回列表