MC-生电服务器搭建和维护
本文记录了在docker中搭建我的世界基友生电服的过程,并给出相应组件的使用维护教程。
环境信息
- MC版本:1.20.1
- jdk:openjdk:17
准备
首先需要准备以下文件和环境:
- dorker,包含ubuntu镜像
- python>3.8
- 在这个网站准备好.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 | docker ps -a #查看所有容器的状态 |
常见状态有:
- Up:运行中,容器正在运行,可通过stop停止
- paused:暂停,使用pause unpause命令进行控制
- exited:停止,没有运行,可以通过start/restart启动
启动与关闭容器
1 | docker start MC1201 |
导出和导入
导出容器到文件:
1 | docker export 1e560fca3906 > ubuntu.tar |
1e560fca3906为容器id
从上面的文件导入到镜像:
1 | cat docker/ubuntu.tar | docker import - test/ubuntu:v1 |
该方法与镜像的save load不一样不要搞混。
服务端
安装运行环境
依次执行以下命令:
1 | docker exec -it -u 0 MC1201 apt-get update |
该命令使用-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文件夹中。
配置文件,其中最重要包括:
- language:语言
- start_command:启动命令
- handler:处理方式
- encoding, decoding:终端语言
这里先如下配置:
1 | language: zh_cn #修改为中文 |
之后,启动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 |
|
然后修改MCDR:
1 | start_command: ./start.sh |
安装插件和mod
使用!!MCDR plg
来处理插件,插件存放在plugins文件夹中,mod放在服务端mods中。
管理服务器
一般来说,我们会用-d
参数让服务器在后台运行,但对于上面的容器来说,这样就无法进入到服务器终端了,使用attach命令会进入run时创建的终端。那么想要管理服务器,有两种方法:
使用RCON
修改服务器server.properties文件:
1 | rcon.port=25575 |
之后可以使用网页端工具(安全性未知),或者客户端工具使用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 | "Path":"/usr/local/bin/mcdreforged" |
然后重启服务:
1 | service docker start |
之后使用start命令就可以直接启动服务器了,同时使用attack就可以进入到服务器终端。
如果想在启动时进入终端,可以加上-a -i
参数。
配置、插件、mod与教程
server.properties
除了上面的RCON外,还需要注意以下几项配置:
1 | enforce-secure-profile=false #聊天的身份签名,需要关闭 |
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 | // 根配置 |
设置备份目标。
1 | // 根配置 |
推荐使用”xxh128”,”zstd”。
1 | // root config |
修改为true启用。
1 | { |
permission-所有子命令所需的 MCDR 权限等级 的最低权限级别。
backup_on_restore-是否进行回档前临时备份
1 | { |
定时备份配置:
interval-时间间隔
reset_timer_on_backup-手动备份则重置计时
1 | { |
备份清理功能配置:
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
- 列出所有已注册玩家
使用正版验证
- 在server.properties中将
online-mode
更改为true,开启正版验证 - 在EasyAuth的配置文件(
mods/EasyAuth/main.conf
)中将premiumAutologin
设置为true - 正版玩家将拥有正版uuid
- 通过强制离线列表让某正版账户用户名使用离线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.json
中quota
决定了是否开启原理图的大小限制,单位为字节。
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 |