MC-生电服务器搭建和维护

本文记录了在docker中搭建我的世界基友生电服的过程,并给出相应组件的使用维护教程。

环境信息

  • MC版本:1.20.1
  • jdk:openjdk:17

准备

首先需要准备以下文件和环境:

  1. dorker,包含ubuntu镜像
  2. python>3.8
  3. 这个网站准备好.jar文件

容器

创建与删除容器

输入以下命令创建一个新容器并进入交互页面:

1
docker run -it -u $(id -u) --name MC1201 -p 25565:25565 -p 25575:25575 -v /home/lo/desktop/MC1201/server:/server ubuntu /bin/bash

其中,-it指定使用交互式终端,-u $(id -u)使用当前用户运行容器,--name MC1201指定容器的名字为MC1201-p 25565:25565将宿主机的25565(前)端口映射到容器的25565(后),-v /home/lo/desktop/MC1201/server:/server将宿主机的目录(前)挂载到容器的/server下(必须为绝对路径),ubuntu指定使用的镜像,/bin/bash为执行的命令,这里是启动一个终端。

其中26675为rcon服务预留。

如果不需要打开交互终端,后台运行,可以添加-d参数。

1
$ docker rm MC1201

无法删除正在运行的容器。

退出容器

在容器中输入exit退出,会终止当前程序(终端),可能导致容器停止(如果是最后一个程序的话)。

使用ctrl + p + q退出,不会终止容器继续运行。

如果使用exec命令进入bash,是新开了终端,exit则不会导致容器停止。

所以推荐使用-d后用exec命令进入交互。

进入容器

当容器正在后台运行,可以通过exec命令进入终端。

1
docker exec -it MC1201 /bin/bash

exec命令可以在运行的容器中执行一个命令。上面的代码在容器MC1201以交互模式执行了/bin/bash

当需要使用管理员权限执行命令,可以使用:

1
docker exec -it -u 0 MC1201 apt-get update

由于没有使用bash,该命令执行完成后就会返回宿主机。

同时还可以使用以下命令进入容器:

1
docker attach 容器ID

attach 直接进入容器启动命令的终端(PID为1的进程),不会启动新的进程,因此exit退出时会关闭容器(如果只有一个程序运行),要使用ctrl + p + q。注意:使用该命令进入没有-it的容器终端,会无法交互。

查看容器状态

1
2
docker ps -a #查看所有容器的状态
docker stats MC1201 #查看名为MC1201容器状态

常见状态有:

  • Up:运行中,容器正在运行,可通过stop停止
  • paused:暂停,使用pause unpause命令进行控制
  • exited:停止,没有运行,可以通过start/restart启动

启动与关闭容器

1
2
docker start MC1201
docker stop MC1201

导出和导入

导出容器到文件:

1
docker export 1e560fca3906 > ubuntu.tar

1e560fca3906为容器id

从上面的文件导入到镜像:

1
cat docker/ubuntu.tar | docker import - test/ubuntu:v1

该方法与镜像的save load不一样不要搞混。

服务端

安装运行环境

依次执行以下命令:

1
2
3
docker exec -it -u 0 MC1201 apt-get update
docker exec -it -u 0 MC1201 apt-get install openjdk-17-jdk
docker exec -it -u 0 MC1201 apt-get install python3 python3-pip

该命令使用-u 0的root用户安装软件,使用-it主要为了按y确认。

试运行服务端

在配置MCDR前需要先准备好服务端。

使用预先准备好的jar文件或者使用以下命令现下:

1
curl -OJ https://meta.fabricmc.net/v2/versions/loader/1.20.1/0.16.9/1.0.1/server/jar

然后使用以下命令运行:

1
java -Xmx2G -jar fabric-server-1.20.1.jar nogui

fabric程序会自动下载原版客户端,同时完成相关组件配置,最后启动服务器。注意eula同意。

如果没问题,就可以搜索到服务器进入了。

MCDR

首先,安装MCDR:

1
docker exec -it -u 0 MC1201 pip3 install mcdreforged

并升级:

1
docker exec -it -u 0 MC1201 pip3 install mcdreforged -U

然后进入容器,在一个文件夹中执行初始化命令:

1
mcdreforged init

将之前的服务端移动到server文件夹中。

配置文件,其中最重要包括:

  1. language:语言
  2. start_command:启动命令
  3. handler:处理方式
  4. encoding, decoding:终端语言

这里先如下配置:

1
2
3
4
5
language: zh_cn #修改为中文
start_command: java -Xmx2G -jar fabric-server-1.20.1.jar nogui #启动命令
handler: vanilla_handler #默认,适合fabric
encoding: utf8 #默认,除非系统不是utf-8
decoding: utf8 #默认,除非系统不是utf-8

之后,启动mcdr:

1
mcdreforged

同时在游戏中也输入以下命令测试:

1
!!MCDR

之后在容器外,可以使用以下命令启动:

1
docker exec -it -w /server MC1201 mcdreforged

-w /server指定了命令在server文件夹执行。

记得导出一个副本备份:

1
docker export MC1201 > docker-export-servermc1201.tar

启动参数优化

在服务端创建启动脚本start.sh

1
2
3
4
5
6
#!/bin/bash

JAR_FILE='fabric-server-1.20.1.jar'

# 如果-Xmx的值大于12GB,请调整以下参数: -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 - -XX:InitiatingHeapOccupancyPercent=20
java -Xms12G -Xmx12G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar $JAR_FILE --nogui

然后修改MCDR:

1
start_command: ./start.sh

安装插件和mod

使用!!MCDR plg来处理插件,插件存放在plugins文件夹中,mod放在服务端mods中。

管理服务器

一般来说,我们会用-d参数让服务器在后台运行,但对于上面的容器来说,这样就无法进入到服务器终端了,使用attach命令会进入run时创建的终端。那么想要管理服务器,有两种方法:

使用RCON

修改服务器server.properties文件:

1
2
3
rcon.port=25575
enable-rcon=true
rcon.password=

之后可以使用网页端工具(安全性未知),或者客户端工具使用rcon管理原版服务端如NectarRCON

同时也可以顺便修改MCDR中的RCON设置。

如果启动容器时没有添加端口,可以重新启动,或者见以下步骤修改配置文件。

修改docker启动命令

先关闭docker:

1
service docker stop

首先使用命令查看容器配置文件位置:

1
docker inspect redis|grep Id

找到其中写明的配置路径,一般为/var/lib/docker/containers/id/

修改端口映射文件hostconfig.json,在PortBinding添加:

1
"25575/tcp":[{"HostIp":"","HostPort":"25575"}]

修改config.v2.json中的ExposedPort:

1
"ExposedPorts":{"25565/tcp":{},"25575/tcp":{}}

然后修改config.v2.json中启动命令,找到修改:

1
2
3
"Path":"/usr/local/bin/mcdreforged"
"Cmd":["/usr/local/bin/mcdreforged"]
"WorkingDir":"/server"

然后重启服务:

1
service docker start

之后使用start命令就可以直接启动服务器了,同时使用attack就可以进入到服务器终端。

如果想在启动时进入终端,可以加上-a -i参数。

配置、插件、mod与教程

server.properties

除了上面的RCON外,还需要注意以下几项配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
enforce-secure-profile=false #聊天的身份签名,需要关闭
motd=\u00A7eLO的服务器\u00A7r\n\u00A7b1.20.1全面升级 # 服务器标语
pvp=true
difficulty=hard #修改为困难
max-players=10 # 10人足以
allow-flight=true # 防止意外退出
view-distance=10
prevent-proxy-connections=false # 允许虚拟网络代理
entity-broadcast-range-percentage=100 #实体渲染百分比,在视距百分之距离内的实体被渲染
simulation-distance=10 # 玩家多少区块内实体可更新
white-list=true # 白名单启用
enforce-whitelist=true # 强制白名单,白名单更新后不在名单的玩家是否踢出
spawn-protection=0 # 出生点保护

MCDR

文档地址

这里列出常见管理命令。

权限

MCDR 中一共有 5 种不同的权限等级:

名称 整数值 描述
owner 4 最高权限,所有者,具有控制物理服务器的能力。例子:控制台
admin 3 管理员,拥有控制 MCDR 与 Minecraft 服务器的能力。例子:Minecraft 中的 OP
helper 2 助手,可以协助管理员进行服务器管理。例子:值得信赖的成员
user 1 普通玩家
guest 0 最低权限,如访客或者熊孩子

权限文件 permission.yml 用以储存权限系统的相关信息,使用 !!MCDR reload permission 命令来重载权限文件。

帮助

!!help 命令将显示所有命令的帮助消息,此命令的内容可以由插件注册。

!!MCDR命令

!!MCDR 命令是用户在控制台或游戏中控制 MCDR 的方式。这些命令至少需要权限级别 3 (admin) 才能执行,会看到 MCDR 命令的帮助消息,否则只有版本信息。

比较重要的命令如下:

!!MCDR reload 子命令可以热重载,缩写为 !!MCDR r

!!MCDR permission 子命令用于操作玩家权限。它的缩写是 !!MCDR perm

!!MCDR plugin 用于操纵插件的命令。它的缩写是 !!MCDR plg

!!MCDR server 子命令可用于控制被守护的服务端。

配置

MCDR 的配置文件是 config.yml,可以使用 !!MCDR reload config 命令(或其缩写 !!MCDR r cfg)来重载配置文件。

常见配置项:

  • language-设置为zh_cn
  • rcon-设置为相应的
  • plugin_download_url-下载链接,可以修改为https://mirror.ghproxy.com/{url}进行加速

MCDR-Prime Backup

插件主页

依赖部分python包:

1
pip3 install -r https://tisunion.github.io/PrimeBackup/requirements.txt

配置

config/prime_backup/config.json中:

1
2
3
4
5
6
7
8
9
10
// 根配置
{
// ...
"backup": {
"targets": [
"world"
],
}
// ...
}

设置备份目标。

1
2
3
4
5
6
7
8
9
// 根配置
{
// ...
"backup": {
"hash_method": "xxh128",
"compress_method": "zstd",
}
// ...
}

推荐使用”xxh128”,”zstd”。

1
2
3
4
5
// root config
{
"enabled": true
// ...
}

修改为true启用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"prefix": "!!pb",
"permission": {
"root": 1,
"abort": 1,
"back": 2,
"confirm": 1,
"database": 4,
"delete": 3,
"delete_range": 3,
"export": 4,
"list": 1,
"make": 1,
"prune": 2,
"rename": 1,
"show": 1,
"tag": 2
},
"confirm_time_wait": "1m",
"backup_on_restore": true,
"restore_countdown_sec": 10
}

permission-所有子命令所需的 MCDR 权限等级 的最低权限级别。

backup_on_restore-是否进行回档前临时备份

1
2
3
4
5
6
7
8
9
{
"enabled": true,
"interval": "24h",
"crontab": null,
"jitter": "10s",
"reset_timer_on_backup": true,
"require_online_players": false,
"require_online_players_blacklist": []
}

定时备份配置:

interval-时间间隔

reset_timer_on_backup-手动备份则重置计时

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
{
"enabled": true,
"interval": "12h",
"crontab": null,
"jitter": "20s",
"timezone_override": null,
"regular_backup": {
"enabled": true,
"max_amount": 3,
"max_lifetime": "0s",
"last": -1,
"hour": 0,
"day": 0,
"week": 0,
"month": 0,
"year": 0
},
"temprory_backup": {
"enabled": true,
"max_amount": 5,
"max_lifetime": "7d",
"last": -1,
"hour": 0,
"day": 0,
"week": 0,
"month": 0,
"year": 0
}
}

备份清理功能配置:

  • regular_backup: 针对常规备份,即非临时备份
  • temporary_backup: 针对临时备份,如回档前的备份

max_amount-定义要保留的最大备份数量,例如 10 表示最多保留最新的 10 个备份

max_lifetime-所有备份的最大保存时长。超出给定时长的备份将被清理,0s为无限制

其余可以看这里

命令

在 MCDR 控制台或游戏中输入 !!pb

MCDR-Seed

插件主页

!!seed指令获取服务器种子,无需手动在配置文件中指定种子,插件可以自动获取。

MCDR-Loaction Maker

插件主页-依赖于这个插件

一个服务端共享路标点管理器。

配置文件

Marker data file path: config/location_marker/locations.json

Marker config file path: config/location_marker/config.json

MCDR-Here

插件主页

使用!!here来显示玩家坐标并发光。

配置文件

config/here.json中:

highlight_time:整数,控制玩家是否高亮和时间(0为不高亮);

display_voxel_waypoint:布尔值,为真则显示一小段文本([+V]),点击以高亮坐标,Ctrl+点击以添加坐标点至 Voxelmap

display_xaero_waypoint:布尔值,为真则显示一小段文本([+X]),点击以添加坐标点至 Xaero’s Minimap

MCDR-allow_suicide

插件主页

允许没有op权限的玩家自杀

MCDR-Crash Restart

插件主页

一个简单的在服务端崩溃后自动重启服务器的插件

在服务端崩溃太频繁时将会停止重启。默认情况下最大容忍度为 5 分钟内 3 次崩溃。

MCDR-Showlt

插件主页

允许获得玩家的头或者展示手上物品。

获得头:!!skull <player>

展示物品:!!show


MOD-Fabric API

模组地址——服务端、客户端

Fabric API是Fabric的组成之一,包含了很多MOD开发中用到的API,方便MOD开发者。它与MOD加载器分开可能是官方对于轻量化的考虑。

该mod无需配置,直接丢进mods即可,是很多mod的前置。

MOD-Easy Auth

模组地址——服务端

前置mod:Fabric API

一个运行在Fabric端的登录模组,提供玩家账号功能,使离线模式服务器更为安全。同时还支持正版用户自动登录。

玩家命令

  • /login <password>, /l <password> - 登陆账号
  • /logout - 退出登陆
  • /register <password> <password> - 注册账号
  • /account - 管理账号
  • /unregister <password> - 注销账号
  • /changePassword <old password> <new password> - 更改密码

管理员命令

  • /auth reload - 重新配置文件
  • /auth setGlobalPassword <password> - 为服务器设置一个全局密码
  • /auth setSpawn [<dimension id> <x> <y> <z>] - 设置一个出生点在玩家登录过程中将他们临时传送至此
  • /auth remove <uuid> - 将用户数据从数据库中删除
  • /auth update <uuid> <password> -更新用户密码
  • /auth register <uuid> <password> - 注册一个新用户
  • /auth uuid <player> - 以小写形式输入玩家昵称将给出该昵称的离线 uuid
  • /auth addToForcedOffline <player> - 将玩家添加至强制离线列表
  • /auth list - 列出所有已注册玩家

使用正版验证

  1. 在server.properties中将online-mode更改为true,开启正版验证
  2. 在EasyAuth的配置文件(mods/EasyAuth/main.conf)中将premiumAutologin设置为true
  3. 正版玩家将拥有正版uuid
  4. 通过强制离线列表让某正版账户用户名使用离线uuid方式认证(在和正版用户重名时使用)

其他配置

maxLoginTries-设置为3

spawnOnJoin-设置为true让登录时传送到某一位置

MOD-Skin Restorer

模组地址——服务端

让玩家可以自定义皮肤,也可以正常显示正版玩家的皮肤。

使用方法:

  • 正版皮肤:/skin set mojang <username> [<targets>]-为玩家名,target可选(默认自己)
  • ely.by皮肤:/skin set ely.by <username> [<targets>]-使用Ely.by网站的皮肤
  • 网页皮肤:/skin set web (classic|slim) "<url>" [<targets>]-使用的皮肤文件,classic|slim选择粗还是细皮肤
  • 刷新皮肤:/skin refresh [<targets>]
  • 清除皮肤:/skin clear [<targets>]
  • 重置皮肤(变回默认):/skin reset [<targets>]

配置文件

  • language-设置为zh_cn

由于其最新的2.2.0版本存在阻止服务端退出的bug,请使用2.2.1版本。

MOD-Easy WhiteList

模组地址——服务端

一个简单的mod,将白名单、封禁、op列表从基于UUID修改为基于用户名,方便离线玩家的可变UUID,解决添加白名单后依然不在白名单的问题。

命令

  • /easywhitelist add <username>
  • /easywhitelist remove <username>
  • /easyban <username>
  • /easyop <username>
  • /easydeop <username>

配置文件

whitelist.json ops.json banned-players.json 中依然包含用户名和UUID,但UUID不会被使用(格式要对)

MOD-Servux

模组地址——服务端

用于给MiniHUD发送结构边界框,配合客户端MiniHUD模组使用。

MOD-Syncmatica

模组地址——服务端、客户端

前置mod:Litematica(投影)、[MaLiLib]Masa’s Litemod (服务器不需要)

共享原理图mod,实现服务器原理图共享。

使用方法

客户端在已经加载的原理图列表按下Shift并点击Share即可上传到服务器。

其他玩家打开View Syncmatica点击Download即可加载,用Unload删除。

配置文件

需要注意的是config/syncmatic/config.jsonquota决定了是否开启原理图的大小限制,单位为字节。

MOD-Carpet

模组地址——服务端

大名鼎鼎的地毯mod。

常用命令

网上教程很多这里不再赘述,这里给出几个重要的。

/carpet列出所有功能

/carpet <function name> [<value>]设置某项功能的值

/carpet setDefault/removeDefault <function name> [<value>]同上,但永久设置

/carpet list <query>根据query查找功能

配置文件

/carpet carpetCommandPermissionLevel [<value>]-设置命令需要的权限级别如默认的ops

修改配置选项

  • language-设置为zh_cn设置为中文
  • commandPlayer-设为true让所有人都可以召唤假人(默认只有ops)
  • ctrlQCraftingFix-设置为true让工作台合成格可以Ctrl+Q合成丢出物品
  • flippinCactus-设置为true让玩家能用仙人掌翻转方块
  • lagFreeSpawning-设置为true减少刷怪需要的CPU和内存
  • xpNoCooldown-设置为true让玩家吸收经验球没有冷却

MOD-Carpet Extra-Carpet扩展(暂不加)

模组地址——服务端

前置:Carpet

地毯扩展,添加了一些其他的规则特性。

修改配置选项

accurateBlockPlacement-修改为true使能方块精准放置功能

MOD-CarpetTISAdditon-Carpet扩展

模组地址——服务端

扩展,主要添加了其他规则特性。

修改配置选项

fakePlayerNamePrefix-设置为#none不添加前缀,设置为bot_

farmlandTrampledDisabled-设置为true禁止耕地被踩坏

turtleEggTrampledDisabled-设置为true禁止海龟蛋被踩坏

MOD-GugleCarpetAddition-Carpet扩展

模组地址——服务端

扩展,主要添加了可以打开假人背包。

修改配置选项

openFakePlayerInventory-设为true允许打卡假人背包

fakePlayerAutoReplenishment-设置为true允许假人自动补货

fakePlayerAutoReplaceTool-设置为true允许假人自动替换工具

fakePlayerAutoFish-设置为true允许假人自动钓鱼

MOD-[PCA]Plusls Carpet Addition-Carpet扩展(弃用)

模组地址——服务端、客户端

前置:Carpet、MagicLib

主要添加了PCA同步协议,供客户端的一些mod如Tweakeroo,Masa Gadget,BBOR等来显示一些信息。

修改配置选项

pcaSyncProtocol-设置为true开启PCA,目前被Masa Gadget用于实现多人游戏容器预览。

pcaSyncPlayerEntity-设置为ops_and_self修改同步权限

quickLeafDecay-设置为true开启树叶快速腐烂

  • 更新:使用pca-protocal代替,只实现PCA并且不需要前置。

问题汇总

无法pull镜像

如果无法pull,可以使用离线的镜像save包,如准备的docker-openjdk17.tar文件,输入以下命令从离线文件中导入:

1
docker load -i docker-openjdk17.tar

参考资料

Minecraft 1.21.1游戏服务器运维笔记

MC全版本文件下载

docker教程

MCDReforged

MCDR的docker

追加端口映射

暴力修改Docker容器的启动命令