这几天下班空了就想弄点养老游戏玩玩,好好利用这一点点宝贵的个人时间,一顿扫描后看上了沙盒三巨头,就买了个服务器研究一下自己搭建服务器联机。

服务器要求 链接到标题

之前拿过 1c1g2m 的服务器试过,玩起来比 ppt 还 ppt,最终只能拿这个服务器去搭了个 teamSpeak 的服务器给兄弟们开黑用。

很多教程都说 2c2g2m 就够用了,但因为这次笔者想把三巨头都搭一下,因此选择了一个 4c16g10m 的大水桶,五六人爽玩。

前期准备 链接到标题

安装一些基础软件 链接到标题

$ apt install wget
$ apt install tmux
$ apt install unzip
$ apt install crontabs
$ systemctl enable crond
$ systemctl start crond

建一个专用用户(可选) 链接到标题

因为笔者的服务器上打算搭多个不同游戏的服务器,因此选择给每个游戏的服务器都建一个专用用户,方便管理。

笔者还会给新用户同时建一个 home 目录,以避免一些权限问题。

$ useradd -m terraria

下载服务器程序 链接到标题

这个就直接推荐在官网 terraria.org 上下载了,这样版本什么的就都不用愁了。

下载好后就上传到云服务器,接着把压缩包解压到目标路径就好。

笔者选择压缩到 /home/terraria 下。如果之前建好了专用用户记得要将这些文件的 owner 都改过去。

开放端口 链接到标题

笔者会把服务器开在 10777 端口上,因此需要去服务器的安全组管理页放行这个端口。

第一次启动 链接到标题

$ ./TerrariaServer.bin.x86_64

启动后会有一些基础的世界参数需要你来选择:

选择世界 链接到标题

Terraria Server v1.4.4.9

n               New World
d <number>      Delete World

Choose World:

这一步没什么好说的,按提示创建一个新世界就好。

选择世界尺寸 链接到标题

Terraria Server v1.4.4.9

1       Small
2       Medium
3       Large

Choose size:

多人游戏一般还是选大型世界玩的爽一些。

选择游戏难度 链接到标题

Terraria Server v1.4.4.9

1       Classic
2       Expert
3       Master
4       Journey

Choose difficulty:

这个按自己的能力来就好,笔者和伙伴们都是老油条了,果断选 Master。

选择邪恶生物群系 链接到标题

Terraria Server v1.4.4.9

1       Random
2       Corrupt
3       Crimson

Choose world evil:
1 随机
2 腐化
3 猩红

一般来说没有特色癖好就都会选随机的。

命名世界 链接到标题

Terraria Server v1.4.4.9

Enter world name:

指定世界种子 链接到标题

Terraria Server v1.4.4.9

Enter Seed (Leave Blank For Random):

这两步都没啥好说的。

经过一个漫长的读条后我们就可以开心的看到服务器的存档生成好了。

指定服务器最大玩家数量 链接到标题

在选择刚刚生成好的世界后就该配置一些基础信息了。

Terraria Server v1.4.4.9

Max players (press enter for 16):

指定服务器运行端口 链接到标题

Terraria Server v1.4.4.9

Server port (press enter for 7777):

是否自动转发端口 链接到标题

Terraria Server v1.4.4.9

Automatically forward port? (y/n):

设定服务器密码 链接到标题

Terraria Server v1.4.4.9

Server password (press enter for none):

启动成功 链接到标题

Terraria Server v1.4.4.9

Listening on port 7777
Type 'help' for a list of commands.

: Server started

使用配置文件启动服务器 链接到标题

上面这样一个流程第一次走一遍倒还算新奇,但让老油条每次都走就有些无聊了,因此游戏还给我们准备了配置文件启动的路线。

只要事先把配置文件准备好,剩下的等着我们的就只有等待了。

我们准备一个名为 config 的文件,内容如下:

# 设定世界存档文件的路径
world=       
# 设定服务器最大玩家数量
maxplayers=  
# 设定服务器密码
password=    
# 设定服务器运行端口
port=        
# 设定语言,zh-Hans 对应中文
language=    
# 设定进入房间时的消息,一般是指定一个保存了欢迎语的文件路径
motd=        
# 设定是否自动转发端口,1 对应开启端口转发
upnp=        
# 设定创建新世界的时候世界存档文件的路径(该配置要指定文件夹,即以/结尾)
worldpath=   
# 设定服务器黑名单的列表,默认在工作路径下的 banlist.txt
banlist=     
# 设定是否开启额外的作弊保护,1 对应开启作弊保护
secure=      

# 以下内容为需要自动创建世界时才需要填写,后续启动服务器时需要注释掉
# 设定自动创建世界的尺寸,1-3 分别对应 小中大 世界
autocreate=  
# 设定自动创建世界的名称
worldname=   
# 设定自动创建的世界游戏难度,0-3 分别对应 简单、专家、大师和旅行
difficulty=  
# 设定世界种子
seed=

# 以下内容为每项旅行模式能力的许可设置:0:对所有人禁用;1:只能由服主进行更改;2:可被所有人更改
journeypermission_time_setfrozen=2
journeypermission_time_setdawn=2
journeypermission_time_setnoon=2
journeypermission_time_setdusk=2
journeypermission_time_setmidnight=2
journeypermission_godmode=2
journeypermission_wind_setstrength=2
journeypermission_rain_setstrength=2
journeypermission_time_setspeed=2
journeypermission_rain_setfrozen=2
journeypermission_wind_setfrozen=2
journeypermission_increaseplacementrange=2
journeypermission_setdifficulty=2
journeypermission_biomespread_setfrozen=2
journeypermission_setspawnrate=2

简洁的基础配置文件 链接到标题

world=/home/terraria/Worlds/DiaorenParty.wld
#autocreate=3
#worldname=DickManParty
#difficulty=2
maxplayers=8
password=114514
worldpath=/home/terraria/Worlds/Worlds
port=10777

后续只要用 $ ./TerrariaServer.bin.x86_64 -config <configFilePath> 来启动服务器就可以了。

启动脚本 链接到标题

上面这一堆命令还是过于复杂了,笔者习惯用 systemd 来管理服务器上的各种进程,因此也希望通过 systemd 和专属用户来一致的管理泰拉瑞亚服务器,最终产生了以下的启动脚本。

#!/bin/bash 
USERNAME='terraria' 
SCNAME='terraria' 
TERA_VER='1449' 
BIN_PATH="/opt/terraria/bin/$TERA_VER/Linux/" SERVICE='TerrariaServer.bin.x86_64' 
CONFIG='/opt/terraria/serverconfig.txt' 

ME=`whoami` 
if [ "$ME" != "$USERNAME" ]; then 
	echo "Please run as the $USERNAME user." 
	exit 1 
fi 

start() { 
	if pgrep -u "$USERNAME" -f "$SERVICE" > /dev/null ; then 
		echo "$SERVICE is already running!" 
		exit 1 
	fi 

	echo "Starting $SERVICE..." 
	tmux new-session -d -s "$SCNAME" "$BIN_PATH$SERVICE -config $CONFIG" 
} 

stop() { 
	if ! pgrep -u "$USERNAME" -f "$SERVICE" > /dev/null ; then 
		echo "$SERVICE is not running!" 
		exit 1 
	fi 
	
	echo "Stopping $SERVICE" 
	tmux send-keys -t "$SCNAME:0" "say SERVER SHUTTING DOWN IN 10 SECONDS." C-m 
	sleep 10 
	tmux send-keys -t "$SCNAME:0" "exit" C-m 
} 

save() { 
	echo 'World data saving...' 
	tmux send-keys -t "$SCNAME:0" "say World saving..." C-m 
	tmux send-keys -t "$SCNAME:0" "save" C-m 
} 

status() { 
	if pgrep -u "$USERNAME" -f "$SERVICE" > /dev/null ; then 
		echo "$SERVICE is running." 
		exit 0 
	else 
		echo "$SERVICE is not running." 
		exit 1 
	fi 
} 

case "$1" in 
	start) 
		start 
		;; 
	stop) 
		stop 
		;; 
	save) 
		save 
		;; 
	status) 
		status 
		;; 
	*) 
		echo "Usage: $0 {start|stop|status|save}" 
		exit 1
esac

设置开机自启动 链接到标题

写一个 systemd 的 terraria.service 文件如下:

[Unit]
Description=Terraria Server
After=network.target local-fs.target

[Service]
Type=forking
User=terraria
ExecStart=/opt/terraria/terra_script.sh start
ExecStop=/opt/terraria/terra_script.sh stop

[Install]
WantedBy=multi-user.target
$ systemctl enable terraria

设置定时保存 链接到标题

/etc/crontab 的尾部插入:

*/10 * * * * terraria /opt/terraria/terra_script.sh save