泰拉瑞亚服务器搭建教程(带 MOD)

搭建 Terraria 服务器的好处在于,能够不受限制的随时加入。如果客户端和服务端在同一台电脑上(也就是最寻常的一个人当房主其他人加入的模式),那么只有在房主玩游戏的时候别人才能加入。

写这份教程之前,我曾经搭建成功过一次,具体过程几乎全忘了,如今只能从头开始。这次我会把搭建的过程记录下来,一方面为我下次搭建提供便利(如果真的还有下次的话),另一方面,希望能帮助到正在阅读这篇文章的你。

环境说明

阿里云 ECS:2C4G,1M 带宽,Ubuntu 18.04 镜像

步骤

安装 SteamCMD

1
2
apt update
apt install steamcmd

如果出现 E: Unable to locate package steamcmd,在 /etc/apt/sources.list 中添加遗漏的 multiverse 源(其实就是一些闭源软件的源),注意 Ubuntu 的版本代号要保证一致(比如我的就是 bionic)。修改后重新执行更新和安装的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## /etc/apt/sources.list 文件内容

## 修改后
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

## 修改前
deb http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic main
deb-src http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic main

deb http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic-updates main
deb-src http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic-updates main

deb http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic universe
deb-src http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic universe
deb http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic-updates universe
deb-src http://mirrors.cloud.aliyuncs.com/ubuntu/ bionic-updates universe

创建并切换用户

1
2
3
4
useradd -m steam
su steam
bash # 切换到 bash 以保证命令行体验
cd ~

安装游戏

Terraria 必须登陆后才能下载

1
2
3
4
steamcmd # 进入 Steam> 交互模式
login <你的 steam 用户名>
# 然后输入密码(以及两步验证)
app_update 105600 # 安装 Terraria

安装 tModLoader

访问 https://github.com/tModLoader/tModLoader/releases 挑一个最新的版本并复制链接(选 Linux 版,文件名形如 tModLoader.Linux.v0.11.6.2.tar.gz

1
2
3
4
5
6
cd ~/.steam/steam/SteamApps/common/Terraria/
wget -c https://github.com/tModLoader/tModLoader/releases/download/v0.11.6.2/tModLoader.Linux.v0.11.6.2.tar.gz # 自行替换文件名
tar -zxvf tModLoader.Linux.v0.11.6.2.tar.gz # 解压文件
chmod +x Terraria
chmod +x tModLoaderServer # 增加执行权限
./tModLoaderServer # 运行

运行后会看到选择世界和 MOD 管理的菜单。

添加 MOD

首次运行 tModLoaderServer 后会自动创建一些目录,把需要的 Mod 拷贝到 ~/.local/share/Terraria/ModLoader/Mods 下就好了。开启的话需要进 tModLoaderServer,然后选择世界(或者先创建世界)就好了。

开放端口

进阿里云的 console,找到修改安全组规则的地方,添加安全组规则,协议类型全部,授权对象 0.0.0.0/0 就好了。不过这是无脑开放所有端口和协议的做法,其实开启 7777 端口的 TCP 和 UDP 就够了。

一个自制脚本

cmd 变量中的路径和世界名字按需要更改,脚本提供了以下功能:

  • 每隔 3 分钟自动存档
  • 每隔 15 分钟报时
  • 玩家加入时发送欢迎文字
  • 玩家在游戏中输入 exit 后过 60s 关闭服务器
  • 玩家在游戏中输入 dawn 后切换到黎明

使用方法:python3 xxx.py,如果确定正常后,为了保证后台运行,可以在命令前加 screen(需要安装 screen 包)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import subprocess
from threading import Thread
from queue import Queue, Empty
import psutil
from datetime import datetime
import time
import traceback

cmd = "/home/steam/Terraria/tModLoaderServer.bin.x86_64 -world /home/steam/.local/share/Terraria/ModLoader/Worlds/the_world.wld".split()

p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)


def enqueue_output(out, queue):
for line in iter(out.readline, b''):
queue.put(line)
out.close()


q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q), daemon=True)
t.start()


pid = p.pid


def monitor():
print(pid)
ready = False

while psutil.pid_exists(pid):
def write(s):
s += '\n'
p.stdin.write(s.encode())
p.stdin.flush()
try:
line = q.get_nowait().decode()
print(line[:-1])
if not ready and "Type 'help' for a list of commands." in line:
ready = True
if ready:
if "exit" in line:
write("say Closing in 60s...")
time.sleep(60)
write("say Now closing...")
write("exit")
if "dawn" in line:
write("say Switch game time 4:30AM.")
write("dawn")
if "has joined." in line:
write("say Welcome!")
except Empty:
if ready:
now = datetime.now()
if now.second < 5:
if now.minute % 15 == 0:
write("say Current time: %02d:%02d." % (now.hour, now.minute))
if now.minute % 3 == 1:
write("say Now saving...")
write("save")
time.sleep(5)


try:
monitor()
except Exception as e:
p.stdin.write(b'exit')
traceback.print_exc()

为了安装名为 psutil 的 python 包,需要 root 下运行

1
2
apt install python3-pip
pip3 install psutil

参考链接

https://nodecraft.com/support/games/terraria/tmodloader-server-guide

https://developer.valvesoftware.com/wiki/SteamCMD

https://www.jxtxzzw.com/archives/3629 注:里面提到的是本人哦