中文 | English
一个超级完善的MCDR插件,可通过多种方式对镜像服进行控制与进行文件同步
- 插件支持通过MCSManager控制镜像服,也可以不依赖MCSM,直接通过终端或RCON对镜像服进行控制(
v1.3.0+
)- MCSM控制:支持
MCSM-v9.9.0
MCSM-v10.2.1+
- 终端或RCON控制:支持
Windows
Linux
系统
- MCSM控制:支持
- 完善的多镜像服控制操作,获取运行状态/启动/停止/强制终止/同步
- 基于哈希的文件同步,只同步镜像服与源服务端不同的文件
- 高可自定义的、配置友好配置文件,多个镜像服配置时只需要书写变化的值
[注意] 本插件不提供服务端创建/管理功能,请在镜像服创建完成并创建对应的MCSManager实例后再使用本插件。同样,本插件不提供镜像服启动/关闭成功的提示信息,建议搭配vchat等插件使用。
Python
xxhash>=3
系统
当使用terminal启动镜像服且系统为Linux
时:需要screen
指令前缀默认为!!mirror
, 控制多个镜像服时将通过指令前缀区分, 详见配置文件
!!mirror
显示指令帮助
!!mirror help
显示指令帮助
!!mirror status
获取镜像服实例运行状态,状态未知/已停止/正在停止/正在启动/正在运行
!!mirror start
启动镜像服实例
!!mirror stop
停止镜像服实例
!!mirror kill
强制终止镜像服实例
!!mirror sync
进行文件同步
!!mirror confirm
确认某指令的操作
!!mirror reload
热重载对应镜像服的配置文件
此配置文件较长。我们建议你阅读快速开始来完成初步的配置。若你需要查找某一具体配置项的解释,你可以阅读下文。
配置文件在v1.1.0
支持了热重载, 同时添加了更完善的属性补全功能。当新版本的配置文件中新增了某一选项, 插件将会自动将默认值填写到你的旧配置文件中, 而不需要手动添加。
{
"!!mirror": {
"mcsm": {/* MCSManager配置 */},
"terminal": {/* 通过命令行启动镜像服终端的配置 */},
"rcon": {/* RCON配置 */},
"sync": {/* 存档同步配置 */},
"command": {
"permission": {/* 指令权限配置 */},
"action": {/* 指令行为配置 */}
},
"display": {/* 显示配置 */}
}
}
在此参数下配置该镜像服的所有配置,同时,此参数也是控制该镜像服的指令前缀。
要添加新的镜像服,如需要通过!!mirror2
控制镜像服2,在配置文件中再添加一个"!!mirror2"
即可。
配置文件中的第一个镜像服设置的参数将同时被设置为默认配置,在之后的镜像服的配置文件中,只需要写变化的参数值即可。
例
镜像服1为!!mirror
,同时也是其他镜像服的默认配置文件,那么将!!mirror
放在配置文件中的第一个
通过!!mirror2
控制镜像服2,并设置!!mirror2
的实例id为abc123
,将!!mirror2
的服务端名称改为Mirror2
{
"!!mirror": {
// ...
},
"!!mirror2": {
"mcsm": {
"uuid": "abc123"
},
"display": {
"server_name": "Mirror2"
}
}
}
其中,在!!mirror2
中未设置的参数将会自动地从第一个设置的!!mirror
中继承,例如!!mirror2
中并未设置mcsm
的url
,那么它将继承自!!mirror
中的mcsm
的url
,即"http://127.0.0.1:23333/"
完整的示例详见多镜像服配置文件示例
此配置部分若有疑问,请参见MCSManager官方文档
"mcsm": {
"enable": false,
"url": "http://127.0.0.1:23333/",
"uuid": null,
"remote_uuid": null,
"apikey": null
}
启用MCSM后,终端与RCON都会弃用。
enable bool
- 是否启用MCSM,你需要在配置完成此部分后将此选项设置为
true
。
url str
- MCSManager面板的访问地址,即请求api的地址。
uuid str
- 服务端实例的id,即实例显示的UID。
remote_uuid str
- 远程节点的id,即实例显示的GID。
apikey str
- 调用API接口必需的密钥,通常在用户界面可以查看。
"terminal": {
"enable": false,
"launch_path": "./Mirror",
"launch_command": "python -m mcdreforged",
"port": null,
"terminal_name": "Mirror",
"regex_strict": false,
"system": null
}
在Windows系统下,插件将创建一个新的命令行终端来运行镜像服;在Linux系统下,插件将创建一个新的screen来运行镜像服。镜像服停止后,终端/screen都会自动关闭。
如果你无法通过此命令启动镜像服,尝试按以下步骤检查。其中terminal_name
launch_command
都为配置文件中对应key的值
- 在
launch_path
下执行launch_command
,并确认能够使镜像服正常启动 - Linux用户检查是否安装了
screen
,Windows用户检查终端中输入python
是否能正常启动Python - 若以上两项都不能解决,则在当前服务端的MCDR根目录下执行对应系统的完整命令,并检查命令回显
- Linux
cd "{launch_path}"&&screen -dmS {terminal_name}&&screen -x -S {terminal_name} -p 0 -X stuff "{launch_command}&&exit\n"
- Windos
cd "{launch_path}"&&start cmd.exe cmd /C python -c "import os;os.system('title {terminal_name}');os.system('{launch_command}')"
- Linux
注意:在Linux系统下,插件可以通过screen关闭镜像服。在Windows系统下,你必须设置MCSM或RCON才能通过插件关闭镜像服。
enable bool
- 是否启用终端,当MCSM未启用且此选项为
true
时将通过终端启动镜像服。
launch_path str
- 执行启动命令的路径,通常为镜像服所在的目录。
launch_command str
- 需要执行的启动命令,若简单的启动命令无法满足需求,你可以创建一个
.bat
(或.sh
)文件,并将启动命令写在该文件中,然后执行该文件。
port int
- 镜像服运行的端口,插件将通过检查端口状态的方法检查镜像服的运行状态。
terminal_name str
- 新终端的标题或新screen的名称,便于镜像服运维。
regex_strict bool
- 在通过端口检查镜像服运行状态时,是否在找到端口后继续验证进程名必须为
java.exe
。一般情况下无需开启。若不同的进程在不同时间可能同时占用了设置的端口,例如在某一时间段Minecraft运行在端口port
上,另一时间段有其他程序运行在端口port
上而Minecraft没有运行,那么此选项可以一定程度上避免将其他进程误判为java进程。
system str
- 系统类型,若为
null
则将自动获取系统类型。可选:Linux
Windows
(需首字母大写)
"rcon": {
"enable": false,
"address": null,
"port": null,
"password": null
}
enable bool
- 是否启用RCON,当MCSM未启用时,插件将通过RCON执行
stop
指令和获取镜像服状态。若同时启用了RCON和终端,插件将优先通过检查RCON状态来获取镜像服状态,若RCON未连接,则将通过检查端口来获取状态。若RCON状态与端口状态不匹配将会提示。
address str
- RCON的连接地址,不包含端口。
port int
- RCON的连接端口
password str
- RCON的连接密码
"sync": {
"world": [
"world"
],
"source": "./server",
"target": [
"./Mirror/server"
],
"ignore_inexistent_target_path": false,
"concurrency": 4,
"ignore_files": [
"session.lock"
]
}
在sync
中,./
即指服务端所在的MCDReforged
根目录。
mcdr_root (./)
├─ config
├─ logs
├─ plugins
├─ server (./server)
| └─ world
└─ Mirror
└─ server (./Mirror/server)
└─ world
world list
- 需要同步的目录,当存档有多个世界文件时需要添加
source str
- 源服务端目录,通常应为MCDR的工作目录,即默认情况下的
server
目录。文件由source/world
同步至==>target/world
target str, list
- 目标服务端目录, 只有一个目录时可只写字符串, 多个目录需为列表。将会为每个目标目录都同步一份源目录的文件。默认情况下镜像服的MCDR工作目录位于当前MCDR的根目录下的
Mirror
目录。
ignore_inexistent_target_path bool
- 若某个目标服务端目录不存在,当设置为
false
时,将会跳过对该目录的同步。当设置为true
时,将会新建该目录并继续同步
concurrency int
- 同步时进行哈希计算的线程数
ignore_files list
- 不进行同步的文件,若使用
carpet
模组和plus-carpet-addition(PCA)
模组,建议添加"carpet.conf"
"pca.conf"
"command": {
"permission": {/* 指令权限配置 */},
"action": {/* 指令行为配置 */}
}
"permission": {
"status": 0,
"start": 0,
"stop": 2,
"kill": 3,
"sync": 2,
"confirm": 0,
"abort": 0
}
int
- 执行各指令所需的最低MCDR权限等级
"action": {
"status": {
"require_confirm": false
},
"start": {
"require_confirm": false
},
"stop": {
"require_confirm": true
},
"kill": {
"require_confirm": true
},
"sync": {
"ensure_server_closed": true,
"auto_server_restart": false,
"check_status_interval": 5,
"max_attempt_times": 3,
"save_world": {/* 保存世界配置 */},
"require_confirm": true
},
"confirm": {
"timeout": 30,
"cancel_anymsg": true
},
"abort": {
"operator": "everyone"
}
}
require_confirm bool
- 当此选项为
true
时, 执行该指令后需要输入!!mirror confirm
以确认操作
ensure_server_closed bool
- 当此选项为
true
时, 同步时将会检查镜像服是否已停止。当此选项为false
时, 无论镜像服是否停止, 都将直接进行同步。
auto_server_restart bool
- 此选项仅在
ensure_server_closed
为true
时生效。当此选项为true
时, 如果同步时镜像服未停止, 那么将在尝试自动停止镜像服后进行同步, 并在同步完成后自动重启镜像服
check_status_interval int
- 此选项仅在
auto_server_restart
生效时生效。同步时停止镜像服后, 插件需确认镜像服是否已停止。此选项为检查镜像服状态的时间间隔
max_attempt_times int
- 此选项仅在
auto_server_restart
生效时生效。检查镜像服状态的尝试次数, 超过此尝试次数后将不再尝试检查镜像服状态, 并输出自动关闭失败
及镜像服当前状态信息。等效于超时时间timeout = check_status_interval * max_attempt_times
save_world 保存世界配置 一般无需更改
"save_world": {
"turn_off_auto_save": true,
"commands": {
"save_all_worlds": "save-all flush",
"auto_save_off": "save-off",
"auto_save_on": "save-on"
},
"saved_world_regex": "^Saved the game$",
"save_world_max_wait_sec": 60
}
turn_off_auto_save bool
- 保存世界时关闭自动保存
commands 相关指令
- save_all_worlds
str
- 保存世界的指令
- auto_save_off
str
- 关闭自动保存的指令
- auto_save_on
str
- 开启自动保存的指令
saved_world_regex str
- 匹配服务端"世界保存完成"日志的正则表达式
save_world_max_wait_sec int
- 保存世界的最大等待时间(秒),超时将会跳过世界保存并进行同步
玩家只能确认自己执行的指令
timeout int
- 需确认的指令经过多少秒后超时取消。若执行某指令后超过
timeout
秒后, 该玩家未进行任何操作, 则此指令超时,自动取消
cancel_anymsg bool
- 若玩家执行某指令后发送了除
confirm
指令外的消息, 则此指令操作自动取消。除此之外, 若玩家执行了某指令后又执行了对应镜像服的其他指令, 则先前执行的指令自动取消
此功能仍在开发
"display": {
"server_name": "Mirror"
}
server_name str
- "镜像服"的名称,用以在显示时区分不同的镜像服
{
"!!mirror": {
"mcsm": {
"enable": true,
"url": "http://127.0.0.1:23333/",
"uuid": "71154??????????0a1a2f4dd90695609",
"remote_uuid": "6e927??????????999f0e66bc404071b",
"apikey": "b8f???????????????????????????ade"
},
"terminal": {
"enable": false,
"launch_path": "./Mirror",
"launch_command": "python -m mcdreforged",
"port": null,
"terminal_name": "Mirror",
"regex_strict": false,
"system": null
},
"rcon": {
"enable": false,
"address": null,
"port": null,
"password": null
},
"sync": {
"world": [
"world"
],
"source": "./server",
"target": [
"./Mirror/server"
],
"ignore_inexistent_target_path": false,
"concurrency": 4,
"ignore_files": [
"session.lock"
]
},
"command": {
"permission": {
"status": 0,
"start": 0,
"stop": 2,
"kill": 3,
"sync": 2,
"confirm": 0,
"abort": 0
},
"action": {
"status": {
"require_confirm": false
},
"start": {
"require_confirm": false
},
"stop": {
"require_confirm": true
},
"kill": {
"require_confirm": true
},
"sync": {
"ensure_server_closed": true,
"auto_server_restart": true,
"check_status_interval": 5,
"max_attempt_times": 3,
"save_world": {
"turn_off_auto_save": true,
"commands": {
"save_all_worlds": "save-all flush",
"auto_save_off": "save-off",
"auto_save_on": "save-on"
},
"saved_world_regex": "^Saved the game$",
"save_world_max_wait_sec": 60
},
"require_confirm": true
},
"confirm": {
"timeout": 30,
"cancel_anymsg": true
},
"abort": {
"operator": "everyone"
}
}
},
"display": {
"server_name": "Mirror"
}
},
"!!mirror2": {
"mcsm": {
"uuid": "83011??????????49c1133fc08a41b80"
},
"sync": {
"target": [
"./Mirror2/server"
]
},
"display": {
"server_name": "Mirror2"
}
},
"!!mirror3": {
"mcsm": {
"enable": false
},
"sync": {
"target": [
"./Mirror3/server"
]
},
"terminal": {
"enable": true,
"launch_path": "./Mirror3",
"port": 30002,
"terminal_name": "Mirror3"
},
"rcon": {
"enable": true,
"address": "127.0.0.1",
"port": 31002,
"password": "p@ssw0rd"
}
}
}
- 哈希比对思路 / better_backup
- 配置文件权限配置思路 / PrimeBackup
- 保存世界思路 / QuickBackupM
- 指令执行确认
- 指令执行延迟
- 禁止同步
!!mirror sync enable/disable reason
- lang语言文件
- 指令禁用
- RCON支持
- 无MCSM下通过命令行启动服务端
- Linux/Windows通过终端执行
kill
指令 - 历史同步记录显示