diff --git a/.gitignore b/.gitignore index 5b443b9..1dc7e63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,25 @@ -# Build and Release Folders -bin-debug/ -bin-release/ -[Oo]bj/ -[Bb]in/ - -# Other files and folders -.settings/ - -# Executables -*.swf -*.air -*.ipa -*.apk - -# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` -# should NOT be excluded as they contain compiler settings and other important -# information for Eclipse / Flash Builder. - -# Remove old cli sh -cli_old.sh - -.idea +# Build and Release Folders +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. + +# Remove old cli sh +cli_old.sh + +.idea + +design.txt \ No newline at end of file diff --git a/daemon/setup.sh b/daemon/setup.sh index a0ed362..c5d4c85 100644 --- a/daemon/setup.sh +++ b/daemon/setup.sh @@ -44,6 +44,11 @@ Red_Error() { } Install_Node() { + if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then + echo_green "Node.js version is up-to-date, skipping installation." + return + fi + echo_cyan_n "[+] Install Node.JS environment...\n" rm -irf "$node_install_path" diff --git a/daemon/setup_cn.sh b/daemon/setup_cn.sh index aacb7b4..aec9b51 100644 --- a/daemon/setup_cn.sh +++ b/daemon/setup_cn.sh @@ -8,7 +8,7 @@ node="v20.12.2" arch=$(uname -m) if [ "$(id -u)" -ne 0 ]; then - echo "This script must be run as root. Please use \"sudo bash\" instead." + echo "这个脚本必须使用root权限运行。 请使用 \"sudo bash\" 替代它" exit 1 fi @@ -32,7 +32,7 @@ echo_yellow() { # script info echo_cyan "+---------------------------------------------------------------------- -| MCSManager 安装脚本 (MCSManager Installer) +| MCSManager Daemon安装脚本 (MCSManager Installer) +---------------------------------------------------------------------- " @@ -44,25 +44,30 @@ Red_Error() { } Install_Node() { - echo_cyan_n "[+] Install Node.JS environment...\n" + if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then + echo_green "Node.js version is up-to-date, skipping installation." + return + fi + + echo_cyan_n "[+] 安装 Node.JS...\n" rm -irf "$node_install_path" - cd /opt || Red_Error "[x] Failed to enter /opt" + cd /opt || Red_Error "[x] 未能进入 /opt" rm -rf "node-$node-linux-$arch.tar.gz" # wget "https://nodejs.org/dist/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to download node release" - wget "https://registry.npmmirror.com/-/binary/node/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to download node release" + wget "https://registry.npmmirror.com/-/binary/node/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] 未能下载node" tar -zxf "node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to untar node" rm -rf "node-$node-linux-$arch.tar.gz" if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then - echo_green "Success" + echo_green "完成" else - Red_Error "[x] Node installation failed!" + Red_Error "[x] Node 安装失败!" fi echo @@ -76,7 +81,7 @@ Install_Node() { } Install_MCSManager() { - echo_cyan "[+] Install MCSManager..." + echo_cyan "[+] 安装 MCSManager..." # stop service systemctl disable --now mcsm-{web,daemon} @@ -85,13 +90,13 @@ Install_MCSManager() { rm -rf /etc/systemd/system/mcsm-daemon.service systemctl daemon-reload - mkdir -p "${mcsmanager_install_path}" || Red_Error "[x] Failed to create ${mcsmanager_install_path}" + mkdir -p "${mcsmanager_install_path}" || Red_Error "[x] 未能创建 ${mcsmanager_install_path}" # cd /opt/mcsmanager - cd "${mcsmanager_install_path}" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}" + cd "${mcsmanager_install_path}" || Red_Error "[x] 未能进入 ${mcsmanager_install_path}" # download MCSManager release - wget "${mcsmanager_download_addr}" -O "${package_name}" || Red_Error "[x] Failed to download MCSManager" + wget "${mcsmanager_download_addr}" -O "${package_name}" || Red_Error "[x] 未能下载 MCSManager" tar -zxf ${package_name} -o || Red_Error "[x] Failed to untar ${package_name}" rm -rf "${mcsmanager_install_path}/${package_name}" @@ -104,7 +109,7 @@ Install_MCSManager() { # echo "[→] cd daemon" cd "${mcsmanager_install_path}/daemon" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}/daemon" - echo_cyan "[+] Install MCSManager-Daemon dependencies..." + echo_cyan "[+] 安装 MCSManager-Daemon 依赖库..." env "$node_install_path"/bin/node "$node_install_path"/bin/npm install --registry=https://registry.npmmirror.com --production --no-fund --no-audit &>/dev/null || Red_Error "[x] Failed to npm install in ${mcsmanager_install_path}/daemon" echo @@ -112,7 +117,7 @@ Install_MCSManager() { echo_green "Daemon: ${mcsmanager_install_path}/daemon" echo_yellow "=============== MCSManager ===============" echo - echo_green "[+] MCSManager installation success!" + echo_green "[+] MCSManager 安装完成!" chmod -R 755 "$mcsmanager_install_path" @@ -120,7 +125,7 @@ Install_MCSManager() { } Create_Service() { - echo_cyan "[+] Create MCSManager service..." + echo_cyan "[+] 创建 MCSManager 服务..." echo "[Unit] Description=MCSManager-Daemon @@ -177,17 +182,17 @@ elif [[ $arch == s390x ]]; then arch=s390x #echo "[-] IBM LinuxONE architecture detected" else - Red_Error "[x] Sorry, this architecture is not supported yet!\n[x]Please try to install manually: https://github.com/MCSManager/MCSManager#linux" + Red_Error "[x] 对不起,这个架构目前还不受支持!\n[x]请尝试手动安装: https://github.com/MCSManager/MCSManager#linux" fi # Define the variable Node installation directory node_install_path="/opt/node-$node-linux-$arch" # Check network connection -echo_cyan "[-] Architecture: $arch" +echo_cyan "[-] 架构: $arch" # Install related software -echo_cyan_n "[+] Installing dependent software (git, tar, wget)... " +echo_cyan_n "[+] 正在安装依赖软件 (git, tar, wget)... " if [[ -x "$(command -v yum)" ]]; then yum install -y git tar wget elif [[ -x "$(command -v apt-get)" ]]; then @@ -197,14 +202,14 @@ elif [[ -x "$(command -v pacman)" ]]; then elif [[ -x "$(command -v zypper)" ]]; then zypper --non-interactive install git tar wget else - echo_red "[!] Cannot find your package manager! You may need to install git, tar and wget manually!" + echo_red "[!] 找不到你的软件包管理器! 你需要去安装 git, tar 和 wget!" fi # Determine whether the relevant software is installed successfully if [[ -x "$(command -v git)" && -x "$(command -v tar)" && -x "$(command -v wget)" ]]; then - echo_green "Success" + echo_green "完成" else - Red_Error "[x] Failed to find git, tar and wget, please install them manually!" + Red_Error "[x] 找不到 git, tar 和 wget, 请先安装它们!" fi # Install the Node environment diff --git a/market-v2.json b/market-v2.json new file mode 100644 index 0000000..33c22a6 --- /dev/null +++ b/market-v2.json @@ -0,0 +1,1614 @@ +{ + "languages": [ + { + "label": "English", + "value": "en_us", + "path": "templates-en.json" + }, + { + "label": "中文", + "value": "zh_cn", + "path": "templates-zh.json" + } + ], + "packages": [ + { + "title": "Squad Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "use the official Docker image of Squad Server to quickly get started!", + "image": "https://squadovo.cn/img/header.jpg", + "gameType": "Squad", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "Intel Core platform、RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./SquadGameServer.sh", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 403240 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Squad" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7787/udp", + "{mcsm_port2}:15000/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Rust Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Rust Dedicated Server.", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/rust.jpg", + "gameType": "Rust", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Commercial Use Allowed", + "Docker version" + ], + "setupInfo": { + "startCommand": "./RustDedicated -batchmode -nographics +server.port 28015 +rcon.port 28016", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 258550 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Rust" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:28015/udp", + "{mcsm_port2}:28016/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Factorio Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Factorio Dedicated Server.", + "image": "https://cdn.factorio.com/assets/img/web/factorio-logo2.png", + "gameType": "Factorio", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "X86_64、RAM 4G+", + "size": "", + "targetLink": "", + "author": "TPing", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./bin/x64/factorio --start-server-load-latest", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 427520 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Factorio" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:34197/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://hytale.com/static/images/logo.png", + "gameType": "Hytale", + "description": "Use Eclipse Temurin Java Docker image to run Hytale Dedicated Server.", + "title": "Hytale Docker Server", + "category": "hytale", + "runtime": "Linux", + "hardware": "RAM 4G+", + "targetLink": "https://github.com/SkyKingPX/Hytale-Server-Installer/releases/download/1.0.0/hytale-server-installer-linux-mcsm.zip", + "author": "SkyKing_PX", + "tags": [ + "Docker version" + ], + "setupInfo": { + "type": "hytale", + "startCommand": "java -Xms2G -Xmx4G -XX:AOTCache=HytaleServer.aot -jar HytaleServer.jar --assets Assets.zip", + "stopCommand": "stop", + "updateCommand": "./hytale-server-installer-linux", + "ie": "UTF-8", + "oe": "UTF-8", + "processType": "docker", + "docker": { + "image": "eclipse-temurin:25-jdk", + "updateCommandImage": "eclipse-temurin:25-jdk", + "ports": [ + "{mcsm_port1}:5520/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Terraria Server", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Terraria Dedicated Server.", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/terraria.webp", + "gameType": "Terraria", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./TerrariaServer.bin.x86_64 -port 7777 -autocreate 2 -worldname world1", + "stopCommand": "exit", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 105600 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/terraria", + "tag": [ + "terraria" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7777/tcp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Palworld Server", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Palworld Dedicated Server.", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/palworld.webp", + "gameType": "Palworld", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./PalServer.sh -port=8211 -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 2394010 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Palworld" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:8211/udp", + "{mcsm_port2}:25575/tcp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Project Zomboid", + "title-zh": "僵尸毁灭工程", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Project Zomboid Dedicated Server.", + "description-zh": "使用 steam-game-runtime Docker 镜像和 SteamCMD 运行 Project Zomboid 专用服务器。", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/pzomboid.webp", + "gameType": "Zombie Survival", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./start-server.sh", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 380870 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Project Zomboid" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:16261/udp", + "{mcsm_port2}:16262/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Satisfactory Docker Server", + "title-zh": "幸福工厂 Docker 服务器", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Satisfactory Dedicated Server.", + "description-zh": "使用 steam-game-runtime Docker 镜像和 SteamCMD 运行幸福工厂专用服务器。", + "image": "https://cdn.cloudflare.steamstatic.com/steam/apps/526870/header.jpg", + "gameType": "Satisfactory", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./FactoryServer.sh", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 1690800 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Satisfactory" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7777/tcp", + "{mcsm_port2}:7777/udp", + "{mcsm_port3}:8888/tcp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "7 Days to Die Docker Server", + "title-zh": "七日杀 Docker 服务器", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run 7 Days to Die Dedicated Server.", + "description-zh": "使用 steam-game-runtime Docker 镜像和 SteamCMD 运行七日杀专用服务器。", + "image": "https://cdn.cloudflare.steamstatic.com/steam/apps/251570/header.jpg", + "gameType": "7 Days to Die", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 12G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./startserver.sh -configfile=serverconfig.xml", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 294420 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "7 Days to Die" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:26900/udp", + "{mcsm_port2}:26900/tcp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Left 4 Dead 2 Docker Server", + "title-zh": "求生之路2 Docker 服务器", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run Left 4 Dead 2 Dedicated Server.", + "description-zh": "使用 steam-game-runtime Docker 镜像和 SteamCMD 运行求生之路2专用服务器。", + "image": "https://cdn.cloudflare.steamstatic.com/steam/apps/550/header.jpg", + "gameType": "Left 4 Dead 2", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 4G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./srcds_run -game left4dead2 -port 27015 +maxplayers 8 +map c1m4_atrium", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 222860 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Left 4 Dead 2" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:27015/udp", + "{mcsm_port2}:27015/tcp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "ARK: Survival Evolved Docker Server", + "title-zh": "方舟:生存进化 Docker 服务器", + "language": "en_us", + "platform": "Linux", + "description": "Use the steam-game-runtime Docker image and SteamCMD to run ARK: Survival Evolved Dedicated Server.", + "description-zh": "使用 steam-game-runtime Docker 镜像和 SteamCMD 运行方舟:生存进化专用服务器。", + "image": "https://cdn.cloudflare.steamstatic.com/steam/apps/346110/header.jpg", + "gameType": "ARK: Survival Evolved", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./ShooterGame/Binaries/Linux/ShooterGameServer Ragnarok?listen?Port=7777?QueryPort=27015?MaxPlayers=120?bRawSockets?AllowCrateSpawnsOnTopOfStructures=True -UseBattlEye -nosteamclient -game -server -log", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 376030 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "ARK" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7777/udp", + "{mcsm_port2}:7778/udp", + "{mcsm_port3}:27015/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "EndStone MC Server", + "language": "en_us", + "platform": "Linux", + "description": "For Linux, using the official EndStone MC Docker image, one-click to quickly set up the server!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/endstone_mc.webp", + "gameType": "Minecraft", + "category": "Latest Version", + "runtime": "Ubuntu/Centos LTS", + "hardware": "RAM 2G+", + "size": "", + "targetLink": "", + "author": "EndStone", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "endstone -y -s .", + "stopCommand": "stop", + "ie": "utf8", + "oe": "utf8", + "type": "minecraft/bedrock", + "tag": [ + "bedrock" + ], + "fileCode": "utf8", + "processType": "docker", + "updateCommand": "", + "docker": { + "image": "endstone/endstone:latest", + "containerName": "endstone-server", + "ports": [ + "{mcsm_port1}:19132/udp" + ], + "extraVolumes": [], + "workingDir": "", + "env": [], + "changeWorkdir": true + } + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.11 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.11", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.11/builds/39/downloads/paper-1.21.11-39.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.11-39.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.10 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.10", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.10/builds/117/downloads/paper-1.21.10-117.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.10-117.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.8 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.8", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/60/downloads/paper-1.21.8-60.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-60.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.4", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "50MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/232/downloads/paper-1.21.4-232.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.4-232.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.1 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.1", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/133/downloads/paper-1.21.1-133.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.1-133.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.11", + "category": "mc-purpur", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.11-2538.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.11-2538.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.10", + "category": "mc-purpur", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.10-2535.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.10-2535.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.8", + "category": "mc-purpur", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.8-2497.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.8-2497.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.4", + "category": "mc-purpur", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "50MB", + "remark": "Only Purpur included", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.4-2416.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.4-2416.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.11", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.0.3/forge-1.21.11-61.0.3-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.11-61.0.3-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.11", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.0.3/forge-1.21.11-61.0.3-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.11-61.0.3-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.10", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.10-60.1.5/forge-1.21.10-60.1.5-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.10-60.1.5-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.10", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.10-60.1.5/forge-1.21.10-60.1.5-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.10-60.1.5-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.8", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.1.9/forge-1.21.8-58.1.9-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.8-58.1.9-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.8", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.1.9/forge-1.21.8-58.1.9-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.8-58.1.9-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.4", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.8/forge-1.21.4-54.1.8-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.4-54.1.8-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.4", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.8/forge-1.21.4-54.1.8-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.4-54.1.8-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.1", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.6/forge-1.21.1-52.1.6-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.1-52.1.6-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.1", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.6/forge-1.21.1-52.1.6-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.1-52.1.6-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.11", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.11.8-beta/neoforge-21.11.8-beta-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.11.8-beta-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.11", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.11.8-beta/neoforge-21.11.8-beta-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.11.8-beta-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.10", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.10.63/neoforge-21.10.63-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.10.63-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.10", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.10.63/neoforge-21.10.63-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.10.63-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.8", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.52/neoforge-21.8.52-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.8.52-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.8", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.52/neoforge-21.8.52-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.8.52-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.4", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.155/neoforge-21.4.155-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.4.155-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.4", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.155/neoforge-21.4.155-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.4.155-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.1", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.213/neoforge-21.1.213-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.1.213-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.1", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.213/neoforge-21.1.213-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.1.213-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.11", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.11 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.10", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.10 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.8", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.8 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.4", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.4 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.1 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.1", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.1 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.11 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.11", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/64bb6d763bed0a9f1d632ec347938594144943ed/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.10 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.10", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/95495a7f485eedd84ce928cef5e223b757d2f764/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.8 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.8", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Standard Vanilla Minecraft 1.21.4 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.4", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Folia Quick Server Setup, Plugin Support", + "title": "[Folia] Minecraft 1.21.11", + "category": "mc-folia", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Minecraft Folia", + "targetLink": "https://fill-data.papermc.io/v1/objects/f4e9c5c374a53d17b6173cac35242c05c12217b656b6cc5dc07354cc37ec4066/folia-1.21.11-11.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/folia", + "startCommand": "java -Xms4096M -Xmx4096M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -jar folia-1.21.11-11.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Folia Quick Server Setup, Plugin Support", + "title": "[Folia] Minecraft 1.21.8", + "category": "mc-folia", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Minecraft Folia", + "targetLink": "https://fill-data.papermc.io/v1/objects/233843cfd5001b6f658fcab549178d694cc37f0277d004ea295de0a94c57278f/folia-1.21.8-6.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/folia", + "startCommand": "java -Xms4096M -Xmx4096M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -jar folia-1.21.8-6.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + } + ] +} diff --git a/market.json b/market.json index e59f968..711c456 100644 --- a/market.json +++ b/market.json @@ -12,6 +12,104 @@ } ], "packages": [ + { + "language": "zh_cn", + "platform": "ALL", + "description": " Minecraft 1.21.1 快速开服 ", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/wallpaper.webp", + "gameType": "Minecraft", + "title": "[PaperMC] Minecraft 1.21.1 快速开服", + "category": "mc-paper", + "runtime": "Java 17+", + "hardware": "RAM 8G+", + "size": "250MB", + "remark": "包含基础插件,萌新快速开服!低配机器专属!", + "targetLink": "https://cloud.alongw.cn/f/DzvHK/Paper-1.21.1-ZH.zip", + "author": "alongw.cn", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms4096M -Xmx4096M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "zh_cn", + "platform": "ALL", + "description": " 中小型互通服推荐,1.20.4 版本,快速开服,包含ESS、锁箱子、操作回滚、领地商店等基础插件。", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/wallpaper.webp", + "gameType": "Minecraft", + "title": "[PaperMC] Minecraft 1.20.4", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 6G+", + "size": "140MB", + "remark": "支持插件,最低 8GB 内存要求", + "targetLink": "https://url.alww.top/mcsm/paper1.20.4.zip", + "author": "alongw.cn", + "dockerOptional": { + "image": "eclipse-temurin:17-jdk", + "updateCommandImage": "eclipse-temurin:17-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms6144M -Xmx6144M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "泰拉瑞亚服务器", + "language": "zh_cn", + "platform": "Linux", + "description": "适用于 Linux 系统,使用《Terraria》第三方 Docker 镜像,快速开服!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/terraria.webp", + "gameType": "Terraria", + "category": "最新版本", + "runtime": "Ubuntu/Centos LTS", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "可以商业出租", + "Docker 版" + ], + "setupInfo": { + "startCommand": "", + "stopCommand": "exit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/terraria", + "tag": [ + "terraria" + ], + "fileCode": "utf8", + "processType": "docker", + "updateCommand": "", + "docker": { + "image": "ryshe/terraria:latest", + "containerName": "terraria-server", + "ports": [ + "{mcsm_port1}:7777/tcp" + ], + "extraVolumes": [], + "networkMode": "bridge", + "cpuUsage": 100, + "workingDir": "/root/.local/share/Terraria/Worlds", + "env": [], + "changeWorkdir": false + } + } + }, { "title": "幻兽帕鲁官方服务器", "language": "zh_cn", @@ -25,13 +123,18 @@ "size": "", "targetLink": "", "author": "MCSManager", - "tags": ["可以商业出租", "Docker 版"], + "tags": [ + "可以商业出租", + "Docker 版" + ], "setupInfo": { "stopCommand": "stop", "ie": "utf8", "oe": "utf8", "type": "steam/universal", - "tag": ["Palworld"], + "tag": [ + "Palworld" + ], "fileCode": "utf8", "processType": "docker", "updateCommand": "", @@ -41,7 +144,10 @@ "networkMode": "bridge", "containerName": "palworld-server", "workingDir": "/opt/palworld/Pal/Saved", - "ports": ["{mcsm_port1}:8211/tcp", "{mcsm_port2}:25575/tcp"], + "ports": [ + "{mcsm_port1}:8211/tcp", + "{mcsm_port2}:25575/tcp" + ], "env": [ "SERVER_NAME=Private PalWorld Server", "SERVER_DESC=Private PalWorld Server", @@ -63,28 +169,33 @@ "size": "", "targetLink": "", "author": "MCSManager", - "tags": ["可以商业出租", "Docker 版"], + "tags": [ + "可以商业出租", + "Docker 版" + ], "setupInfo": { "startCommand": "", "stopCommand": "stop", "ie": "utf8", "oe": "utf8", "type": "steam/universal", - "tag": ["Project Zomboid"], + "tag": [ + "Project Zomboid" + ], "fileCode": "utf8", "processType": "docker", "updateCommand": "", "docker": { "image": "renegademaster/zomboid-dedicated-server:latest", "containerName": "zomboid-dedicated-server", - "ports": ["{mcsm_port2}:16262/udp", "{mcsm_port1}:16261/udp"], + "ports": [ + "{mcsm_port2}:16262/udp", + "{mcsm_port1}:16261/udp" + ], "extraVolumes": [ "{mcsm_workspace}/ZomboidConfig|/home/steam/Zomboid", "{mcsm_workspace}/ZomboidDedicatedServer|/home/steam/ZomboidDedicatedServer" ], - "memory": 4096, - "networkMode": "bridge", - "cpuUsage": 100, "workingDir": "", "env": [], "changeWorkdir": false @@ -92,40 +203,43 @@ } }, { - "title": "Terraria 服务器", - "language": "zh_cn", + "title": "EndStone MC Server", + "language": "en_us", "platform": "Linux", - "description": "适用于 Linux 系统,使用《Terraria》第三方 Docker 镜像,快速开服!", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/terraria.webp", - "gameType": "Terraria", - "category": "最新版本", + "description": "For Linux, using the official EndStone MC Docker image, one-click to quickly set up the server!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/endstone_mc.webp", + "gameType": "Minecraft", + "category": "Latest Version", "runtime": "Ubuntu/Centos LTS", - "hardware": "RAM 8G+", + "hardware": "RAM 2G+", "size": "", "targetLink": "", - "author": "MCSManager", - "tags": ["可以商业出租", "Docker 版"], + "author": "EndStone", + "tags": [ + "Docker version" + ], "setupInfo": { - "startCommand": "", - "stopCommand": "exit", + "startCommand": "endstone -y -s .", + "stopCommand": "stop", "ie": "utf8", "oe": "utf8", - "type": "steam/terraria", - "tag": ["terraria"], + "type": "minecraft/bedrock", + "tag": [ + "bedrock" + ], "fileCode": "utf8", "processType": "docker", "updateCommand": "", "docker": { - "image": "ryshe/terraria:latest", - "containerName": "terraria-server", - "ports": ["{mcsm_port1}:7777/tcp"], + "image": "endstone/endstone:latest", + "containerName": "endstone-server", + "ports": [ + "{mcsm_port1}:19132/udp" + ], "extraVolumes": [], - "memory": 4096, - "networkMode": "bridge", - "cpuUsage": 100, - "workingDir": "/root/.local/share/Terraria/Worlds", + "workingDir": "", "env": [], - "changeWorkdir": false + "changeWorkdir": true } } }, @@ -134,18 +248,22 @@ "language": "zh_cn", "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "Paper Minecraft 1.21.8 快速开服,性能强,占用少,支持插件,不支持模组", - "title": "[Paper] Minecraft 1.21.8 Paper 快速开服", + "description": "Paper Minecraft 1.21.10 快速开服,性能强,占用少,支持插件,不支持模组", + "title": "[PaperMC] Minecraft 1.21.10 快速开服", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "100MB", "remark": "仅包含 Paper 版本", - "targetLink": "https://fill-data.papermc.io/v1/objects/d310c61899acc608b683515c5c7ef929774bfd1b90262dac965e76c7e9ea8d22/paper-1.21.8-30.jar", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.10/builds/84/downloads/paper-1.21.10-84.jar", "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-30.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.10-84.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -157,18 +275,22 @@ "language": "zh_cn", "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "Paper Minecraft 1.20.1 快速开服,性能强,占用少,支持插件,不支持模组", - "title": "[Paper] Minecraft 1.20.1 Paper 快速开服", + "description": "Paper Minecraft 1.21.8 快速开服,性能强,占用少,支持插件,不支持模组", + "title": "[PaperMC] Minecraft 1.21.8 快速开服", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "100MB", "remark": "仅包含 Paper 版本", - "targetLink": "https://fill-data.papermc.io/v1/objects/234a9b32098100c6fc116664d64e36ccdb58b5b649af0f80bcccb08b0255eaea/paper-1.20.1-196.jar", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/60/downloads/paper-1.21.8-60.jar", "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.1-196.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-60.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -176,45 +298,26 @@ } }, { - "language": "zh_cn", "platform": "ALL", - "description": "[Paper] Minecraft 1.21.1 快速开服", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "gameType": "Minecraft", - "title": "Minecraft 1.21.1 快速开服", - "category": "mc-paper", - "runtime": "Java 17+", - "hardware": "RAM 8G+", - "size": "250MB", - "remark": "包含基础插件,萌新快速开服!低配机器专属!", - "targetLink": "https://cloud.alongw.cn/f/DzvHK/Paper-1.21.1-ZH.zip", - "author": "alongw.cn", - "setupInfo": { - "type": "minecraft/java", - "startCommand": "java -Xms4096M -Xmx4096M -jar server.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { "language": "zh_cn", - "platform": "ALL", - "description": "[Paper] 中小型互通服推荐,1.20.4 版本,快速开服,包含ESS、锁箱子、操作回滚、领地商店等基础插件。", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "gameType": "Minecraft", - "title": "Minecraft 1.20.4", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Paper Minecraft 1.21.1 快速开服,性能强,占用少,支持插件,不支持模组", + "title": "[PaperMC] Minecraft 1.21.1 快速开服", "category": "mc-paper", "runtime": "Java 21+", - "hardware": "RAM 6G+", - "size": "140MB", - "remark": "支持插件,最低 8GB 内存要求", - "targetLink": "https://url.alww.top/mcsm/paper1.20.4.zip", - "author": "alongw.cn", + "hardware": "RAM 8G+", + "size": "100MB", + "remark": "仅包含 Paper 版本", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/133/downloads/paper-1.21.1-133.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java", - "startCommand": "java -Xms6144M -Xmx6144M -jar server.jar nogui", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.1-133.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -227,7 +330,7 @@ "description": "Minecraft Forge 1.20.1 服务器,支持 Forge 模组!", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", "gameType": "Minecraft", - "title": "Forge 1.20.1 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.20.1 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -235,6 +338,10 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.3.33/forge-1.20.1-47.3.33-installer.jar", "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:17-jdk", + "updateCommandImage": "eclipse-temurin:17-jdk" + }, "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -250,7 +357,7 @@ "description": "Minecraft Forge 1.20.1 服务器,支持 Forge 模组!", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", "gameType": "Minecraft", - "title": "Forge 1.20.1 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.20.1 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -258,9 +365,13 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.3.33/forge-1.20.1-47.3.33-installer.jar", "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:17-jdk", + "updateCommandImage": "eclipse-temurin:17-jdk" + }, "setupInfo": { "type": "minecraft/java/forge", - "startCommand": "start.bat", + "startCommand": ".\\run.bat", "stopCommand": "stop", "updateCommand": "java -jar forge-1.20.1-47.3.33-installer.jar --installServer", "ie": "utf-8", @@ -273,7 +384,7 @@ "description": "适用于 Windows 系统,支持 Minecraft Forge 模组,快速开服!", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", "gameType": "Minecraft", - "title": "Forge 1.20.6 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.20.6 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", @@ -281,9 +392,13 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.6-50.1.48/forge-1.20.6-50.1.48-installer.jar", "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/forge", - "startCommand": "start.bat", + "startCommand": ".\\run.bat", "stopCommand": "stop", "updateCommand": "java -jar forge-1.20.6-50.1.48-installer.jar --installServer", "ie": "utf-8", @@ -296,7 +411,7 @@ "description": "适用于 Windows 系统,支持 Minecraft Forge 模组,快速开服!", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", "gameType": "Minecraft", - "title": "Forge 1.19.2 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.19.2 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -304,15 +419,60 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.19.2-43.4.20/forge-1.19.2-43.4.20-installer.jar", "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:17-jdk", + "updateCommandImage": "eclipse-temurin:17-jdk" + }, "setupInfo": { "type": "minecraft/java/forge", - "startCommand": "start.bat", + "startCommand": ".\\run.bat", "stopCommand": "stop", "updateCommand": "java -jar forge-1.19.2-43.4.20-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } }, + { + "title": "Terraria Server", + "language": "en_us", + "platform": "Linux", + "description": "For Linux systems, using a third-party Docker image of Terraria for quick server deployment!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/terraria.webp", + "gameType": "Terraria", + "category": "Latest Version", + "runtime": "Ubuntu/Centos LTS", + "hardware": "RAM 8G+", + "size": "", + "targetLink": "", + "author": "MCSManager", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "", + "stopCommand": "exit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/terraria", + "tag": [ + "terraria" + ], + "fileCode": "utf8", + "processType": "docker", + "updateCommand": "", + "docker": { + "image": "ryshe/terraria:latest", + "containerName": "terraria-server", + "ports": [ + "{mcsm_port1}:7777/tcp" + ], + "extraVolumes": [], + "workingDir": "/root/.local/share/Terraria/Worlds", + "env": [], + "changeWorkdir": false + } + } + }, { "title": "Palworld Official Server", "language": "en_us", @@ -326,13 +486,17 @@ "size": "", "targetLink": "", "author": "MCSManager", - "tags": ["Docker version"], + "tags": [ + "Docker version" + ], "setupInfo": { "stopCommand": "stop", "ie": "utf8", "oe": "utf8", "type": "steam/universal", - "tag": ["Palworld"], + "tag": [ + "Palworld" + ], "fileCode": "utf8", "processType": "docker", "updateCommand": "", @@ -342,7 +506,10 @@ "networkMode": "bridge", "containerName": "palworld-server", "workingDir": "/opt/palworld/Pal/Saved", - "ports": ["{mcsm_port1}:8211/tcp", "{mcsm_port2}:25575/tcp"], + "ports": [ + "{mcsm_port1}:8211/tcp", + "{mcsm_port2}:25575/tcp" + ], "env": [ "SERVER_NAME=Private PalWorld Server", "SERVER_DESC=Private PalWorld Server", @@ -364,71 +531,63 @@ "size": "", "targetLink": "", "author": "MCSManager", - "tags": ["Docker version"], + "tags": [ + "Docker version" + ], "setupInfo": { "startCommand": "", "stopCommand": "stop", "ie": "utf8", "oe": "utf8", "type": "steam/universal", - "tag": ["Project Zomboid"], + "tag": [ + "Project Zomboid" + ], "fileCode": "utf8", "processType": "docker", "updateCommand": "", "docker": { "image": "renegademaster/zomboid-dedicated-server:latest", "containerName": "zomboid-dedicated-server", - "ports": ["{mcsm_port2}:16262/udp", "{mcsm_port1}:16261/udp"], + "ports": [ + "{mcsm_port2}:16262/udp", + "{mcsm_port1}:16261/udp" + ], "extraVolumes": [ "{mcsm_workspace}/ZomboidConfig|/home/steam/Zomboid", "{mcsm_workspace}/ZomboidDedicatedServer|/home/steam/ZomboidDedicatedServer" ], - "memory": 4096, - "networkMode": "bridge", - "cpuUsage": 100, "workingDir": "", "env": [], "changeWorkdir": false } } }, - { - "title": "Terraria Server", + "platform": "ALL", "language": "en_us", - "platform": "Linux", - "description": "For Linux systems, using a third-party Docker image of Terraria for quick server deployment!", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/terraria.webp", - "gameType": "Terraria", - "category": "Latest Version", - "runtime": "Ubuntu/Centos LTS", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.11 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.11", + "category": "mc-paper", + "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "", - "targetLink": "", - "author": "MCSManager", - "tags": ["Docker version"], + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.11/builds/39/downloads/paper-1.21.11-39.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "startCommand": "", - "stopCommand": "exit", - "ie": "utf8", - "oe": "utf8", - "type": "steam/terraria", - "tag": ["terraria"], - "fileCode": "utf8", - "processType": "docker", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.11-39.jar nogui", + "stopCommand": "stop", "updateCommand": "", - "docker": { - "image": "ryshe/terraria:latest", - "containerName": "terraria-server", - "ports": ["{mcsm_port1}:7777/tcp"], - "extraVolumes": [], - "memory": 4096, - "networkMode": "bridge", - "cpuUsage": 100, - "workingDir": "/root/.local/share/Terraria/Worlds", - "env": [], - "changeWorkdir": false - } + "ie": "utf-8", + "oe": "utf-8" } }, { @@ -436,18 +595,22 @@ "language": "en_us", "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "[Paper] Minecraft 1.21.8 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", - "title": "Paper Minecraft 1.21.8 Quick Server Setup", + "description": "Minecraft 1.21.10 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.10", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "100MB", - "remark": "Paper version only", - "targetLink": "https://fill-data.papermc.io/v1/objects/d310c61899acc608b683515c5c7ef929774bfd1b90262dac965e76c7e9ea8d22/paper-1.21.8-30.jar", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.10/builds/117/downloads/paper-1.21.10-117.jar", "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-30.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.10-117.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -459,18 +622,22 @@ "language": "en_us", "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "[Paper] Minecraft 1.20.1 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", - "title": "Paper Minecraft 1.20.1 Quick Server Setup", + "description": "Minecraft 1.21.8 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.8", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "100MB", - "remark": "Paper version only", - "targetLink": "https://fill-data.papermc.io/v1/objects/234a9b32098100c6fc116664d64e36ccdb58b5b649af0f80bcccb08b0255eaea/paper-1.20.1-196.jar", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/60/downloads/paper-1.21.8-60.jar", "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.1-196.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-60.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -480,20 +647,24 @@ { "platform": "ALL", "language": "en_us", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.8 Purpur", - "title": "Minecraft 1.21.8", - "category": "mc-purpur", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.4", + "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "55MB", - "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.8-2481.jar", - "author": "purpurmc.org", + "size": "50MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/232/downloads/paper-1.21.4-232.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.8-2481.jar nogui", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.4-232.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -501,47 +672,55 @@ } }, { - "platform": "Linux", + "platform": "ALL", "language": "en_us", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", "gameType": "Minecraft", - "description": "Forge 1.21.1 Server for Linux", - "title": "Forge 1.21.1 (Supports Mods)", - "category": "mc-forge", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.1 Paper Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PaperMC] Minecraft 1.21.1", + "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "7MB", - "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.1/forge-1.21.1-52.1.1-installer.jar", - "author": "minecraftforge.net", + "size": "100MB", + "remark": "Minecraft Paper", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/133/downloads/paper-1.21.1-133.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/forge", - "startCommand": "sh ./run.sh", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.1-133.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.1-52.1.1-installer.jar --installServer", + "updateCommand": "", "ie": "utf-8", "oe": "utf-8" } }, { - "platform": "Windows", + "platform": "ALL", "language": "en_us", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-mod.webp", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "gameType": "Minecraft", - "description": "Forge 1.21.1 Server for Windows", - "title": "Forge 1.21.1 (Supports Mods)", - "category": "mc-forge", + "description": "Minecraft 1.21.11 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.11", + "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "7MB", - "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.1/forge-1.21.1-52.1.1-installer.jar", - "author": "minecraftforge.net", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.11-2538.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/forge", - "startCommand": "start.bat", + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.11-2538.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.1-52.1.1-installer.jar --installServer", + "updateCommand": "", "ie": "utf-8", "oe": "utf-8" } @@ -549,20 +728,24 @@ { "platform": "ALL", "language": "en_us", - "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "[Purpur] Minecraft 1.21.4 Purpur", - "title": "Minecraft 1.21.4", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.10", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "50MB", - "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.4-2416.jar", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.10-2535.jar", "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.4-2416.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.10-2535.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -572,20 +755,24 @@ { "platform": "ALL", "language": "en_us", - "gameType": "Minecraft", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "[Paper] Minecraft 1.21.4 Paper", - "title": "Minecraft 1.21.4", - "category": "mc-paper", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.8", + "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/232/downloads/paper-1.21.4-232.jar", - "author": "papermc.io", + "size": "55MB", + "remark": "Minecraft Purpur", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.8-2497.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.4-232.jar nogui", + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.8-2497.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -595,20 +782,24 @@ { "platform": "ALL", "language": "en_us", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "gameType": "Minecraft", - "description": "[Vanilla] Minecraft 1.21.8", - "title": "Minecraft 1.21.8", - "category": "mc-vanilla", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.4", + "category": "mc-purpur", "runtime": "Java 21+", - "hardware": "RAM 2G+", - "size": "55MB", - "remark": "Minecraft Java", - "targetLink": "https://piston-data.mojang.com/v1/objects/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar", - "author": "Mojang Studios", + "hardware": "RAM 8G+", + "size": "50MB", + "remark": "Only Purpur included", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.4-2416.jar", + "author": "purpurmc.org", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java", - "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.4-2416.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -616,73 +807,1498 @@ } }, { - "platform": "ALL", + "platform": "Linux", "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", "gameType": "Minecraft", - "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "[Vanilla] Minecraft 1.21.4", - "title": "Minecraft 1.21.4", - "category": "mc-vanilla", + "description": "Minecraft 1.21.11 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.11", + "category": "mc-forge", "runtime": "Java 21+", - "hardware": "RAM 2G+", - "size": "55MB", - "remark": "Minecraft Java", - "targetLink": "https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar", - "author": "Mojang Studios", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.0.3/forge-1.21.11-61.0.3-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java", - "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "", + "updateCommand": "java -jar forge-1.21.11-61.0.3-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } }, { - "platform": "ALL", + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.11", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.0.3/forge-1.21.11-61.0.3-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.11-61.0.3-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.10", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.10-60.1.5/forge-1.21.10-60.1.5-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.10-60.1.5-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.10", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.10-60.1.5/forge-1.21.10-60.1.5-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.10-60.1.5-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.8", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.1.9/forge-1.21.8-58.1.9-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.8-58.1.9-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.8", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.1.9/forge-1.21.8-58.1.9-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.8-58.1.9-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.4", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.8/forge-1.21.4-54.1.8-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.4-54.1.8-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.4", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.8/forge-1.21.4-54.1.8-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.4-54.1.8-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 Forge Quick Server Setup, Mod Support for Linux", + "title": "[Forge] Minecraft 1.21.1", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.6/forge-1.21.1-52.1.6-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.1-52.1.6-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/mc-forge.webp", "gameType": "Minecraft", + "description": "Minecraft 1.21.1 Forge Quick Server Setup, Mod Support for Windows", + "title": "[Forge] Minecraft 1.21.1", + "category": "mc-forge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.6/forge-1.21.1-52.1.6-installer.jar", + "author": "minecraftforge.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/forge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar forge-1.21.1-52.1.6-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", - "description": "Minecraft 1.21.4 with Fabric Loader", - "title": "Fabric 1.21.4 (Supports Mods)", - "category": "mc-fabric", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.11", + "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "5MB", - "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", - "author": "fabricmc.net", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.11.8-beta/neoforge-21.11.8-beta-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/fabric", - "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.4 -downloadMinecraft -noprofile", + "updateCommand": "java -jar neoforge-21.11.8-beta-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } }, { - "platform": "ALL", + "platform": "Windows", "language": "en_us", "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "gameType": "Minecraft", - "description": "Minecraft 1.21.8 with Fabric Loader", - "title": "Fabric 1.21.8 (Supports Mods)", - "category": "mc-fabric", + "description": "Minecraft 1.21.11 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.11", + "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", - "size": "5MB", - "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", - "author": "fabricmc.net", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.11.8-beta/neoforge-21.11.8-beta-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, "setupInfo": { - "type": "minecraft/java/fabric", - "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.11.8-beta-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.10", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.10.63/neoforge-21.10.63-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.8 -downloadMinecraft -noprofile", + "updateCommand": "java -jar neoforge-21.10.63-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.10", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.10.63/neoforge-21.10.63-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.10.63-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.8", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.52/neoforge-21.8.52-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.8.52-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.8", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.52/neoforge-21.8.52-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.8.52-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.4", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.155/neoforge-21.4.155-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.4.155-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.4 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.4", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.155/neoforge-21.4.155-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.4.155-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 NeoForge Quick Server Setup, Mod Support for Linux", + "title": "[NeoForge] Minecraft 1.21.1", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.213/neoforge-21.1.213-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": "sh ./run.sh", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.1.213-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.1 NeoForge Quick Server Setup, Mod Support for Windows", + "title": "[NeoForge] Minecraft 1.21.1", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.213/neoforge-21.1.213-installer.jar", + "author": "neoforged.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/neoforge", + "startCommand": ".\\run.bat", + "stopCommand": "stop", + "updateCommand": "java -jar neoforge-21.1.213-installer.jar --installServer", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.11", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.11 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.10 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.10", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.10 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.8", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.8 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.4 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.4", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.4 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Minecraft 1.21.1 Fabric Quick Server Setup, Mod Support", + "title": "[FabricMC] Minecraft 1.21.1", + "category": "mc-fabric", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "5MB", + "remark": "Minecraft Fabric", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", + "author": "fabricmc.net", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/fabric", + "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "stopCommand": "stop", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.1 -downloadMinecraft -noprofile", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.11 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.11", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/64bb6d763bed0a9f1d632ec347938594144943ed/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.10 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.10", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/95495a7f485eedd84ce928cef5e223b757d2f764/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Standard Vanilla Minecraft 1.21.8 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.8", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "gameType": "Minecraft", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "description": "Standard Vanilla Minecraft 1.21.4 Server Setup (Official) - No Mod/Plugin Support", + "title": "[Vanilla] Minecraft 1.21.4", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar", + "author": "Mojang Studios", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "森林之子 服务器", + "language": "zh_cn", + "platform": "Windows", + "description": "森林之子服务器,适用于 Windows 系统", + "image": "https://shared.cdn.queniuqe.com/store_item_assets/steam/apps/1326470/header.jpg?t=1708624856", + "remark": "请在防火墙放行8766(UDP) 27016(UDP) 9700(UDP)端口", + "gameType": "Sons Of The Forest", + "category": "最新版本", + "runtime": "Windows 10+", + "hardware": "RAM 8G+", + "size": "3.5GB", + "targetLink": "", + "author": "mmyddd", + "tags": [ + "仅适合个人使用", + "Windows 版" + ], + "setupInfo": { + "tag": [ + "SonsOfTheForest" + ], + "type": "steam/universal", + "startCommand": "echo|set /p=\"1326470\" > steam_appid.txt & set SteamAppId=1326470 && set SteamGameId=1326470 && SonsOfTheForestDS.exe -userdatapath \"{mcsm_workspace}/userdata\" | consoleparser -colorize", + "stopCommand": "^C", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 2465200 +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "SCP秘密实验室 服务器", + "language": "zh_cn", + "platform": "Windows", + "description": "SCP秘密实验室服务器,适用于 Windows 系统", + "image": "https://shared.cdn.queniuqe.com/store_item_assets/steam/apps/700330/dad38399643cda1a4084b1faff60452427bef8c0/header.jpg?t=1747606719", + "remark": "第一次启动需要在控制台配置。服务器设置路径:%APPDATA%/SCP Secret Laboratory/config/{启动时控制台设置的端口}", + "gameType": "SCP秘密实验室", + "category": "最新版本", + "runtime": "Windows 10+", + "hardware": "RAM 8G+", + "size": "1GB", + "targetLink": "", + "author": "mmyddd", + "tags": [ + "仅适合个人使用", + "Windows 版" + ], + "setupInfo": { + "tag": [ + "SCP秘密实验室" + ], + "type": "steam/universal", + "startCommand": "LocalAdmin.exe", + "stopCommand": "stop", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 996560 +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "SCP秘密实验室 服务器", + "language": "zh_cn", + "platform": "Linux", + "description": "SCP秘密实验室服务器,适用于 Linux 系统", + "image": "https://shared.cdn.queniuqe.com/store_item_assets/steam/apps/700330/dad38399643cda1a4084b1faff60452427bef8c0/header.jpg?t=1747606719", + "remark": "第一次启动需要在控制台配置。服务器设置路径:/home/{你的用户名}/.config/SCP Secret Laboratory/config/{启动时控制台设置的端口}", + "gameType": "SCP秘密实验室", + "category": "最新版本", + "runtime": "Windows 10+", + "hardware": "RAM 8G+", + "size": "1GB", + "targetLink": "", + "author": "mmyddd", + "tags": [ + "仅适合个人使用", + "Linux 版" + ], + "setupInfo": { + "tag": [ + "SCP秘密实验室" + ], + "type": "steam/universal", + "startCommand": "LocalAdmin", + "stopCommand": "stop", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 996560 +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "Sons Of The Forest Official Server", + "language": "en_us", + "platform": "Windows", + "description": "Sons Of The Forest Server for Windows system.", + "image": "https://shared.cdn.queniuqe.com/store_item_assets/steam/apps/1326470/header.jpg?t=1708624856", + "remark": "Please allow port 8766 (UDP) 27016 (UDP) 9700 (UDP) to pass through the firewall.", + "gameType": "Sons Of The Forest", + "category": "latest", + "runtime": "Windows 10+", + "hardware": "RAM 8G+", + "size": "3.5GB", + "targetLink": "", + "author": "mmyddd", + "tags": [ + "Windows version" + ], + "setupInfo": { + "tag": [ + "SonsOfTheForest" + ], + "type": "steam/universal", + "startCommand": "echo|set /p=\"1326470\" > steam_appid.txt & set SteamAppId=1326470 && set SteamGameId=1326470 && SonsOfTheForestDS.exe -userdatapath \"{mcsm_workspace}/userdata\" | consoleparser -colorize", + "stopCommand": "^C", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 2465200 +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "SCP:SL Official Server", + "language": "en_us", + "platform": "Windows", + "description": "SCP:SL Official Server for Windows", + "image": "https://shared.cdn.queniuqe.com/store_item_assets/steam/apps/700330/dad38399643cda1a4084b1faff60452427bef8c0/header.jpg?t=1747606719", + "remark": "The first startup requires configuration in the console.Server Config Path:%APPDATA%/SCP Secret Laboratory/config/{port}", + "gameType": "SCP:SL", + "category": "latest", + "runtime": "Windows 10+", + "hardware": "RAM 8G+", + "size": "1GB", + "targetLink": "", + "author": "mmyddd", + "tags": [ + "Windows version" + ], + "setupInfo": { + "tag": [ + "SCP:SL" + ], + "type": "steam/universal", + "startCommand": "LocalAdmin.exe", + "stopCommand": "stop", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 996560 +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "EndStone MC 服务端", + "language": "zh_cn", + "platform": "Linux", + "description": "适用于 Linux 系统,使用 EndStone MC 官方 Docker 镜像,一键快速开服!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/endstone_mc.webp", + "gameType": "Minecraft", + "category": "最新版本", + "runtime": "Ubuntu/Centos LTS", + "hardware": "RAM 2G+", + "size": "", + "targetLink": "", + "author": "EndStone", + "tags": [ + "可以商业出租", + "Docker版" + ], + "setupInfo": { + "startCommand": "endstone -y -s .", + "stopCommand": "stop", + "ie": "utf8", + "oe": "utf8", + "type": "minecraft/bedrock", + "tag": [ + "bedrock" + ], + "fileCode": "utf8", + "processType": "docker", + "updateCommand": "", + "docker": { + "image": "endstone/endstone:latest", + "containerName": "endstone-server", + "ports": [ + "{mcsm_port1}:19132/udp" + ], + "extraVolumes": [], + "workingDir": "", + "env": [], + "changeWorkdir": true + } + } + }, + { + "title": "战术小队 服务器", + "language": "zh_cn", + "platform": "Windows", + "description": "适用于 Windows 系统的战术小队服务器,快速开服", + "image": "https://squadovo.cn/img/header.jpg", + "gameType": "Squad", + "category": "最新版本", + "runtime": "Windows", + "hardware": "Intel Core 平台、RAM 8G+", + "size": "20GB", + "author": "南赛", + "tags": [ + "不完全兼容面板" + ], + "remark": "需安装 Visual C++ 才可以运行", + "targetLink": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/steamcmd.exe", + "setupInfo": { + "type": "steam/universal", + "startCommand": "\"SquadGame/Binaries/Win64/SquadGameServer.exe\" Port=7787 QueryPort=15000 -log", + "stopCommand": "^C", + "updateCommand": "steamcmd.exe +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 403240 validate +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "Squad Server", + "language": "en_us", + "platform": "Windows", + "description": "Squad Server suitable for Windows system, fast server setup", + "image": "https://squadovo.cn/img/header.jpg", + "gameType": "Squad", + "category": "Latest Version", + "runtime": "Windows Server", + "hardware": "Intel Core platform、RAM 8G+", + "size": "20GB", + "author": "NanSai", + "tags": [ + "不完全兼容面板" + ], + "remark": "Need to install Visual C++", + "targetLink": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/steamcmd.exe", + "setupInfo": { + "type": "steam/universal", + "startCommand": "\"SquadGame/Binaries/Win64/SquadGameServer.exe\" Port=7787 QueryPort=15000 -log", + "stopCommand": "^C", + "updateCommand": "steamcmd.exe +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 403240 validate +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "人渣 服务器", + "language": "zh_cn", + "platform": "Windows", + "description": "适用于 Windows 系统的人渣服务器,快速开服", + "image": "https://api.nansai.cc/img/scum/header_chinese.jpg", + "gameType": "SCUM", + "category": "最新版本", + "runtime": "Windows Server", + "hardware": "Intel Core 平台、RAM 8G+", + "size": "20GB", + "author": "南赛", + "tags": [ + "不完全兼容面板" + ], + "remark": "需安装 Visual C++ 才可以运行", + "targetLink": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/steamcmd.exe", + "setupInfo": { + "type": "steam/universal", + "startCommand": "\"SCUM/Binaries/Win64/SCUMServer.exe\" -port=7779 -log", + "stopCommand": "^C", + "updateCommand": "SteamCMD.exe +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 3792580 validate +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "SCUM Server", + "language": "en_us", + "platform": "Windows", + "description": "SCUM Server suitable for Windows system, fast server setup", + "image": "https://api.nansai.cc/img/scum/header_English.jpg", + "gameType": "SCUM", + "category": "Latest Version", + "runtime": "Windows Server", + "hardware": "Intel Core platform、RAM 8G+", + "size": "20GB", + "author": "NanSai", + "tags": [ + "Incompatible with panel" + ], + "remark": "need install Visual C++", + "targetLink": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/steamcmd.exe", + "setupInfo": { + "type": "steam/universal", + "startCommand": "\"SCUM/Binaries/Win64/SCUMServer.exe\" -port=7779 -log", + "stopCommand": "^C", + "updateCommand": "SteamCMD.exe +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 3792580 validate +quit", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "title": "战术小队 官方服务器", + "language": "zh_cn", + "platform": "Linux", + "description": "使用《战术小队》官方 Docker 镜像,快速开服!", + "image": "https://squadovo.cn/img/header.jpg", + "gameType": "Squad", + "category": "最新版本", + "runtime": "Linux", + "hardware": "Intel Core 平台、RAM 8G+", + "size": "", + "targetLink": "", + "author": "南赛", + "tags": [ + "可以商业出租", + "Docker 版" + ], + "setupInfo": { + "startCommand": "./SquadGameServer.sh", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 403240 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Squad" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7787/udp", + "{mcsm_port2}:15000/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Squad Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "use the official Docker image of Squad Server to quickly get started!", + "image": "https://squadovo.cn/img/header.jpg", + "gameType": "Squad", + "category": "Latest Version", + "runtime": "Linux", + "hardware": "Intel Core platform、RAM 8G+", + "size": "", + "targetLink": "", + "author": "Nansai", + "tags": [ + "Commercial Use Allowed", + "Docker version" + ], + "setupInfo": { + "startCommand": "./SquadGameServer.sh", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 403240 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Squad" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:7787/udp", + "{mcsm_port2}:15000/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Rust 服务器", + "language": "zh_cn", + "platform": "Linux", + "description": "使用 Rust 第三方 Docker 镜像,快速开服!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/rust.jpg", + "gameType": "Rust", + "category": "最新版本", + "runtime": "Windows/Linux", + "hardware": "Intel Core 平台、RAM 16G+", + "size": "", + "targetLink": "", + "author": "南赛", + "tags": [ + "可以商业出租", + "Docker 版" + ], + "setupInfo": { + "startCommand": "./RustDedicated -batchmode -nographics +server.port 28015 +rcon.port 28016", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 258550 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Rust" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:28015/udp", + "{mcsm_port2}:28016/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Rust Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "Use Rust third-party Docker images to quickly get started!", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/rust.jpg", + "gameType": "Rust", + "category": "Latest Version", + "runtime": "Windows/Linux", + "hardware": "Intel Core platform、RAM 16G+", + "size": "", + "targetLink": "", + "author": "南赛", + "tags": [ + "Commercial Use Allowed", + "Docker version" + ], + "setupInfo": { + "startCommand": "./RustDedicated -batchmode -nographics +server.port 28015 +rcon.port 28016", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 258550 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Rust" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:28015/udp", + "{mcsm_port2}:28016/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Factorio 服务器", + "language": "zh_cn", + "platform": "Linux", + "description": "使用 Factorio 第三方 Docker 镜像,快速开服!", + "image": "https://cdn.factorio.com/assets/img/web/factorio-logo2.png", + "gameType": "Factorio", + "category": "最新版本", + "runtime": "Windows/Linux", + "hardware": "X86_64、RAM 4G+", + "size": "", + "targetLink": "", + "author": "TPing", + "tags": [ + "Docker 版" + ], + "setupInfo": { + "startCommand": "./bin/x64/factorio --start-server-load-latest", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 427520 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Factorio" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:34197/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "title": "Factorio Docker Server", + "language": "en_us", + "platform": "Linux", + "description": "Use Factorio third-party Docker images to quickly get started!", + "image": "https://cdn.factorio.com/assets/img/web/factorio-logo2.png", + "gameType": "Factorio", + "category": "Latest Version", + "runtime": "Windows/Linux", + "hardware": "X86_64、RAM 4G+", + "size": "", + "targetLink": "", + "author": "TPing", + "tags": [ + "Docker version" + ], + "setupInfo": { + "startCommand": "./bin/x64/factorio --start-server-load-latest", + "stopCommand": "^C", + "updateCommand": "/home/steam/steamcmd/steamcmd.sh -net_ipv4 +force_install_dir \"/data\" +login anonymous \"+app_update 427520 validate\" +quit", + "ie": "utf8", + "oe": "utf8", + "type": "steam/universal", + "tag": [ + "Factorio" + ], + "fileCode": "utf8", + "processType": "docker", + "runAs": "steam", + "docker": { + "image": "githubyumao/steam-game-runtime:latest", + "updateCommandImage": "githubyumao/steam-game-runtime:latest", + "ports": [ + "{mcsm_port1}:34197/udp" + ], + "changeWorkdir": true, + "workingDir": "/data", + "env": [], + "extraVolumes": [] + } + } + }, + { + "language": "zh_cn", + "description": "使用TShock插件的泰拉瑞亚服务器", + "title": "Terraria_windows_x86", + "category": "最新版本", + "runtime": ".NET 6+", + "hardware": "RAM 1G", + "targetLink": "https://github.com/Pryaxis/TShock/releases/download/v5.2.4/TShock-5.2.4-for-Terraria-1.4.4.9-win-amd64-Release.zip", + "author": "Dawn3901", + "setupInfo": { + "startCommand": "TShock.Server.exe", + "stopCommand": "stop", + "ie": "UTF-8", + "oe": "UTF-8", + "createDatetime": 1767005798835, + "lastDatetime": 0, + "type": "universal", + "tag": [], + "endTime": 0, + "fileCode": "UTF-8", + "processType": "general", + "updateCommand": "{mcsm_steamcmd} +login anonymous +force_install_dir \"{mcsm_workspace}\" +app_update 380870 +quit", + "actionCommandList": [], + "crlf": 1, + "category": 0, + "enableRcon": false, + "terminalOption": { + "haveColor": true, + "pty": false, + "ptyWindowCol": 164, + "ptyWindowRow": 40 + }, + "eventTask": { + "autoStart": false, + "autoRestart": false, + "autoRestartMaxTimes": 3, + "ignore": false + }, + "docker": { + "ports": [], + "extraVolumes": [], + "networkMode": "bridge", + "networkAliases": [], + "workingDir": "/data", + "env": [], + "changeWorkdir": true + }, + "pingConfig": { + "type": 1 + }, + "extraServiceConfig": {} + }, + "gameType": "Terraria", + "image": "https://cdn.akamai.steamstatic.com/steam/apps/105600/header.jpg?t=1666290860", + "platform": "Windows", + "tags": [ + "TShock", + "Terraria" + ], + "isSummary": false + }, + { + "platform": "Windows", + "language": "en_us", + "image": "https://hytale.com/static/images/logo.png", + "gameType": "Hytale", + "description": "Hytale Quick Server Setup, Mod Support", + "title": "Hytale Server", + "category": "hytale", + "runtime": "Java 25+", + "hardware": "RAM 4G+", + "targetLink": "https://github.com/SkyKingPX/Hytale-Server-Installer/releases/download/1.0.0/hytale-server-installer-win-mcsm.zip", + "author": "SkyKing_PX", + "setupInfo": { + "type": "hytale", + "startCommand": "java -Xms2G -Xmx4G -XX:AOTCache=HytaleServer.aot -jar HytaleServer.jar --assets Assets.zip", + "stopCommand": "stop", + "updateCommand": ".\\hytale-server-installer-win.exe", + "ie": "UTF-8", + "oe": "UTF-8" + } + }, + { + "platform": "Linux", + "language": "en_us", + "image": "https://hytale.com/static/images/logo.png", + "gameType": "Hytale", + "description": "Hytale Quick Server Setup, Mod Support", + "title": "Hytale Server", + "category": "hytale", + "runtime": "Java 25+", + "hardware": "RAM 4G+", + "targetLink": "https://github.com/SkyKingPX/Hytale-Server-Installer/releases/download/1.0.0/hytale-server-installer-linux-mcsm.zip", + "author": "SkyKing_PX", + "setupInfo": { + "type": "hytale", + "startCommand": "java -Xms2G -Xmx4G -XX:AOTCache=HytaleServer.aot -jar HytaleServer.jar --assets Assets.zip", + "stopCommand": "stop", + "updateCommand": "sudo ./hytale-server-installer-linux", + "ie": "UTF-8", + "oe": "UTF-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.11 Folia Quick Server Setup, Plugin Support", + "title": "[Folia] Minecraft 1.21.11", + "category": "mc-folia", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Minecraft Folia", + "targetLink": "https://fill-data.papermc.io/v1/objects/f4e9c5c374a53d17b6173cac35242c05c12217b656b6cc5dc07354cc37ec4066/folia-1.21.11-11.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/folia", + "startCommand": "java -Xms4096M -Xmx4096M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -jar folia-1.21.11-11.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "platform": "ALL", + "language": "en_us", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Folia Quick Server Setup, Plugin Support", + "title": "[Folia] Minecraft 1.21.8", + "category": "mc-folia", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Minecraft Folia", + "targetLink": "https://fill-data.papermc.io/v1/objects/233843cfd5001b6f658fcab549178d694cc37f0277d004ea295de0a94c57278f/folia-1.21.8-6.jar", + "author": "papermc.io", + "dockerOptional": { + "image": "eclipse-temurin:21-jdk", + "updateCommandImage": "eclipse-temurin:21-jdk" + }, + "setupInfo": { + "type": "minecraft/java/folia", + "startCommand": "java -Xms4096M -Xmx4096M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -jar folia-1.21.8-6.jar nogui", + "stopCommand": "stop", + "updateCommand": "", "ie": "utf-8", "oe": "utf-8" } } ] -} +} \ No newline at end of file diff --git a/setup.sh b/setup.sh index 6af7a4c..d75b71c 100644 --- a/setup.sh +++ b/setup.sh @@ -1,248 +1,1386 @@ #!/bin/bash -# Official installation script. +# Official MCSManager installation script. +# This script installs or updates the MCSManager Web and/or Daemon to the latest version. +# ------------------------------------------------------------------------------ +# Supported Linux distributions: +# This script supports the following mainstream Linux distributions: +# - Ubuntu: 18.04, 20.04, 22.04, 24.04 +# - Debian: 10, 11, 12, 13 +# - CentOS: 7, 8 Stream, 9 Stream, 10 Stream +# - RHEL: 7, 8, 9, 10 +# - Arch Linux: Support planned (TBD) +# ------------------------------------------------------------------------------ -mcsmanager_install_path="/opt/mcsmanager" -mcsmanager_download_addr="https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz" +# Target installation directory (can be overridden with --install-dir) +install_dir="/opt/mcsmanager" + +# Primary download URL bas. Full package URL = download_base_url + package_name +download_base_url="https://github.com/MCSManager/MCSManager/releases/latest/download/" + +# Fallback download URL (can also be a local directory or mirror) +download_fallback_url="https://download.mcsmanager.com/mcsmanager_linux_release.tar.gz" + +# Name of the release package to download/detect package_name="mcsmanager_linux_release.tar.gz" -node="v20.12.2" -arch=$(uname -m) -if [ "$(id -u)" -ne 0 ]; then - echo "This script must be run as root. Please use \"sudo bash\" instead." - exit 1 -fi +# Node.js version to be installed +# Keep the leading "v" +node_version="v20.12.2" +node_version_centos7="v16.20.2" + +# Node download base URL - primary +node_download_url_base="https://nodejs.org/dist/" + +# Unoffical build of Node.js, for more ISA support +node_unoffical_build_url="https://unofficial-builds.nodejs.org/download/release/" + +# Node download URL - fallback. +# This is the URL points directly to the file, not the base. This can also be a local absolute path. +# Only supports https:// or http:// for web locations. +node_download_fallback="" + +# Node.js installation path (defaults to the MCSManager installation path. Can be overridden with --node-install-dir) +node_install_dir="$install_dir" + +# Temp dir for file extraction +tmp_dir="/tmp" + +# Bypass installed user permission check, override by --force-permission +force_permission=false + + +# --------------- Global Variables ---------------# +# DO NOT MODIFY # + + +# Component installation options. +# For fresh installs, both daemon and web components are installed by default. +# For updates, behavior depends on detected existing components. +# Can be overridden with --install daemon/web/all +install_daemon=true +install_web=true + +# Install MCSM as (default: root). +# To install as a general user (e.g., "mcsm"), use the --user option: --user mcsm +# To ensure compatibility, only user mcsm is supported. +install_user="root" +# Installed user, for permission check +web_installed=false +daemon_installed=false +web_installed_user="" +daemon_installed_user="" + +# Service file locations +# the final dir = systemd_file + {web/daemon} + ".service" +systemd_file="/etc/systemd/system/mcsm-" +# Optional: Override the default installation source file. +# If --install-source is specified, the installer will use the provided +# "mcsmanager_linux_release.tar.gz" file instead of downloading it. +# Only support local absolute path. +install_source_path="" + +# temp path for extracted file(s) +install_tmp_dir="/opt/mcsmanager/mcsm_abcd" -printf "\033c" +# dir name for data dir backup +# e.g. /opt/mcsmanager/daemon/data -> /opt/mcsmanager/data_bak_data +# only valid for when during an update +backup_prefix="data_bak_" -echo_cyan() { - printf '\033[1;36m%b\033[0m\n' "$@" +# System architecture (detected automatically) +arch="" +version="" +distro="" + + + +# Supported OS versions (map-style structure) +# Format: supported_os["distro_name"]="version1 version2 version3 ..." +declare -A supported_os +supported_os["Ubuntu"]="18 20 22 24" +supported_os["Debian"]="10 11 12 13" +supported_os["CentOS"]="7 8 8-stream 9-stream 10-stream" +supported_os["RHEL"]="7 8 9 10" +supported_os["Arch"]="rolling" + +# Required system commands for installation +# These will be checked before logic process +required_commands=( + chmod + chown + wget + tar + stat + useradd + usermod + date +) + +# Node.js related sections +# Enable strict version checking (exact match) +# enabled -> strict requriement for defined node version +# false -> newer version allowed +# Older version is NEVER allowed +strict_node_version_check=true + +# Will be set based on actual node status +install_node=true +# Remove leading "v" from defined version +required_node_ver="${node_version#v}" + +# Holds absolute path for node & npm +node_bin_path="" +npm_bin_path="" +# Hold Node.js arch name, e.g. x86_64 -> x64 +node_arch="" +# Hold Node.js intallation path, e.g. ${node_install_dir}/node-${node_version}-linux-${arch} +node_path="" + +# For installation result +daemon_key="" +daemon_port="" +web_port="" +daemon_key_config_subpath="data/Config/global.json" +web_port_config_subpath="data/SystemConfig/config.json" + +# Terminal color & style related +# Default to false, auto check later +SUPPORTS_COLOR=false +SUPPORTS_STYLE=false +# Declare ANSI reset +RESET="\033[0m" + +# Foreground colors +declare -A FG_COLORS=( + [black]="\033[0;30m" + [red]="\033[0;31m" + [green]="\033[0;32m" + [yellow]="\033[0;33m" + [blue]="\033[0;34m" + [magenta]="\033[0;35m" + [cyan]="\033[0;36m" + [white]="\033[0;37m" +) + +# Font styles +declare -A STYLES=( + [bold]="\033[1m" + [underline]="\033[4m" + [italic]="\033[3m" # Often ignored + [clear_line]="\r\033[2K" + [strikethrough]="\033[9m" +) + + +### Helper Functions +# Execution wrapper, avoid unexpected crashes. +safe_run() { + local func="$1" + local err_msg="$2" + shift 2 + + if ! "$func" "$@"; then + echo "Error: $err_msg" + exit 1 + fi } -echo_red() { - printf '\033[1;31m%b\033[0m\n' "$@" + +# Function to ensure the script is run as root +check_root() { + # Using Bash's built-in EUID variable + if [ -n "$EUID" ]; then + if [ "$EUID" -ne 0 ]; then + cprint red "Error: This script must be run as root. Please use sudo or switch to the root user." + exit 1 + fi + else + # Fallback to using id -u if EUID is unavailable (e.g., non-Bash shell or misconfigured environment) + if [ "$(id -u)" -ne 0 ]; then + cprint red "Error: This script must be run as root. Please use sudo or switch to the root user." + exit 1 + fi + fi } -echo_green() { - printf '\033[1;32m%b\033[0m\n' "$@" + +# Function to check whether current terminal support color & style +detect_terminal_capabilities() { + SUPPORTS_COLOR=false + SUPPORTS_STYLE=false + + if [ -t 1 ] && command -v tput >/dev/null 2>&1; then + if [ "$(tput colors)" -ge 8 ]; then + SUPPORTS_COLOR=true + fi + if tput bold >/dev/null 2>&1 && tput smul >/dev/null 2>&1; then + SUPPORTS_STYLE=true + fi + fi + + if [ "$SUPPORTS_COLOR" = true ]; then + cprint green "[OK] Terminal supports colored output." + else + cprint yellow "Note: Terminal does not support colored output. Continuing without formatting." + fi + + if [ "$SUPPORTS_STYLE" = true ]; then + cprint green "[OK] Terminal supports bold and underline formatting." + else + cprint yellow "Note: Terminal does not support advanced text styles." + fi } -echo_cyan_n() { - printf '\033[1;36m%b\033[0m' "$@" + +# Check whether daemon or web is installed +is_component_installed() { + local component_name="$1" + local component_path="${install_dir}/${component_name}" + + if [[ -d "$component_path" ]]; then + cprint green "Component '$component_name' is already installed at $component_path" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=true + elif [[ "$component_name" == "web" ]]; then + web_installed=true + fi + + return 0 + else + cprint yellow "Component '$component_name' is not installed" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=false + elif [[ "$component_name" == "web" ]]; then + web_installed=false + fi + + return 1 + fi } -echo_yellow() { - printf '\033[1;33m%b\033[0m\n' "$@" + +check_component_permission() { + local component="$1" + local service_file="${systemd_file}${component}.service" + + if [[ ! -f "$service_file" ]]; then + cprint yellow "Service file not found: $service_file" + return 0 # nothing changed + fi + + # Extract the User= line if it exists + local user_line + user_line=$(grep -E '^User=' "$service_file" 2>/dev/null | head -1) + + local user + if [[ -z "$user_line" ]]; then + user="root" # default if no User= is defined + else + user="${user_line#User=}" + fi + + # Validate user + if [[ "$user" != "root" && "$user" != "mcsm" ]]; then + cprint red bold "Unsupported user '$user' in $service_file. Expected 'root' or 'mcsm'." + exit 1 + fi + + # Assign to appropriate global + if [[ "$component" == "web" ]]; then + web_installed_user="$user" + elif [[ "$component" == "daemon" ]]; then + daemon_installed_user="$user" + fi + + cprint cyan "Detected $component installed as user: $user" + return 0 } -# script info -echo_cyan "+---------------------------------------------------------------------- -| MCSManager Installer -+---------------------------------------------------------------------- -" -Red_Error() { - echo '=================================================' - printf '\033[1;31;40m%b\033[0m\n' "$@" - echo '=================================================' - exit 1 + +parse_args() { + local explicit_install_flag=false + + while [[ $# -gt 0 ]]; do + case "$1" in + --install-dir) + if [[ -n "$2" ]]; then + install_dir="$2" + shift 2 + else + echo "Error: --install-dir requires a path argument." + exit 1 + fi + ;; + --node-install-dir) + if [[ -n "$2" ]]; then + node_install_dir="$2" + shift 2 + else + echo "Error: --node-install-dir requires a path argument." + exit 1 + fi + ;; + --install) + explicit_install_flag=true + if [[ -n "$2" && "$2" != --* ]]; then + case "$2" in + daemon) + install_daemon=true + is_component_installed "daemon" + install_web=false + check_component_permission "daemon" + ;; + web) + install_daemon=false + is_component_installed "web" + install_web=true + check_component_permission "web" + ;; + all) + install_daemon=true + install_web=true + is_component_installed "daemon" + is_component_installed "web" + check_component_permission "daemon" + check_component_permission "web" + ;; + *) + echo "Error: Invalid value for --install. Expected 'daemon', 'web', or 'all'." + echo "Usage: --install daemon|web|all" + exit 1 + ;; + esac + shift 2 + else + echo "Error: --install flag provided but no value. Please specify: daemon, web, or all." + echo "Usage: --install daemon|web|all" + exit 1 + fi + ;; + --user) + if [[ -n "$2" ]]; then + case "$2" in + root) + install_user="root" + ;; + mcsm) + install_user="mcsm" + ;; + *) + echo "Error: Invalid user '$2'. Only 'root' and 'mcsm' are supported." + echo "Usage: --user root|mcsm" + exit 1 + ;; + esac + shift 2 + else + echo "Error: --user requires a value (root or mcsm)." + exit 1 + fi + ;; + --install-source) + if [[ -n "$2" ]]; then + install_source_path="$2" + shift 2 + else + echo "Error: --install-source requires a file path." + exit 1 + fi + ;; + --force-permission) + force_permission=true + shift + ;; + *) + echo "Error: Unknown argument: $1" + exit 1 + ;; + esac + done + + # Auto-detect branch: only run if --install was not explicitly passed + if [[ "$explicit_install_flag" == false ]]; then + daemon_installed=false + web_installed=false + + if is_component_installed "daemon"; then + daemon_installed=true + check_component_permission "daemon" + fi + if is_component_installed "web"; then + web_installed=true + check_component_permission "web" + fi + + # When only one component installed, we wanted to process that one only. + if [[ "$daemon_installed" == true && "$web_installed" == false ]]; then + install_daemon=true + install_web=false + elif [[ "$daemon_installed" == false && "$web_installed" == true ]]; then + install_daemon=false + install_web=true + else + install_daemon=true + install_web=true + fi + fi +} + + +# Get Distribution & Architecture Info +detect_os_info() { + distro="Unknown" + version="Unknown" + arch=$(uname -m) + + # Try primary source + if [ -f /etc/os-release ]; then + . /etc/os-release + distro_id="${ID,,}" + version_id="${VERSION_ID,,}" + + case "$distro_id" in + ubuntu) + distro="Ubuntu" + version="$version_id" + ;; + debian) + distro="Debian" + version="$version_id" + ;; + centos) + distro="CentOS" + version="$version_id" + ;; + rhel*) + distro="RHEL" + version="$version_id" + ;; + arch) + distro="Arch" + version="rolling" + ;; + *) + distro="${ID:-Unknown}" + version="$version_id" + ;; + esac + fi + + # Fallbacks for missing or invalid version + if [[ -z "$version" || "$version" == "unknown" || "$version" == "" ]]; then + if [ -f /etc/issue ]; then + version_guess=$(grep -oP '[0-9]+(\.[0-9]+)*' /etc/issue | head -1) + if [[ -n "$version_guess" ]]; then + version="$version_guess" + fi + fi + fi + + # Normalize version: if purely numeric/dotted keep only major; otherwise leave as-is + version_full="$version" + #if [[ "$version" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + # version="${version%%.*}" + #fi + cprint cyan "Detected OS: $distro $version_full" + cprint cyan "Detected Architecture: $arch" +} + +version_specific_rules() { + # Default: do nothing unless a rule matches + + if [[ "$distro" == "CentOS" && "$version" == "7" ]]; then + cprint yellow "Detected CentOS 7 — overriding Node.js version." + node_version="$node_version_centos7" + required_node_ver="${node_version#v}" + fi } -Install_Node() { - if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then - echo_green "Node.js version is up-to-date, skipping installation." - return +# Check if all required commands are available +check_required_commands() { + local missing=0 + + for cmd in "${required_commands[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + echo "Error: Required command '$cmd' is not available in PATH." + missing=1 + fi + done + + if [ "$missing" -ne 0 ]; then + echo "One or more required commands are missing. Please install them and try again." + return 1 fi - echo_cyan "[+] Install Node.JS environment..." + cprint green "All required commands are available." + return 0 +} - rm -irf "$node_install_path" +# Print with specified color and style, fallback to RESET if not supported. +# Supported colors*: black|red|green|yellow|blue|magenta|cyan|white +# Supported styles*: bold|underline|italic|clear_line|strikethrough +# *Note: some style may not necessarily work on all terminals. +# Example usage: +# cprint green bold "Installation completed successfully." +# cprint red underline "Failed to detect required command: wget" +# cprint yellow "Warning: Disk space is low." +# cprint underline "Failed to detect required command: wget" +# cprint bold green underline"Installation completed successfully." - cd /opt || Red_Error "[x] Failed to enter /opt" +cprint() { + local color="" + local text="" + local styles="" + local disable_prefix=false + local disable_newline=false - rm -rf "node-$node-linux-$arch.tar.gz" + while [[ $# -gt 1 ]]; do + case "$1" in + black|red|green|yellow|blue|magenta|cyan|white) + color="$1" + ;; + bold|underline|italic|clear_line|strikethrough) + styles+="${STYLES[$1]}" + ;; + noprefix) + disable_prefix=true + ;; + nonl) + disable_newline=true + ;; + esac + shift + done - wget "https://nodejs.org/dist/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to download node release" + text="$1" - tar -zxf "node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to untar node" + local prefix_text="" + if [[ "$disable_prefix" != true ]]; then + local timestamp="[$(date +%H:%M:%S)]" + local label="[MCSM Installer]" + prefix_text="${FG_COLORS[white]}$timestamp $label${RESET} " + fi - rm -rf "node-$node-linux-$arch.tar.gz" + local prefix="" + if [[ -n "$color" && "$SUPPORTS_COLOR" = true ]]; then + prefix+="${FG_COLORS[$color]}" + fi + if [[ "$SUPPORTS_STYLE" = true || "$styles" == *"${STYLES[clear_line]}"* ]]; then + prefix="$styles$prefix" + fi - if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then - echo_green "Success" + if [[ "$disable_newline" == true ]]; then + printf "%b%b%s%b" "$prefix_text" "$prefix" "$text" "$RESET" else - Red_Error "[x] Node installation failed!" + printf "%b%b%s%b\n" "$prefix_text" "$prefix" "$text" "$RESET" + fi +} + + + + +# Permission check before proceed with installation +permission_barrier() { + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "No components currently installed — skipping permission check." + return 0 fi - echo - echo_yellow "=============== Node.JS Version ===============" - echo_yellow " node: $("$node_install_path"/bin/node -v)" - echo_yellow " npm: v$(env "$node_install_path"/bin/node "$node_install_path"/bin/npm -v)" - echo_yellow "=============== Node.JS Version ===============" - echo + for component in web daemon; do + local is_installed_var="${component}_installed" + local installed_user_var="${component}_installed_user" + + if [[ "${!is_installed_var}" == true ]]; then + local installed_user="${!installed_user_var}" + + # Step 0: Ensure installed user is detected + if [[ -z "$installed_user" ]]; then + cprint red bold "Detected that '$component' is installed but could not determine the user from its systemd service file." + cprint red "This may indicate a custom or unsupported service file setup." + cprint red "Refusing to proceed to avoid potential conflicts." + exit 1 + fi + + # Step 1: User match check with optional force override + if [[ "$installed_user" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "Permission mismatch for '$component':" + cprint yellow "Installed as user: $installed_user" + cprint yellow "Target install user: $install_user" + cprint yellow "User mismatch, but --force-permission is set. Continuing and updating permissions..." + sleep 3 + else + cprint red bold "Permission mismatch for '$component':" + cprint red "Installed as user: $installed_user" + cprint red "Current install target user: $install_user" + cprint red "Unable to proceed due to ownership conflict. Use --force-permission to override and update file permission." + exit 1 + fi + else + cprint green bold "Permission check passed: '$installed_user' matches target user." + fi - sleep 3 + fi + done + + # Step 2: Directory ownership check + local dir_owner + dir_owner=$(stat -c '%U' "$install_dir" 2>/dev/null) + + if [[ -z "$dir_owner" ]]; then + cprint red bold "Unable to determine owner of install_dir: $install_dir" + exit 1 + fi + + if [[ "$dir_owner" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "Install directory ownership mismatch:" + cprint yellow " Directory: $install_dir" + cprint yellow " Owned by: $dir_owner" + cprint yellow " Expected: $install_user" + cprint yellow " --force-permission is set. Continuing despite mismatch." + sleep 3 + else + cprint red bold "Install directory ownership mismatch:" + cprint red " Directory: $install_dir" + cprint red " Owned by: $dir_owner" + cprint red " Expected: $install_user" + exit 1 + fi + else + cprint green bold "Install directory ownership check passed: '$install_dir' is owned by '$install_user'." + fi + + cprint green bold "Permissions and ownership validated. Proceeding." + return 0 } -Install_MCSManager() { - echo_cyan "[+] Install MCSManager..." - # stop service - systemctl disable --now mcsm-{web,daemon} - # delete service - rm -rf /etc/systemd/system/mcsm-{daemon,web}.service - systemctl daemon-reload +# Map OS arch with actual Node.js Arch name +# This function should be placed after var arch has been assigned a valid value. +resolve_node_arch() { + case "$arch" in + x86_64) + node_arch="x64" + ;; + aarch64) + node_arch="arm64" + ;; + armv7l) + node_arch="armv7l" + ;; + loongarch64) + node_arch="loong64" + # Use unoffical build + node_download_url_base=$node_unoffical_build_url + ;; + *) + cprint red bold "Unsupported architecture for Node.js: $arch" + return 1 + ;; + esac + + # Assign node_path based on resolved arch and current version/install dir + node_path="${node_install_dir}/node-${node_version}-linux-${node_arch}" - mkdir -p "${mcsmanager_install_path}" || Red_Error "[x] Failed to create ${mcsmanager_install_path}" + cprint cyan "Resolved Node.js architecture: $node_arch" + cprint cyan "Node.js install path: $node_path" +} + +# Check if Node.js at PATH is valid. +# This function check Node.js version + NPM (if Node.js valid) +verify_node_at_path() { + local node_path="$1" + node_bin_path="$node_path/bin/node" + npm_bin_path="$node_path/bin/npm" - # cd /opt/mcsmanager - cd "${mcsmanager_install_path}" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}" + # Node binary missing + if [ ! -x "$node_bin_path" ]; then + return 1 + fi - # download MCSManager release - wget "${mcsmanager_download_addr}" -O "${package_name}" || Red_Error "[x] Failed to download MCSManager" - tar -zxf ${package_name} -o || Red_Error "[x] Failed to untar ${package_name}" - rm -rf "${mcsmanager_install_path}/${package_name}" + local installed_ver + installed_ver="$("$node_bin_path" -v 2>/dev/null | sed 's/^v//')" - # compatible with tar.gz packages of different formats - if [ -d "/opt/mcsmanager/mcsmanager" ]; then - cp -rf /opt/mcsmanager/mcsmanager/* /opt/mcsmanager/ - rm -rf /opt/mcsmanager/mcsmanager + if [[ -z "$installed_ver" ]]; then + return 1 fi - # echo "[→] cd daemon" - cd "${mcsmanager_install_path}/daemon" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}/daemon" + if [ "$strict_node_version_check" = true ]; then + if [[ "$installed_ver" != "$required_node_ver" ]]; then + return 3 + fi + else + local cmp + cmp=$(printf "%s\n%s\n" "$required_node_ver" "$installed_ver" | sort -V | head -1) + if [[ "$cmp" != "$required_node_ver" ]]; then + return 2 + fi + fi - echo_cyan "[+] Install MCSManager-Daemon dependencies..." - env "$node_install_path"/bin/node "$node_install_path"/bin/npm install --production --no-fund --no-audit &>/dev/null || Red_Error "[x] Failed to npm install in ${mcsmanager_install_path}/daemon" + # Check if npm exists and works using node (not $PATH/npm) + if [ ! -x "$npm_bin_path" ]; then + return 4 + fi - # echo "[←] cd .." - cd "${mcsmanager_install_path}/web" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}/web" + # Use node to run npm.js directly, in case env is broken + local npm_version + npm_version="$("$node_bin_path" "$npm_bin_path" --version 2>/dev/null)" + if [[ -z "$npm_version" ]]; then + return 4 + fi - echo_cyan "[+] Install MCSManager-Web dependencies..." - env "$node_install_path"/bin/node "$node_install_path"/bin/npm install --production --no-fund --no-audit &>/dev/null || Red_Error "[x] Failed to npm install in ${mcsmanager_install_path}/web" + return 0 +} - echo - echo_yellow "=============== MCSManager ===============" - echo_green "Daemon: ${mcsmanager_install_path}/daemon" - echo_green "Web: ${mcsmanager_install_path}/web" - echo_yellow "=============== MCSManager ===============" - echo - echo_green "[+] MCSManager installation success!" - chmod -R 755 "$mcsmanager_install_path" +# Node.js pre-check. check if we need to install Node.js before installer run. +# Use postcheck_node_after_install() to check after install. +check_node_installed() { + verify_node_at_path "$node_path" + local result=$? - sleep 3 + case $result in + 0) + cprint green bold "Node.js and npm found at $node_path (version $required_node_ver or compatible)" + install_node=false + ;; + 1) + cprint yellow bold "Node.js binary not found or unusable at $node_path" + install_node=true + ;; + 2) + cprint red bold "Node.js version at $node_path is too old. Required: >= $required_node_ver" + install_node=true + ;; + 3) + cprint red bold "Node.js version mismatch. Required: $required_node_ver, found something else." + install_node=true + ;; + 4) + cprint red bold "Node.js is present but npm is missing or broken." + install_node=true + ;; + *) + cprint red bold "Unexpected error in node verification." + install_node=true + ;; + esac } -Create_Service() { - echo_cyan "[+] Create MCSManager service..." +# Node.js post-check. check if Node.js is valid after install. +postcheck_node_after_install() { + verify_node_at_path "$node_path" + if [[ $? -ne 0 ]]; then + cprint red bold "Node.js installation failed or is invalid at $node_path" + return 1 + else + cprint green bold "Node.js is installed and functioning at $node_path" + return 0 + fi +} - echo "[Unit] -Description=MCSManager-Daemon +# Install Node.js and check +install_node() { + local archive_name="node-${node_version}-linux-${node_arch}.tar.xz" + local target_dir="${node_install_dir}/node-${node_version}-linux-${node_arch}" + local archive_path="${node_install_dir}/${archive_name}" + local download_url="${node_download_url_base}${node_version}/${archive_name}" + local fallback="$node_download_fallback" -[Service] -WorkingDirectory=${mcsmanager_install_path}/daemon -ExecStart=${node_install_path}/bin/node app.js -ExecReload=/bin/kill -s QUIT \$MAINPID -ExecStop=/bin/kill -s QUIT \$MAINPID -Environment=\"PATH=${PATH}\" + cprint cyan bold "Installing Node.js $node_version for arch: $node_arch" -[Install] -WantedBy=multi-user.target -" >/etc/systemd/system/mcsm-daemon.service + mkdir -p "$node_install_dir" || { + cprint red bold "Failed to create node install directory: $node_install_dir" + return 1 + } + + # Download + cprint cyan "Downloading Node.js from: $download_url" + if ! wget --progress=bar:force -O "$archive_path" "$download_url"; then + cprint yellow "Primary download failed. Attempting fallback..." + + if [[ -n "$fallback" ]]; then + if [[ "$fallback" =~ ^https?:// ]]; then + cprint cyan "Downloading from fallback URL: $fallback" + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "Fallback download failed from: $fallback" + return 1 + fi + elif [ -f "$fallback" ]; then + cprint cyan "Copying from local fallback: $fallback" + cp "$fallback" "$archive_path" || { + cprint red bold "Failed to copy fallback Node.js archive from $fallback" + return 1 + } + else + cprint red bold "Invalid fallback path: $fallback" + return 1 + fi + else + cprint red bold "No fallback source configured. Cannot proceed." + return 1 + fi + fi + + # Extract archive + cprint cyan "Extracting Node.js archive..." + if ! tar -xf "$archive_path" -C "$node_install_dir"; then + cprint red bold "Failed to extract Node.js archive." + return 1 + fi + + chmod -R a+rx "$target_dir" || { + cprint red bold "Failed to set execute permissions on Node.js files." + return 1 + } + + verify_node_at_path "$target_dir" + local result=$? + if [[ $result -ne 0 ]]; then + cprint red bold "Node.js installation failed verification." + return 1 + fi + + cprint cyan "Cleaning up archive..." + rm -f "$archive_path" - echo "[Unit] -Description=MCSManager-Web + cprint green bold "Node.js $node_version installed successfully at $target_dir" + # Save resolved binary paths to global variables + node_bin_path="${target_dir}/bin/node" + npm_bin_path="${target_dir}/bin/npm" + + cprint green "Node.js binary: $node_bin_path" + cprint green "npm binary: $npm_bin_path" + return 0 +} + +# Function to download MCSM package. fetch from primary URL first, then fallback URL. +# This function only put extracted file(s) into install_dir, it does not perform the actual update. +download_mcsm() { + local archive_name="$package_name" + local archive_path="${tmp_dir}/${archive_name}" + local primary_url="${download_base_url}${archive_name}" + local fallback="$download_fallback_url" + + cprint cyan bold "Downloading MCSManager package..." + + # Step 1: Try downloading from primary URL + if ! wget --progress=bar:force -O "$archive_path" "$primary_url"; then + cprint yellow "Primary download failed. Attempting fallback source..." + + if [[ -z "$fallback" ]]; then + cprint red bold "No fallback URL or path specified." + return 1 + fi + + if [[ "$fallback" =~ ^https?:// ]]; then + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "Fallback download failed from $fallback" + return 1 + fi + elif [[ -f "$fallback" ]]; then + cp "$fallback" "$archive_path" || { + cprint red bold "Failed to copy fallback archive from $fallback" + return 1 + } + else + cprint red bold "Fallback path is invalid: $fallback" + return 1 + fi + fi + + # Step 2: Generate extract directory + local suffix + suffix=$(tr -dc 'a-z0-9' /dev/null; then + cprint green "User '$install_user' already exists." + else + cprint cyan "Creating system user: $install_user (nologin, no password)..." + if ! useradd --system --home "$install_dir" --shell /usr/sbin/nologin "$install_user"; then + cprint red bold "Failed to create user: $install_user" + exit 1 + fi + cprint green "User '$install_user' created." + fi + + + # Docker integration + if command -v docker &>/dev/null; then + cprint cyan "Docker is installed — checking group assignment..." + + if getent group docker &>/dev/null; then + if id -nG "$install_user" | grep -qw docker; then + cprint green "User '$install_user' is already in the 'docker' group." + else + cprint cyan "Adding user '$install_user' to 'docker' group..." + if usermod -aG docker "$install_user"; then + cprint green "Docker group access granted to '$install_user'." + else + cprint red "Failed to add '$install_user' to 'docker' group. Docker may not be usable by this user." + fi + fi + else + cprint red "Docker installed but 'docker' group not found. Skipping group assignment." + fi + else + cprint yellow "Docker not installed — skipping Docker group configuration." + fi + + return 0 +} +# Function to stop MCSM services if they exist +stop_mcsm_services() { + cprint yellow bold "Attempting to stop mcsm-web and mcsm-daemon services..." + + # Attempt to stop mcsm-web + cprint blue "Stopping mcsm-web..." + if systemctl stop mcsm-web; then + cprint green "mcsm-web stopped successfully." + else + cprint red bold "Warning: Failed to stop mcsm-web (may not exist or already stopped)." + fi + + # Attempt to stop mcsm-daemon + cprint blue "Stopping mcsm-daemon..." + if systemctl stop mcsm-daemon; then + cprint green "mcsm-daemon stopped successfully." + else + cprint red bold "Warning: Failed to stop mcsm-daemon (may not exist or already stopped)." + fi +} +# Prepare file & permissions before install. +mcsm_install_prepare() { + + # Stop service if existed + stop_mcsm_services + + if [[ ! -d "$install_tmp_dir" ]]; then + cprint red bold "install_tmp_dir does not exist: $install_tmp_dir" + exit 1 + fi + + cprint cyan "Changing ownership of $install_tmp_dir to user '$install_user'..." + chown -R "$install_user":"$install_user" "$install_tmp_dir" || { + cprint red bold "Failed to change ownership of $install_tmp_dir" + cleanup_install_tmp + exit 1 + } + + # Normalize install_dir to ensure it ends with a slash + [[ "${install_dir}" != */ ]] && install_dir="${install_dir}/" + + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "No existing components detected — skipping data backup/cleanup." + return 0 + fi + + cprint green bold "Existing components prepared successfully." + return 0 +} + +# Install or update a component +install_component() { + local component="$1" + local target_path="${install_dir}${component}" + local backup_data_path="${install_dir}${backup_prefix}${component}" + local source_path="${install_tmp_dir}/mcsmanager/${component}" + + cprint cyan bold "Installing/Updating component: $component" + + # Step 1: Move new component to install_dir + if [[ ! -d "$source_path" ]]; then + cprint red bold "Source directory not found: $source_path" + cleanup_install_tmp + exit 1 + fi + + cprint cyan "Removing node_modules folder: $target_path/node_modules/" + if [[ -d "$target_path/node_modules/" ]]; then + rm -rf "$target_path/node_modules/" + fi + + if cp -a "$source_path"/. "$target_path"; then + cprint green "Updated files from $source_path → $target_path" + rm -rf "$source_path" + else + cprint red bold "Failed to update files from $source_path → $target_path" + cleanup_install_tmp + exit 1 + fi + cprint green "Moved $component to $target_path" + + + # Step 3: Install NPM dependencies + if [[ ! -x "$npm_bin_path" ]]; then + cprint red bold "npm binary not found or not executable: $npm_bin_path" + cleanup_install_tmp + exit 1 + fi + + cprint cyan "Installing dependencies for $component using npm..." + pushd "$target_path" >/dev/null || { + cprint red bold "Failed to change directory to $target_path" + cleanup_install_tmp + exit 1 + } + + if ! "$node_bin_path" "$npm_bin_path" install --no-audit --no-fund --loglevel=warn; then + cprint red bold "NPM dependency installation failed for $component" + popd >/dev/null + cleanup_install_tmp + exit 1 + fi + + popd >/dev/null + cprint green bold "Component '$component' installed/updated successfully." +} + +# Create systemd service for a given component. +# This will overwrite the existing service file. +create_systemd_service() { + local component="$1" + local service_path="${systemd_file}${component}.service" + local working_dir="${install_dir}${component}" + local exec="${node_bin_path} app.js" + + if [[ ! -d "$working_dir" ]]; then + cprint red bold "Component directory not found: $working_dir" + cleanup_install_tmp + return 1 + fi + + cprint cyan "Creating systemd service for '$component'..." + + cat > "$service_path" </etc/systemd/system/mcsm-web.service - - systemctl daemon-reload - systemctl enable --now mcsm-{daemon,web}.service - echo_green "Registered!" - - sleep 2 - - printf "\n\n\n\n" - - echo_yellow "==================================================================" - echo_green "Installation is complete! Welcome to the MCSManager!!!" - echo_yellow " " - echo_cyan_n "HTTP Web Service: " - echo_yellow "http://:23333 (Browser)" - echo_cyan_n "Daemon Address: " - echo_yellow "ws://:24444 (Cluster)" - echo_red "You must expose ports " - echo_yellow "23333" - echo_red " and " - echo_yellow "24444" - echo_red " to use the service properly on the Internet." - echo_yellow " " - echo_cyan "Usage:" - echo_cyan "systemctl start mcsm-{daemon,web}.service" - echo_cyan "systemctl stop mcsm-{daemon,web}.service" - echo_cyan "systemctl restart mcsm-{daemon,web}.service" - echo_yellow " " - echo_green "Official Document: https://docs.mcsmanager.com/" - echo_yellow "==================================================================" -} - -# Environmental inspection -if [[ "$arch" == x86_64 ]]; then - arch=x64 - #echo "[-] x64 architecture detected" -elif [[ $arch == aarch64 ]]; then - arch=arm64 - #echo "[-] 64-bit ARM architecture detected" -elif [[ $arch == arm ]]; then - arch=armv7l - #echo "[-] 32-bit ARM architecture detected" -elif [[ $arch == ppc64le ]]; then - arch=ppc64le - #echo "[-] IBM POWER architecture detected" -elif [[ $arch == s390x ]]; then - arch=s390x - #echo "[-] IBM LinuxONE architecture detected" -else - Red_Error "[x] Sorry, this architecture is not supported yet!\n[x]Please try to install manually: https://github.com/MCSManager/MCSManager#linux" -fi - -# Define the variable Node installation directory -node_install_path="/opt/node-$node-linux-$arch" - -# Check network connection -echo_cyan "[-] Architecture: $arch" - -# Install related software -echo_cyan_n "[+] Installing dependent software (git, tar, wget)... " -if [[ -x "$(command -v yum)" ]]; then - yum install -y git tar wget -elif [[ -x "$(command -v apt-get)" ]]; then - apt-get install -y git tar wget -elif [[ -x "$(command -v pacman)" ]]; then - pacman -S --noconfirm --needed git tar wget -elif [[ -x "$(command -v zypper)" ]]; then - zypper --non-interactive install git tar wget -else - echo_red "[!] Cannot find your package manager! You may need to install git, tar and wget manually!" -fi - -# Determine whether the relevant software is installed successfully -if [[ -x "$(command -v git)" && -x "$(command -v tar)" && -x "$(command -v wget)" ]]; then - echo_green "Success" -else - Red_Error "[x] Failed to find git, tar and wget, please install them manually!" -fi - -# Install the Node environment -Install_Node - -# Install MCSManager -Install_MCSManager - -# Create MCSManager background service -Create_Service +EOF + + if [[ $? -ne 0 ]]; then + cprint red bold "Failed to write service file: $service_path" + cleanup_install_tmp + return 1 + fi + + chmod 644 "$service_path" + cprint green "Created systemd unit: $service_path" + return 0 +} + +# Extract daemon key and/or http port +extract_component_info() { + # DAEMON SECTION + if [[ "$install_daemon" == true ]]; then + local daemon_service="mcsm-daemon.service" + local daemon_path="${install_dir}/daemon" + local daemon_config_path="${daemon_path}/${daemon_key_config_subpath}" + + cprint cyan bold "Starting daemon service..." + if systemctl restart "$daemon_service"; then + cprint green "Daemon service started." + + sleep 3 # Allow service to init and write configs + + if [[ -f "$daemon_config_path" ]]; then + daemon_key=$(grep -oP '"key"\s*:\s*"\K[^"]+' "$daemon_config_path") + daemon_port=$(grep -oP '"port"\s*:\s*\K[0-9]+' "$daemon_config_path") + + if [[ -n "$daemon_key" ]]; then + cprint green "Extracted daemon key: $daemon_key" + else + cprint red "Failed to extract daemon key from: $daemon_config_path" + fi + + if [[ -n "$daemon_port" ]]; then + cprint green "Extracted daemon port: $daemon_port" + else + cprint red "Failed to extract daemon port from: $daemon_config_path" + fi + else + cprint red "Daemon config file not found: $daemon_config_path" + fi + else + cprint red bold "Failed to start daemon service: $daemon_service" + fi + fi + + # WEB SECTION + if [[ "$install_web" == true ]]; then + local web_service="mcsm-web.service" + local web_path="${install_dir}/web" + local web_config_path="${web_path}/${web_port_config_subpath}" + + cprint cyan bold "Starting web service..." + if systemctl restart "$web_service"; then + cprint green "Web service started." + + sleep 3 # Allow time to populate config + + if [[ -f "$web_config_path" ]]; then + web_port=$(grep -oP '"httpPort"\s*:\s*\K[0-9]+' "$web_config_path") + if [[ -n "$web_port" ]]; then + cprint green "Extracted web port: $web_port" + else + cprint red "Failed to extract web port from: $web_config_path" + fi + else + cprint red "Web config file not found: $web_config_path" + fi + else + cprint red bold "Failed to start web service: $web_service" + fi + fi +} + +cleanup_install_tmp() { + if [[ -n "$install_tmp_dir" && -d "$install_tmp_dir" ]]; then + if rm -rf "$install_tmp_dir"; then + cprint green "Cleaned up temporary install folder: $install_tmp_dir" + else + cprint red "Failed to remove temporary folder: $install_tmp_dir" + fi + fi +} + +print_install_result() { + # Clear the screen + clear || true + + # Print ASCII banner + cprint white noprefix "______ _______________________ ___" + cprint white noprefix "___ |/ /_ ____/_ ___/__ |/ /_____ _____________ _______ _____________" + cprint white noprefix "__ /|_/ /_ / _____ \__ /|_/ /_ __ \`/_ __ \ __ \`/_ __ \`/ _ \_ ___/" + cprint white noprefix "_ / / / / /___ ____/ /_ / / / / /_/ /_ / / / /_/ /_ /_/ // __/ /" + cprint white noprefix "/_/ /_/ \____/ /____/ /_/ /_/ \__,_/ /_/ /_/\__,_/ _\__, / \___//_/" + echo "" + # status summary + cprint yellow noprefix "Installed/Updated Component(s):" + if [[ "$install_daemon" == true && -n "$daemon_key" && -n "$daemon_port" ]]; then + cprint white noprefix "Daemon" + elif [[ "$install_daemon" == true ]]; then + cprint white noprefix nonl "Daemon " + cprint yellow noprefix "(partial, config not fully detected)" + fi + + if [[ "$install_web" == true && -n "$web_port" ]]; then + cprint white noprefix "Web" + elif [[ "$install_web" == true ]]; then + cprint white noprefix nonl "Web " + cprint yellow noprefix "(partial, config not fully detected)" + fi + + echo "" + + # Local IP detection + local ip_address + ip_address=$(hostname -I 2>/dev/null | awk '{print $1}') + [[ -z "$ip_address" ]] && ip_address="YOUR-IP" + + # Daemon info + if [[ "$install_daemon" == true ]]; then + local daemon_address="ws://$ip_address:${daemon_port:-Failed to Retrieve from Config file}" + local daemon_key_display="${daemon_key:-Failed to Retrieve from Config file}" + + cprint yellow noprefix "Daemon Address:" + cprint white noprefix " $daemon_address" + cprint yellow noprefix "Daemon Key:" + cprint white noprefix " $daemon_key_display" + echo "" + fi + + # Web info + if [[ "$install_web" == true ]]; then + local web_address="http://$ip_address:${web_port:-Failed to Retrieve from Config file}" + cprint yellow noprefix "HTTP Web Interface:" + cprint white noprefix nonl " $web_address " + cprint yellow noprefix "(open in browser)" + echo "" + fi + + # Port guidance + cprint yellow noprefix "NOTE:" + cprint white noprefix " Make sure to expose the above ports through your firewall." + cprint white noprefix " If accessing from outside your network, you may need to configure port forwarding on your router." + echo "" + + # Service management help + cprint yellow noprefix "Service Management Commands:" + if [[ "$install_daemon" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-daemon.service" + fi + if [[ "$install_web" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-web.service" + fi + echo "" + + # Official doc + cprint yellow noprefix "Official Documentation:" + cprint white noprefix " https://docs.mcsmanager.com/" + echo "" + + # HTTPS support + cprint yellow noprefix "Need HTTPS?" + cprint white noprefix " To enable secure HTTPS access, configure a reverse proxy:" + cprint white noprefix " https://docs.mcsmanager.com/ops/proxy_https.html" + echo "" + + if [[ "$force_permission" == true ]]; then + cprint red noprefix "[Important] You chose to override permission during install." + cprint red noprefix " You may need to run: chown -R $install_user to update permission manually." + fi + + # Closing message + cprint green noprefix "Installation completed. Enjoy managing your servers with MCSManager!" + echo "" +} + +install_mcsm() { + local components=() + + if [[ "$install_web" == true ]]; then + install_component "web" + create_systemd_service "web" + components+=("web") + fi + + if [[ "$install_daemon" == true ]]; then + install_component "daemon" + create_systemd_service "daemon" + components+=("daemon") + fi + + # Reload systemd after any service file changes + if (( ${#components[@]} > 0 )); then + cprint cyan "Reloading systemd daemon..." + # systemctl daemon-reexec + systemctl daemon-reload + + for comp in "${components[@]}"; do + local svc="mcsm-${comp}.service" + + cprint cyan "Enabling service: $svc" + if systemctl enable "$svc" &>/dev/null; then + cprint green "Enabled service: $svc" + else + cprint red bold "Failed to enable service: $svc" + cleanup_install_tmp + exit 1 + fi + done + fi + + # Clean tmp dir + cleanup_install_tmp + # Extract installed component info + safe_run extract_component_info "Failed to extract runtime info from installed services" + safe_run print_install_result "Failed to print installation result" + +} + +main() { + trap 'echo "Unexpected error occurred."; exit 99' ERR + safe_run detect_terminal_capabilities "Failed to detect terminal capabilities" + safe_run check_root "Script must be run as root" + safe_run parse_args "Failed to parse arguments" "$@" + safe_run detect_os_info "Failed to detect OS" + safe_run version_specific_rules "Failed to apply distro/version specific rules" + + # To be moved to a master pre check function. + safe_run resolve_node_arch "Failed to resolve Node.js architecture" + + safe_run check_required_commands "Missing required system commands" + + safe_run check_node_installed "Failed to detect Node.js or npm at expected path. Node.js will be installed." + if [ "$install_node" = true ]; then + safe_run install_node "Node.js installation failed" + fi + + safe_run permission_barrier "Permission validation failed — aborting install" + + safe_run prepare_user "Failed to prepare user permission." + + safe_run download_mcsm "Failed to acquire MCSManager source" + safe_run mcsm_install_prepare "Error while preparing for installation" + + safe_run install_mcsm "Failed to install MCSManager" +} +main "$@" \ No newline at end of file diff --git a/setup_cn.sh b/setup_cn.sh old mode 100755 new mode 100644 index 97e9b8c..7450d9b --- a/setup_cn.sh +++ b/setup_cn.sh @@ -1,245 +1,1384 @@ #!/bin/bash -# This script file is specifically designed for the Chinese region, and servers in the Chinese region are used to accelerate file downloads. +# MCSManager官方安装脚本. +# 这个脚本将会把MCSManager服务端和节点服务端更新/安装至最新发布版本. +# ------------------------------------------------------------------------------ +# 受支持的Linux: +# 此脚本支持以下Linux发行版: +# - Ubuntu: 18.04, 20.04, 22.04, 24.04 +# - Debian: 10, 11, 12, 13 +# - CentOS: 7, 8 Stream, 9 Stream, 10 Stream +# - RHEL: 7, 8, 9, 10 +# - Arch Linux: Support planned (TBD) +# ------------------------------------------------------------------------------ -mcsmanager_install_path="/opt/mcsmanager" -mcsmanager_download_addr="https://cdn.imlazy.ink:233/files/mcsmanager_linux_release.tar.gz" +# Target installation directory (can be overridden with --install-dir) +install_dir="/opt/mcsmanager" + +# Primary download URL bas. Full package URL = download_base_url + package_name +download_base_url="https://cdn.imlazy.ink:233/files/" + +# Fallback download URL (can also be a local directory or mirror) +download_fallback_url="https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz" + +# Name of the release package to download/detect package_name="mcsmanager_linux_release.tar.gz" -node="v20.12.2" -arch=$(uname -m) -if [ "$(id -u)" -ne 0 ]; then - echo "This script must be run as root. Please use \"sudo bash\" instead." - exit 1 -fi +# Node.js version to be installed +# Keep the leading "v" +node_version="v20.12.2" +node_version_centos7="v16.20.2" + +# Node download base URL - primary +node_download_url_base="https://nodejs.org/dist/" + +# Unoffical build of Node.js, for more ISA support +node_unoffical_build_url="https://unofficial-builds.nodejs.org/download/release/" + +# Node download URL - fallback. +# This is the URL points directly to the file, not the base. This can also be a local absolute path. +# Only supports https:// or http:// for web locations. +node_download_fallback="" + +# Node.js installation path (defaults to the MCSManager installation path. Can be overridden with --node-install-dir) +node_install_dir="$install_dir" + +# Temp dir for file extraction +tmp_dir="/tmp" + +# Bypass installed user permission check, override by --force-permission +force_permission=false + + +# --------------- Global Variables ---------------# +# DO NOT MODIFY # + + +# Component installation options. +# For fresh installs, both daemon and web components are installed by default. +# For updates, behavior depends on detected existing components. +# Can be overridden with --install daemon/web/all +install_daemon=true +install_web=true + +# Install MCSM as (default: root). +# To install as a general user (e.g., "mcsm"), use the --user option: --user mcsm +# To ensure compatibility, only user mcsm is supported. +install_user="root" +# Installed user, for permission check +web_installed=false +daemon_installed=false +web_installed_user="" +daemon_installed_user="" + +# Service file locations +# the final dir = systemd_file + {web/daemon} + ".service" +systemd_file="/etc/systemd/system/mcsm-" +# Optional: Override the default installation source file. +# If --install-source is specified, the installer will use the provided +# "mcsmanager_linux_release.tar.gz" file instead of downloading it. +# Only support local absolute path. +install_source_path="" + +# temp path for extracted file(s) +install_tmp_dir="/opt/mcsmanager/mcsm_abcd" -printf "\033c" +# dir name for data dir backup +# e.g. /opt/mcsmanager/daemon/data -> /opt/mcsmanager/data_bak_data +# only valid for when during an update +backup_prefix="data_bak_" -echo_cyan() { - printf '\033[1;36m%b\033[0m\n' "$@" +# System architecture (detected automatically) +arch="" +version="" +distro="" + + + +# Supported OS versions (map-style structure) +# Format: supported_os["distro_name"]="version1 version2 version3 ..." +declare -A supported_os +supported_os["Ubuntu"]="18 20 22 24" +supported_os["Debian"]="10 11 12 13" +supported_os["CentOS"]="7 8 8-stream 9-stream 10-stream" +supported_os["RHEL"]="7 8 9 10" +supported_os["Arch"]="rolling" + +# Required system commands for installation +# These will be checked before logic process +required_commands=( + chmod + chown + wget + tar + stat + useradd + usermod + date +) + +# Node.js related sections +# Enable strict version checking (exact match) +# enabled -> strict requriement for defined node version +# false -> newer version allowed +# Older version is NEVER allowed +strict_node_version_check=true + +# Will be set based on actual node status +install_node=true +# Remove leading "v" from defined version +required_node_ver="${node_version#v}" + +# Holds absolute path for node & npm +node_bin_path="" +npm_bin_path="" +# Hold Node.js arch name, e.g. x86_64 -> x64 +node_arch="" +# Hold Node.js intallation path, e.g. ${node_install_dir}/node-${node_version}-linux-${arch} +node_path="" + +# For installation result +daemon_key="" +daemon_port="" +web_port="" +daemon_key_config_subpath="data/Config/global.json" +web_port_config_subpath="data/SystemConfig/config.json" + +# Terminal color & style related +# Default to false, auto check later +SUPPORTS_COLOR=false +SUPPORTS_STYLE=false +# Declare ANSI reset +RESET="\033[0m" + +# Foreground colors +declare -A FG_COLORS=( + [black]="\033[0;30m" + [red]="\033[0;31m" + [green]="\033[0;32m" + [yellow]="\033[0;33m" + [blue]="\033[0;34m" + [magenta]="\033[0;35m" + [cyan]="\033[0;36m" + [white]="\033[0;37m" +) + +# Font styles +declare -A STYLES=( + [bold]="\033[1m" + [underline]="\033[4m" + [italic]="\033[3m" # Often ignored + [clear_line]="\r\033[2K" + [strikethrough]="\033[9m" +) + + +### Helper Functions +# Execution wrapper, avoid unexpected crashes. +safe_run() { + local func="$1" + local err_msg="$2" + shift 2 + + if ! "$func" "$@"; then + echo "Error: $err_msg" + exit 1 + fi } -echo_red() { - printf '\033[1;31m%b\033[0m\n' "$@" + +# Function to ensure the script is run as root +check_root() { + # Using Bash's built-in EUID variable + if [ -n "$EUID" ]; then + if [ "$EUID" -ne 0 ]; then + cprint red "错误: 这个脚本只能运行在root或sudo模式下,请尝试切换用户或者使用sudo." + exit 1 + fi + else + # Fallback to using id -u if EUID is unavailable (e.g., non-Bash shell or misconfigured environment) + if [ "$(id -u)" -ne 0 ]; then + cprint red "错误: 这个脚本只能运行在root或sudo模式下,请尝试切换用户或者使用sudo." + exit 1 + fi + fi +} + +# Function to check whether current terminal support color & style +detect_terminal_capabilities() { + SUPPORTS_COLOR=false + SUPPORTS_STYLE=false + + if [ -t 1 ] && command -v tput >/dev/null 2>&1; then + if [ "$(tput colors)" -ge 8 ]; then + SUPPORTS_COLOR=true + fi + if tput bold >/dev/null 2>&1 && tput smul >/dev/null 2>&1; then + SUPPORTS_STYLE=true + fi + fi + + if [ "$SUPPORTS_COLOR" = true ]; then + cprint green "[OK] 这个终端支持彩色输出." + else + cprint yellow "注:终端不支持彩色输出。不格式化继续." + fi + + if [ "$SUPPORTS_STYLE" = true ]; then + cprint green "[OK] 终端支持粗体和下划线格式." + else + cprint yellow "注意:终端不支持高级文本样式." + fi } -echo_green() { - printf '\033[1;32m%b\033[0m\n' "$@" + +# Check whether daemon or web is installed +is_component_installed() { + local component_name="$1" + local component_path="${install_dir}/${component_name}" + + if [[ -d "$component_path" ]]; then + cprint green "组件 '$component_name' 已经被安装在 $component_path" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=true + elif [[ "$component_name" == "web" ]]; then + web_installed=true + fi + + return 0 + else + cprint yellow "组件 '$component_name' 未被安装" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=false + elif [[ "$component_name" == "web" ]]; then + web_installed=false + fi + + return 1 + fi +} + +check_component_permission() { + local component="$1" + local service_file="${systemd_file}${component}.service" + + if [[ ! -f "$service_file" ]]; then + cprint yellow "找不到服务文件: $service_file" + return 0 # nothing changed + fi + + # Extract the User= line if it exists + local user_line + user_line=$(grep -E '^User=' "$service_file" 2>/dev/null | head -1) + + local user + if [[ -z "$user_line" ]]; then + user="root" # default if no User= is defined + else + user="${user_line#User=}" + fi + + # Validate user + if [[ "$user" != "root" && "$user" != "mcsm" ]]; then + cprint red bold "不支持的用户 '$user' 在 $service_file. 使用 'root' 或 'mcsm'." + exit 1 + fi + + # Assign to appropriate global + if [[ "$component" == "web" ]]; then + web_installed_user="$user" + elif [[ "$component" == "daemon" ]]; then + daemon_installed_user="$user" + fi + + cprint cyan "已删除 $component 以用户身份安装: $user" + return 0 } -echo_cyan_n() { - printf '\033[1;36m%b\033[0m' "$@" + + + +parse_args() { + local explicit_install_flag=false + + while [[ $# -gt 0 ]]; do + case "$1" in + --install-dir) + if [[ -n "$2" ]]; then + install_dir="$2" + shift 2 + else + echo "错误:--install-dir需要一个路径参数." + exit 1 + fi + ;; + --node-install-dir) + if [[ -n "$2" ]]; then + node_install_dir="$2" + shift 2 + else + echo "错误:--node-install-dir需要一个路径参数." + exit 1 + fi + ;; + --install) + explicit_install_flag=true + if [[ -n "$2" && "$2" != --* ]]; then + case "$2" in + daemon) + install_daemon=true + is_component_installed "daemon" + install_web=false + check_component_permission "daemon" + ;; + web) + install_daemon=false + is_component_installed "web" + install_web=true + check_component_permission "web" + ;; + all) + install_daemon=true + install_web=true + is_component_installed "daemon" + is_component_installed "web" + check_component_permission "daemon" + check_component_permission "web" + ;; + *) + echo "错误:--install的值无效。期望‘daemon’, ‘web’或‘all’." + echo "Usage: --install daemon|web|all" + exit 1 + ;; + esac + shift 2 + else + echo "错误:提供了--install标志,但没有值。请指定:daemon、web或all." + echo "使用方法: --install daemon|web|all" + exit 1 + fi + ;; + --user) + if [[ -n "$2" ]]; then + case "$2" in + root) + install_user="root" + ;; + mcsm) + install_user="mcsm" + ;; + *) + echo "错误:无效用户 '$2'. 只有 'root' 和 'mcsm' 受支持." + echo "使用方法: --user root|mcsm" + exit 1 + ;; + esac + shift 2 + else + echo "错误:--user需要一个值 (root 或 mcsm)." + exit 1 + fi + ;; + --install-source) + if [[ -n "$2" ]]; then + install_source_path="$2" + shift 2 + else + echo "错误:--install-source需要文件路径." + exit 1 + fi + ;; + --force-permission) + force_permission=true + shift + ;; + *) + echo "错误:未知参数t: $1" + exit 1 + ;; + esac + done + + # Auto-detect branch: only run if --install was not explicitly passed + if [[ "$explicit_install_flag" == false ]]; then + daemon_installed=false + web_installed=false + + if is_component_installed "daemon"; then + daemon_installed=true + check_component_permission "daemon" + fi + if is_component_installed "web"; then + web_installed=true + check_component_permission "web" + fi + + # When only one component installed, we wanted to process that one only. + if [[ "$daemon_installed" == true && "$web_installed" == false ]]; then + install_daemon=true + install_web=false + elif [[ "$daemon_installed" == false && "$web_installed" == true ]]; then + install_daemon=false + install_web=true + else + install_daemon=true + install_web=true + fi + fi } -echo_yellow() { - printf '\033[1;33m%b\033[0m\n' "$@" + + +# Get Distribution & Architecture Info +detect_os_info() { + distro="Unknown" + version="Unknown" + arch=$(uname -m) + + # Try primary source + if [ -f /etc/os-release ]; then + . /etc/os-release + distro_id="${ID,,}" + version_id="${VERSION_ID,,}" + + case "$distro_id" in + ubuntu) + distro="Ubuntu" + version="$version_id" + ;; + debian) + distro="Debian" + version="$version_id" + ;; + centos) + distro="CentOS" + version="$version_id" + ;; + rhel*) + distro="RHEL" + version="$version_id" + ;; + arch) + distro="Arch" + version="rolling" + ;; + *) + distro="${ID:-Unknown}" + version="$version_id" + ;; + esac + fi + + # Fallbacks for missing or invalid version + if [[ -z "$version" || "$version" == "unknown" || "$version" == "" ]]; then + if [ -f /etc/issue ]; then + version_guess=$(grep -oP '[0-9]+(\.[0-9]+)*' /etc/issue | head -1) + if [[ -n "$version_guess" ]]; then + version="$version_guess" + fi + fi + fi + + # Normalize version: keep only major version + version_full="$version" + cprint cyan "检测到操作系统: $distro $version_full" + cprint cyan "检测到架构: $arch" } -# script info -echo_cyan "+---------------------------------------------------------------------- -| MCSManager 安装脚本 (MCSManager Installer) -+---------------------------------------------------------------------- -" +version_specific_rules() { + # Default: do nothing unless a rule matches -Red_Error() { - echo '=================================================' - printf '\033[1;31;40m%b\033[0m\n' "$@" - echo '=================================================' - exit 1 + if [[ "$distro" == "CentOS" && "$version" == "7" ]]; then + cprint yellow "Detected CentOS 7 — overriding Node.js version." + node_version="$node_version_centos7" + required_node_ver="${node_version#v}" + fi } -Install_Node() { - if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then - echo_green "Node.js version is up-to-date, skipping installation." - return +# Check if all required commands are available +check_required_commands() { + local missing=0 + + for cmd in "${required_commands[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + echo "错误:必需的命令 '$cmd' 在PATH中不可用." + missing=1 + fi + done + + if [ "$missing" -ne 0 ]; then + echo "缺少一个或多个必需的命令。请安装后再试." + return 1 fi - echo_cyan "[+] Install Node.JS environment..." + cprint green "所有必需的命令都可用." + return 0 +} - rm -irf "$node_install_path" +# Print with specified color and style, fallback to RESET if not supported. +# Supported colors*: black|red|green|yellow|blue|magenta|cyan|white +# Supported styles*: bold|underline|italic|clear_line|strikethrough +# *Note: some style may not necessarily work on all terminals. +# Example usage: +# cprint green bold "Installation completed successfully." +# cprint red underline "Failed to detect required command: wget" +# cprint yellow "Warning: Disk space is low." +# cprint underline "Failed to detect required command: wget" +# cprint bold green underline"Installation completed successfully." - cd /opt || Red_Error "[x] Failed to enter /opt" +cprint() { + local color="" + local text="" + local styles="" + local disable_prefix=false + local disable_newline=false - rm -rf "node-$node-linux-$arch.tar.gz" + while [[ $# -gt 1 ]]; do + case "$1" in + black|red|green|yellow|blue|magenta|cyan|white) + color="$1" + ;; + bold|underline|italic|clear_line|strikethrough) + styles+="${STYLES[$1]}" + ;; + noprefix) + disable_prefix=true + ;; + nonl) + disable_newline=true + ;; + esac + shift + done - # wget "https://nodejs.org/dist/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to download node release" - wget "https://registry.npmmirror.com/-/binary/node/$node/node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to download node release" + text="$1" - tar -zxf "node-$node-linux-$arch.tar.gz" || Red_Error "[x] Failed to untar node" + local prefix_text="" + if [[ "$disable_prefix" != true ]]; then + local timestamp="[$(date +%H:%M:%S)]" + local label="[MCSM Installer]" + prefix_text="${FG_COLORS[white]}$timestamp $label${RESET} " + fi - rm -rf "node-$node-linux-$arch.tar.gz" + local prefix="" + if [[ -n "$color" && "$SUPPORTS_COLOR" = true ]]; then + prefix+="${FG_COLORS[$color]}" + fi + if [[ "$SUPPORTS_STYLE" = true || "$styles" == *"${STYLES[clear_line]}"* ]]; then + prefix="$styles$prefix" + fi - if [[ -f "$node_install_path"/bin/node ]] && [[ "$("$node_install_path"/bin/node -v)" == "$node" ]]; then - echo_green "Success" + if [[ "$disable_newline" == true ]]; then + printf "%b%b%s%b" "$prefix_text" "$prefix" "$text" "$RESET" else - Red_Error "[x] Node installation failed!" + printf "%b%b%s%b\n" "$prefix_text" "$prefix" "$text" "$RESET" fi +} + + + + +# Permission check before proceed with installation +permission_barrier() { + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "当前没有安装组件-跳过权限检查." + return 0 + fi + + for component in web daemon; do + local is_installed_var="${component}_installed" + local installed_user_var="${component}_installed_user" + + if [[ "${!is_installed_var}" == true ]]; then + local installed_user="${!installed_user_var}" - echo - echo_yellow "=============== Node.JS Version ===============" - echo_yellow " node: $("$node_install_path"/bin/node -v)" - echo_yellow " npm: v$(env "$node_install_path"/bin/node "$node_install_path"/bin/npm -v)" - echo_yellow "=============== Node.JS Version ===============" - echo + # Step 0: Ensure installed user is detected + if [[ -z "$installed_user" ]]; then + cprint red bold "检测到 '$component' 已安装,但无法从其systemd服务文件确定用户." + cprint red "这可能表示自定义或不支持的服务文件设置." + cprint red "拒绝执行以避免潜在的冲突." + exit 1 + fi - sleep 3 + # Step 1: User match check with optional force override + if [[ "$installed_user" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "权限不匹配 '$component':" + cprint yellow "以用户身份安装: $installed_user" + cprint yellow "目标安装用户: $install_user" + cprint yellow "用户不匹配,但设置了--force-permission。继续和更新权限…" + sleep 3 + else + cprint red bold "权限不匹配 '$component':" + cprint red "以用户身份安装: $installed_user" + cprint red "目标安装用户: $install_user" + cprint red "用户不匹配,但设置了--force-permission。继续和更新权限..." + exit 1 + fi + else + cprint green bold "权限检查已通过: '$installed_user' 匹配目标用户." + fi + + fi + done + + # Step 2: Directory ownership check + local dir_owner + dir_owner=$(stat -c '%U' "$install_dir" 2>/dev/null) + + if [[ -z "$dir_owner" ]]; then + cprint red bold "无法确定安装目录的所有者: $install_dir" + exit 1 + fi + + if [[ "$dir_owner" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "安装目录所有权不匹配:" + cprint yellow " 目录: $install_dir" + cprint yellow " 归: $dir_owner" + cprint yellow " 预期: $install_user" + cprint yellow " --force-permission设置。尽管不匹配,但继续." + sleep 3 + else + cprint red bold "安装目录所有权不匹配:" + cprint red " 目录: $install_dir" + cprint red " 归: $dir_owner" + cprint red " 预期: $install_user" + exit 1 + fi + else + cprint green bold "安装目录所有权检查通过: '$install_dir' is owned by '$install_user'." + fi + + cprint green bold "验证了权限和所有权。继续." + return 0 } -Install_MCSManager() { - echo_cyan "[+] Install MCSManager..." - # stop service - systemctl disable --now mcsm-{web,daemon} - # delete service - rm -rf /etc/systemd/system/mcsm-{daemon,web}.service - systemctl daemon-reload +# Map OS arch with actual Node.js Arch name +# This function should be placed after var arch has been assigned a valid value. +resolve_node_arch() { + case "$arch" in + x86_64) + node_arch="x64" + ;; + aarch64) + node_arch="arm64" + ;; + armv7l) + node_arch="armv7l" + ;; + loongarch64) + node_arch="loong64" + # Use unoffical build + node_download_url_base=$node_unoffical_build_url + ;; + *) + cprint red bold "Node.js不支持的架构: $arch" + return 1 + ;; + esac - mkdir -p "${mcsmanager_install_path}" || Red_Error "[x] Failed to create ${mcsmanager_install_path}" + # Assign node_path based on resolved arch and current version/install dir + node_path="${node_install_dir}/node-${node_version}-linux-${node_arch}" - # cd /opt/mcsmanager - cd "${mcsmanager_install_path}" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}" + cprint cyan "解析了Node.js架构: $node_arch" + cprint cyan "Node.js安装路径: $node_path" +} - # download MCSManager release - wget "${mcsmanager_download_addr}" -O "${package_name}" || Red_Error "[x] Failed to download MCSManager" - tar -zxf ${package_name} -o || Red_Error "[x] Failed to untar ${package_name}" - rm -rf "${mcsmanager_install_path}/${package_name}" +# Check if Node.js at PATH is valid. +# This function check Node.js version + NPM (if Node.js valid) +verify_node_at_path() { + local node_path="$1" + node_bin_path="$node_path/bin/node" + npm_bin_path="$node_path/bin/npm" - # compatible with tar.gz packages of different formats - if [ -d "/opt/mcsmanager/mcsmanager" ]; then - cp -rf /opt/mcsmanager/mcsmanager/* /opt/mcsmanager/ - rm -rf /opt/mcsmanager/mcsmanager + # Node binary missing + if [ ! -x "$node_bin_path" ]; then + return 1 fi - # echo "[→] cd daemon" - cd "${mcsmanager_install_path}/daemon" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}/daemon" + local installed_ver + installed_ver="$("$node_bin_path" -v 2>/dev/null | sed 's/^v//')" + + if [[ -z "$installed_ver" ]]; then + return 1 + fi - echo_cyan "[+] Install MCSManager-Daemon dependencies..." - env "$node_install_path"/bin/node "$node_install_path"/bin/npm install --registry=https://registry.npmmirror.com --production --no-fund --no-audit &>/dev/null || Red_Error "[x] Failed to npm install in ${mcsmanager_install_path}/daemon" + if [ "$strict_node_version_check" = true ]; then + if [[ "$installed_ver" != "$required_node_ver" ]]; then + return 3 + fi + else + local cmp + cmp=$(printf "%s\n%s\n" "$required_node_ver" "$installed_ver" | sort -V | head -1) + if [[ "$cmp" != "$required_node_ver" ]]; then + return 2 + fi + fi - # echo "[←] cd .." - cd "${mcsmanager_install_path}/web" || Red_Error "[x] Failed to enter ${mcsmanager_install_path}/web" + # Check if npm exists and works using node (not $PATH/npm) + if [ ! -x "$npm_bin_path" ]; then + return 4 + fi - echo_cyan "[+] Install MCSManager-Web dependencies..." - env "$node_install_path"/bin/node "$node_install_path"/bin/npm install --registry=https://registry.npmmirror.com --production --no-fund --no-audit &>/dev/null || Red_Error "[x] Failed to npm install in ${mcsmanager_install_path}/web" + # Use node to run npm.js directly, in case env is broken + local npm_version + npm_version="$("$node_bin_path" "$npm_bin_path" --version 2>/dev/null)" + if [[ -z "$npm_version" ]]; then + return 4 + fi - echo - echo_yellow "=============== MCSManager ===============" - echo_green "Daemon: ${mcsmanager_install_path}/daemon" - echo_green "Web: ${mcsmanager_install_path}/web" - echo_yellow "=============== MCSManager ===============" - echo - echo_green "[+] MCSManager installation success!" + return 0 +} - chmod -R 755 "$mcsmanager_install_path" - sleep 3 +# Node.js pre-check. check if we need to install Node.js before installer run. +# Use postcheck_node_after_install() to check after install. +check_node_installed() { + verify_node_at_path "$node_path" + local result=$? + + case $result in + 0) + cprint green bold "Node.js和npm在 $node_path (版本 $required_node_ver 或兼容)" + install_node=false + ;; + 1) + cprint yellow bold "Node.js二进制文件未找到或无法使用 $node_path" + install_node=true + ;; + 2) + cprint red bold "Node.js版本 $node_path 太老. 要求: >= $required_node_ver" + install_node=true + ;; + 3) + cprint red bold "Node.js版本不匹配。要求: $required_node_ver, 发现了其他的Node.js版本." + install_node=true + ;; + 4) + cprint red bold "Node.js存在,但npm缺失或损坏." + install_node=true + ;; + *) + cprint red bold "Node验证中出现意外错误." + install_node=true + ;; + esac +} + +# Node.js post-check. check if Node.js is valid after install. +postcheck_node_after_install() { + verify_node_at_path "$node_path" + if [[ $? -ne 0 ]]; then + cprint red bold "Node.js安装失败或无效 $node_path" + return 1 + else + cprint green bold "Node.js的安装和运行在 $node_path" + return 0 + fi } -Create_Service() { - echo_cyan "[+] Create MCSManager service..." +# Install Node.js and check +install_node() { + local archive_name="node-${node_version}-linux-${node_arch}.tar.xz" + local target_dir="${node_install_dir}/node-${node_version}-linux-${node_arch}" + local archive_path="${node_install_dir}/${archive_name}" + local download_url="${node_download_url_base}${node_version}/${archive_name}" + local fallback="$node_download_fallback" - echo "[Unit] -Description=MCSManager-Daemon + cprint cyan bold "安装Node.js $node_version 架构: $node_arch" -[Service] -WorkingDirectory=${mcsmanager_install_path}/daemon -ExecStart=${node_install_path}/bin/node app.js -ExecReload=/bin/kill -s QUIT \$MAINPID -ExecStop=/bin/kill -s QUIT \$MAINPID -Environment=\"PATH=${PATH}\" + mkdir -p "$node_install_dir" || { + cprint red bold "创建Node安装目录失败: $node_install_dir" + return 1 + } -[Install] -WantedBy=multi-user.target -" >/etc/systemd/system/mcsm-daemon.service + # Download + cprint cyan "下载Node.js: $download_url" + if ! wget --progress=bar:force -O "$archive_path" "$download_url"; then + cprint yellow "主下载失败。尝试备用下载……" + + if [[ -n "$fallback" ]]; then + if [[ "$fallback" =~ ^https?:// ]]; then + cprint cyan "从备用URL下载: $fallback" + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "备用下载失败: $fallback" + return 1 + fi + elif [ -f "$fallback" ]; then + cprint cyan "从本地备份进行复制: $fallback" + cp "$fallback" "$archive_path" || { + cprint red bold "复制备用Node.js存档失败 $fallback" + return 1 + } + else + cprint red bold "无效的备用路径: $fallback" + return 1 + fi + else + cprint red bold "没有配置备用源。不能继续进行." + return 1 + fi + fi + + # Extract archive + cprint cyan "提取Node.js存档..." + if ! tar -xf "$archive_path" -C "$node_install_dir"; then + cprint red bold "提取Node.js文件失败." + return 1 + fi + + chmod -R a+rx "$target_dir" || { + cprint red bold "在Node.js文件上设置执行权限失败." + return 1 + } + + verify_node_at_path "$target_dir" + local result=$? + if [[ $result -ne 0 ]]; then + cprint red bold "Node.js安装验证失败." + return 1 + fi - echo "[Unit] -Description=MCSManager-Web + cprint cyan "清理文件……" + rm -f "$archive_path" + + cprint green bold "Node.js $node_version 安装成功 $target_dir" + # Save resolved binary paths to global variables + node_bin_path="${target_dir}/bin/node" + npm_bin_path="${target_dir}/bin/npm" + + cprint green "Node.js 二进制文件: $node_bin_path" + cprint green "npm 二进制文件: $npm_bin_path" + return 0 +} + +# Function to download MCSM package. fetch from primary URL first, then fallback URL. +# This function only put extracted file(s) into install_dir, it does not perform the actual update. +download_mcsm() { + local archive_name="$package_name" + local archive_path="${tmp_dir}/${archive_name}" + local primary_url="${download_base_url}${archive_name}" + local fallback="$download_fallback_url" + + cprint cyan bold "下载MCSManager安装包…" + + # Step 1: Try downloading from primary URL + if ! wget --progress=bar:force -O "$archive_path" "$primary_url"; then + cprint yellow "主下载失败。尝试备用资源…" + + if [[ -z "$fallback" ]]; then + cprint red bold "没有指定备用URL或路径." + return 1 + fi + + if [[ "$fallback" =~ ^https?:// ]]; then + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "备用下载失败 $fallback" + return 1 + fi + elif [[ -f "$fallback" ]]; then + cp "$fallback" "$archive_path" || { + cprint red bold "未能复制备用文件 $fallback" + return 1 + } + else + cprint red bold "备用路径无效: $fallback" + return 1 + fi + fi + + # Step 2: Generate extract directory + local suffix + suffix=$(tr -dc 'a-z0-9' /dev/null; then + cprint green "用户 '$install_user' 已经存在." + else + cprint cyan "创建系统用户: $install_user (无登录,无密码)..." + if ! useradd --system --home "$install_dir" --shell /usr/sbin/nologin "$install_user"; then + cprint red bold "创建用户失败: $install_user" + exit 1 + fi + cprint green "用户 '$install_user' 已创建." + fi + + + # Docker integration + if command -v docker &>/dev/null; then + cprint cyan "Docker已被安装 -检查组分配…" + + if getent group docker &>/dev/null; then + if id -nG "$install_user" | grep -qw docker; then + cprint green "用户 '$install_user' 已经在“docker”组中." + else + cprint cyan "添加用户 '$install_user' 到 'docker' 组..." + if usermod -aG docker "$install_user"; then + cprint green "授予的Docker组访问权限 '$install_user'." + else + cprint red "未能添加 '$install_user' 给“Docker”组。这个用户可能无法使用Docker." + fi + fi + else + cprint red "安装了Docker,但没有找到Docker组。跳过组分配." + fi + else + cprint yellow "未安装Docker -跳过Docker组配置." + fi + + return 0 +} +# Function to stop MCSM services if they exist +stop_mcsm_services() { + cprint yellow bold "试图停止mcsm-web和mcsm-daemon服务..." + + # Attempt to stop mcsm-web + cprint blue "正在停止 mcsm-web..." + if systemctl stop mcsm-web; then + cprint green "mcsm-web 已停止." + else + cprint red bold "警告:未能停止mcsm-web(可能不存在或已停止)." + fi + + # Attempt to stop mcsm-daemon + cprint blue "正在停止 mcsm-daemon..." + if systemctl stop mcsm-daemon; then + cprint green "mcsm-daemon 已停止." + else + cprint red bold "警告:未能停止mcsm-daemon(可能不存在或已停止)." + fi +} +# Prepare file & permissions before install. +mcsm_install_prepare() { + + # Stop service if existed + stop_mcsm_services + + if [[ ! -d "$install_tmp_dir" ]]; then + cprint red bold "临时安装目录不存在: $install_tmp_dir" + exit 1 + fi + + cprint cyan "改变所有权 $install_tmp_dir 到用户 '$install_user'..." + chown -R "$install_user":"$install_user" "$install_tmp_dir" || { + cprint red bold "所有权变更失败 $install_tmp_dir" + cleanup_install_tmp + exit 1 + } + + # Normalize install_dir to ensure it ends with a slash + [[ "${install_dir}" != */ ]] && install_dir="${install_dir}/" + + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "没有检测到现有组件-跳过数据备份/清理." + return 0 + fi + + cprint green bold "已成功准备现有组件." + return 0 +} + +# Install or update a component +install_component() { + local component="$1" + local target_path="${install_dir}${component}" + local backup_data_path="${install_dir}${backup_prefix}${component}" + local source_path="${install_tmp_dir}/mcsmanager/${component}" + + cprint cyan bold "安装/更新组件: $component" + + # Step 1: Move new component to install_dir + if [[ ! -d "$source_path" ]]; then + cprint red bold "找不到源目录: $source_path" + cleanup_install_tmp + exit 1 + fi + + cprint cyan "删除依赖库文件 $target_path/node_modules/" + if [[ -d "$target_path/node_modules/" ]]; then + rm -rf "$target_path/node_modules/" + fi + + if cp -a "$source_path"/. "$target_path"; then + cprint green "更新的文件 $source_path → $target_path" + rm -rf "$source_path" + else + cprint red bold "更新文件失败 $source_path → $target_path" + cleanup_install_tmp + exit 1 + fi + cprint green "已移动 $component 到 $target_path" + + + # Step 3: Install NPM dependencies + if [[ ! -x "$npm_bin_path" ]]; then + cprint red bold "找不到npm二进制文件或无法执行: $npm_bin_path" + cleanup_install_tmp + exit 1 + fi + + cprint cyan "正在使用npm安装依赖库 $component ..." + pushd "$target_path" >/dev/null || { + cprint red bold "更改目录失败 $target_path" + cleanup_install_tmp + exit 1 + } + + + if ! "$node_bin_path" "$npm_bin_path" install --registry=https://registry.npmmirror.com --no-audit --no-fund --loglevel=warn; then + cprint red bold "NPM依赖项安装失败 $component" + popd >/dev/null + cleanup_install_tmp + exit 1 + fi + + popd >/dev/null + cprint green bold "组件 '$component' 安装/更新成功." +} + +# Create systemd service for a given component. +# This will overwrite the existing service file. +create_systemd_service() { + local component="$1" + local service_path="${systemd_file}${component}.service" + local working_dir="${install_dir}${component}" + local exec="${node_bin_path} app.js" + + if [[ ! -d "$working_dir" ]]; then + cprint red bold "找不到组件目录: $working_dir" + cleanup_install_tmp + return 1 + fi + + cprint cyan "创建systemd服务 '$component'..." + + cat > "$service_path" </etc/systemd/system/mcsm-web.service - - systemctl daemon-reload - systemctl enable --now mcsm-{daemon,web}.service - echo_green "Registered!" - - sleep 2 - - printf "\n\n\n\n" - - echo_yellow "==================================================================" - echo_green "安装完成,欢迎使用 MCSManager !" - echo_yellow " " - echo_cyan_n "主控网页访问地址: " - echo_yellow "http://:23333 (Browser)" - echo_cyan_n "被控守护进程地址: " - echo_yellow "ws://:24444 (Cluster)" - echo_red "默认情况下,你必须开放 23333 和 24444 端口才能确保面板工作正常!" - echo_yellow " " - echo_cyan "面板开关指令:" - echo_cyan "systemctl start mcsm-{daemon,web}.service" - echo_cyan "systemctl stop mcsm-{daemon,web}.service" - echo_cyan "systemctl restart mcsm-{daemon,web}.service" - echo_yellow " " - echo_green "官方文档: https://docs.mcsmanager.com/" - echo_yellow "==================================================================" -} - -# Environmental inspection -if [[ "$arch" == x86_64 ]]; then - arch=x64 - #echo "[-] x64 architecture detected" -elif [[ $arch == aarch64 ]]; then - arch=arm64 - #echo "[-] 64-bit ARM architecture detected" -elif [[ $arch == arm ]]; then - arch=armv7l - #echo "[-] 32-bit ARM architecture detected" -elif [[ $arch == ppc64le ]]; then - arch=ppc64le - #echo "[-] IBM POWER architecture detected" -elif [[ $arch == s390x ]]; then - arch=s390x - #echo "[-] IBM LinuxONE architecture detected" -else - Red_Error "[x] Sorry, this architecture is not supported yet!\n[x]Please try to install manually: https://github.com/MCSManager/MCSManager#linux" -fi - -# Define the variable Node installation directory -node_install_path="/opt/node-$node-linux-$arch" - -# Check network connection -echo_cyan "[-] Architecture: $arch" - -# Install related software -echo_cyan_n "[+] Installing dependent software (git, tar, wget)... " -if [[ -x "$(command -v yum)" ]]; then - yum install -y git tar wget -elif [[ -x "$(command -v apt-get)" ]]; then - apt-get install -y git tar wget -elif [[ -x "$(command -v pacman)" ]]; then - pacman -S --noconfirm --needed git tar wget -elif [[ -x "$(command -v zypper)" ]]; then - zypper --non-interactive install git tar wget -else - echo_red "[!] Cannot find your package manager! You may need to install git, tar and wget manually!" -fi - -# Determine whether the relevant software is installed successfully -if [[ -x "$(command -v git)" && -x "$(command -v tar)" && -x "$(command -v wget)" ]]; then - echo_green "Success" -else - Red_Error "[x] Failed to find git, tar and wget, please install them manually!" -fi - -# Install the Node environment -Install_Node - -# Install MCSManager -Install_MCSManager - -# Create MCSManager background service -Create_Service +EOF + + if [[ $? -ne 0 ]]; then + cprint red bold "Failed to write service file: $service_path" + cleanup_install_tmp + return 1 + fi + + chmod 644 "$service_path" + cprint green "创建的systemd单元: $service_path" + return 0 +} + +# Extract daemon key and/or http port +extract_component_info() { + # DAEMON SECTION + if [[ "$install_daemon" == true ]]; then + local daemon_service="mcsm-daemon.service" + local daemon_path="${install_dir}/daemon" + local daemon_config_path="${daemon_path}/${daemon_key_config_subpath}" + + cprint cyan bold "启动守护进程服务..." + if systemctl restart "$daemon_service"; then + cprint green "守护进程服务已启动." + + sleep 3 # Allow service to init and write configs + + if [[ -f "$daemon_config_path" ]]; then + daemon_key=$(grep -oP '"key"\s*:\s*"\K[^"]+' "$daemon_config_path") + daemon_port=$(grep -oP '"port"\s*:\s*\K[0-9]+' "$daemon_config_path") + + if [[ -n "$daemon_key" ]]; then + cprint green "提取的守护进程密钥: $daemon_key" + else + cprint red "提取守护进程密钥失败: $daemon_config_path" + fi + + if [[ -n "$daemon_port" ]]; then + cprint green "提取的守护进程端口: $daemon_port" + else + cprint red "提取守护进程端口失败: $daemon_config_path" + fi + else + cprint red "没有找到守护进程配置文件: $daemon_config_path" + fi + else + cprint red bold "启动守护进程服务失败: $daemon_service" + fi + fi + + # WEB SECTION + if [[ "$install_web" == true ]]; then + local web_service="mcsm-web.service" + local web_path="${install_dir}/web" + local web_config_path="${web_path}/${web_port_config_subpath}" + + cprint cyan bold "正在启动面板服务..." + if systemctl restart "$web_service"; then + cprint green "面板服务已启动." + + sleep 3 # Allow time to populate config + + if [[ -f "$web_config_path" ]]; then + web_port=$(grep -oP '"httpPort"\s*:\s*\K[0-9]+' "$web_config_path") + if [[ -n "$web_port" ]]; then + cprint green "提取的面板端口: $web_port" + else + cprint red "提取面板端口失败: $web_config_path" + fi + else + cprint red "面板配置文件未找到: $web_config_path" + fi + else + cprint red bold "启动面板服务失败: $web_service" + fi + fi +} + +cleanup_install_tmp() { + if [[ -n "$install_tmp_dir" && -d "$install_tmp_dir" ]]; then + if rm -rf "$install_tmp_dir"; then + cprint green "已清理临时安装文件夹: $install_tmp_dir" + else + cprint red "删除临时文件夹失败: $install_tmp_dir" + fi + fi +} + +print_install_result() { + # 清空屏幕 + clear || true + + # 打印 ASCII 横幅 + cprint white noprefix "______ _______________________ ___" + cprint white noprefix "___ |/ /_ ____/_ ___/__ |/ /_____ _____________ _______ _____________" + cprint white noprefix "__ /|_/ /_ / _____ \__ /|_/ /_ __ \`/_ __ \ __ \`/_ __ \`/ _ \_ ___/" + cprint white noprefix "_ / / / / /___ ____/ /_ / / / / /_/ /_ / / / /_/ /_ /_/ // __/ /" + cprint white noprefix "/_/ /_/ \____/ /____/ /_/ /_/ \__,_/ /_/ /_/\__,_/ _\__, / \___//_/" + echo "" + # status summary + cprint yellow noprefix "安装/更新组件:" + if [[ "$install_daemon" == true && -n "$daemon_key" && -n "$daemon_port" ]]; then + cprint white noprefix "Daemon" + elif [[ "$install_daemon" == true ]]; then + cprint white noprefix nonl "Daemon " + cprint yellow noprefix "(部分,未完全检测到配置)" + fi + + if [[ "$install_web" == true && -n "$web_port" ]]; then + cprint white noprefix "Web" + elif [[ "$install_web" == true ]]; then + cprint white noprefix nonl "Web " + cprint yellow noprefix "(部分,未完全检测到配置)" + fi + + echo "" + + # Local IP detection + local ip_address + ip_address=$(hostname -I 2>/dev/null | awk '{print $1}') + [[ -z "$ip_address" ]] && ip_address="你的IP" + + # Daemon info + if [[ "$install_daemon" == true ]]; then + local daemon_address="ws://$ip_address:${daemon_port:-Failed to Retrieve from Config file}" + local daemon_key_display="${daemon_key:-Failed to Retrieve from Config file}" + + cprint yellow noprefix "守护进程地址:" + cprint white noprefix " $daemon_address" + cprint yellow noprefix "守护进程秘钥:" + cprint white noprefix " $daemon_key_display" + echo "" + fi + + # Web info + if [[ "$install_web" == true ]]; then + local web_address="http://$ip_address:${web_port:-Failed to Retrieve from Config file}" + cprint yellow noprefix "HTTP面板地址:" + cprint white noprefix nonl " $web_address " + cprint yellow noprefix "(在你的浏览器中打开)" + echo "" + fi + + # Port guidance + cprint yellow noprefix "注意:" + cprint white noprefix " 确保防火墙放行上述端口." + cprint white noprefix " 如果从外部网络访问,您可能需要在路由器上配置端口转发." + echo "" + + # Service management help + cprint yellow noprefix "MCSManager管理命令:" + if [[ "$install_daemon" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-daemon.service" + fi + if [[ "$install_web" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-web.service" + fi + echo "" + + # Official doc + cprint yellow noprefix "官方文档:" + cprint white noprefix " https://docs.mcsmanager.com/zh_cn/" + echo "" + + # HTTPS support + cprint yellow noprefix "需要HTTPS?" + cprint white noprefix " 为了开启HTTPS安全访问,需要配置反向代理:" + cprint white noprefix " https://docs.mcsmanager.com/zh_cn/ops/proxy_https.html" + echo "" + + if [[ "$force_permission" == true ]]; then + cprint red noprefix "[重点] 您选择在安装期间重写权限." + cprint red noprefix " 你可能需要运行: chown -R $install_user 手动更新权限." + fi + + # Closing message + cprint green noprefix "安装完成。享受使用MCSManager管理服务器的乐趣!" + echo "" +} + +install_mcsm() { + local components=() + + if [[ "$install_web" == true ]]; then + install_component "web" + create_systemd_service "web" + components+=("web") + fi + + if [[ "$install_daemon" == true ]]; then + install_component "daemon" + create_systemd_service "daemon" + components+=("daemon") + fi + + # Reload systemd after any service file changes + if (( ${#components[@]} > 0 )); then + cprint cyan "重新加载systemd守护进程..." + # systemctl daemon-reexec + systemctl daemon-reload + + for comp in "${components[@]}"; do + local svc="mcsm-${comp}.service" + + cprint cyan "启用服务: $svc" + if systemctl enable "$svc" &>/dev/null; then + cprint green "已启用服务: $svc" + else + cprint red bold "启用服务失败: $svc" + cleanup_install_tmp + exit 1 + fi + done + fi + + # Clean tmp dir + cleanup_install_tmp + # Extract installed component info + safe_run extract_component_info "未能从已安装的服务中提取运行时信息" + safe_run print_install_result "未能打印安装结果" + +} + +main() { + trap 'echo "发生意外错误."; exit 99' ERR + safe_run detect_terminal_capabilities "检测终端功能失败" + safe_run check_root "脚本必须以root身份运行" + safe_run parse_args "解析参数失败" "$@" + safe_run detect_os_info "OS检测失败" + safe_run version_specific_rules "Failed to apply distro/version specific rules" + + # To be moved to a master pre check function. + safe_run resolve_node_arch "解析Node.js架构失败" + + safe_run check_required_commands "缺少必要的系统命令" + + safe_run check_node_installed "在预期目录上检测到Node.js或npm失败。Node.js将被安装." + if [ "$install_node" = true ]; then + safe_run install_node "Node.js安装失败" + fi + + safe_run permission_barrier "权限验证失败-中止安装" + + safe_run prepare_user "准备用户权限失败。处理步骤." + + safe_run download_mcsm "获取MCSManager源失败。处理步骤" + safe_run mcsm_install_prepare "准备安装时出错" + + safe_run install_mcsm "未能安装 MCSManager" +} +main "$@" diff --git a/setup_cn_test.sh b/setup_cn_test.sh new file mode 100644 index 0000000..ffbf7f0 --- /dev/null +++ b/setup_cn_test.sh @@ -0,0 +1,1374 @@ +#!/bin/bash +# MCSManager官方安装脚本. +# 这个脚本将会把MCSManager服务端和节点服务端更新/安装至最新发布版本. +# ------------------------------------------------------------------------------ +# 受支持的Linux: +# 此脚本支持以下Linux发行版: +# - Ubuntu: 18.04, 20.04, 22.04, 24.04 +# - Debian: 10, 11, 12, 13 +# - CentOS: 7, 8 Stream, 9 Stream, 10 Stream +# - RHEL: 7, 8, 9, 10 +# - Arch Linux: Support planned (TBD) +# ------------------------------------------------------------------------------ + +# Target installation directory (can be overridden with --install-dir) +install_dir="/opt/mcsmanager" + +# Primary download URL bas. Full package URL = download_base_url + package_name +download_base_url="https://cdn.imlazy.ink:233/files/" + +# Fallback download URL (can also be a local directory or mirror) +download_fallback_url="https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz" + +# Name of the release package to download/detect +package_name="mcsmanager_linux_release.tar.gz" + +# Node.js version to be installed +# Keep the leading "v" +node_version="v20.12.2" + +# Node download base URL - primary +node_download_url_base="https://nodejs.org/dist/" + +# Unoffical build of Node.js, for more ISA support +node_unoffical_build_url="https://unofficial-builds.nodejs.org/download/release/" + +# Node download URL - fallback. +# This is the URL points directly to the file, not the base. This can also be a local absolute path. +# Only supports https:// or http:// for web locations. +node_download_fallback="" + +# Node.js installation path (defaults to the MCSManager installation path. Can be overridden with --node-install-dir) +node_install_dir="$install_dir" + +# Temp dir for file extraction +tmp_dir="/tmp" + +# Bypass installed user permission check, override by --force-permission +force_permission=false + + +# --------------- Global Variables ---------------# +# DO NOT MODIFY # + + +# Component installation options. +# For fresh installs, both daemon and web components are installed by default. +# For updates, behavior depends on detected existing components. +# Can be overridden with --install daemon/web/all +install_daemon=true +install_web=true + +# Install MCSM as (default: root). +# To install as a general user (e.g., "mcsm"), use the --user option: --user mcsm +# To ensure compatibility, only user mcsm is supported. +install_user="root" +# Installed user, for permission check +web_installed=false +daemon_installed=false +web_installed_user="" +daemon_installed_user="" + +# Service file locations +# the final dir = systemd_file + {web/daemon} + ".service" +systemd_file="/etc/systemd/system/mcsm-" +# Optional: Override the default installation source file. +# If --install-source is specified, the installer will use the provided +# "mcsmanager_linux_release.tar.gz" file instead of downloading it. +# Only support local absolute path. +install_source_path="" + +# temp path for extracted file(s) +install_tmp_dir="/opt/mcsmanager/mcsm_abcd" + +# dir name for data dir backup +# e.g. /opt/mcsmanager/daemon/data -> /opt/mcsmanager/data_bak_data +# only valid for when during an update +backup_prefix="data_bak_" + +# System architecture (detected automatically) +arch="" +version="" +distro="" + + + +# Supported OS versions (map-style structure) +# Format: supported_os["distro_name"]="version1 version2 version3 ..." +declare -A supported_os +supported_os["Ubuntu"]="18 20 22 24" +supported_os["Debian"]="10 11 12 13" +supported_os["CentOS"]="7 8 8-stream 9-stream 10-stream" +supported_os["RHEL"]="7 8 9 10" +supported_os["Arch"]="rolling" + +# Required system commands for installation +# These will be checked before logic process +required_commands=( + chmod + chown + wget + tar + stat + useradd + usermod + date +) + +# Node.js related sections +# Enable strict version checking (exact match) +# enabled -> strict requriement for defined node version +# false -> newer version allowed +# Older version is NEVER allowed +strict_node_version_check=true + +# Will be set based on actual node status +install_node=true +# Remove leading "v" from defined version +required_node_ver="${node_version#v}" + +# Holds absolute path for node & npm +node_bin_path="" +npm_bin_path="" +# Hold Node.js arch name, e.g. x86_64 -> x64 +node_arch="" +# Hold Node.js intallation path, e.g. ${node_install_dir}/node-${node_version}-linux-${arch} +node_path="" + +# For installation result +daemon_key="" +daemon_port="" +web_port="" +daemon_key_config_subpath="data/Config/global.json" +web_port_config_subpath="data/SystemConfig/config.json" + +# Terminal color & style related +# Default to false, auto check later +SUPPORTS_COLOR=false +SUPPORTS_STYLE=false +# Declare ANSI reset +RESET="\033[0m" + +# Foreground colors +declare -A FG_COLORS=( + [black]="\033[0;30m" + [red]="\033[0;31m" + [green]="\033[0;32m" + [yellow]="\033[0;33m" + [blue]="\033[0;34m" + [magenta]="\033[0;35m" + [cyan]="\033[0;36m" + [white]="\033[0;37m" +) + +# Font styles +declare -A STYLES=( + [bold]="\033[1m" + [underline]="\033[4m" + [italic]="\033[3m" # Often ignored + [clear_line]="\r\033[2K" + [strikethrough]="\033[9m" +) + + +### Helper Functions +# Execution wrapper, avoid unexpected crashes. +safe_run() { + local func="$1" + local err_msg="$2" + shift 2 + + if ! "$func" "$@"; then + echo "Error: $err_msg" + exit 1 + fi +} + +# Function to ensure the script is run as root +check_root() { + # Using Bash's built-in EUID variable + if [ -n "$EUID" ]; then + if [ "$EUID" -ne 0 ]; then + cprint red "错误: 这个脚本只能运行在root或sudo模式下,请尝试切换用户或者使用sudo." + exit 1 + fi + else + # Fallback to using id -u if EUID is unavailable (e.g., non-Bash shell or misconfigured environment) + if [ "$(id -u)" -ne 0 ]; then + cprint red "错误: 这个脚本只能运行在root或sudo模式下,请尝试切换用户或者使用sudo." + exit 1 + fi + fi +} + +# Function to check whether current terminal support color & style +detect_terminal_capabilities() { + SUPPORTS_COLOR=false + SUPPORTS_STYLE=false + + if [ -t 1 ] && command -v tput >/dev/null 2>&1; then + if [ "$(tput colors)" -ge 8 ]; then + SUPPORTS_COLOR=true + fi + if tput bold >/dev/null 2>&1 && tput smul >/dev/null 2>&1; then + SUPPORTS_STYLE=true + fi + fi + + if [ "$SUPPORTS_COLOR" = true ]; then + cprint green "[OK] 这个终端支持彩色输出." + else + cprint yellow "注:终端不支持彩色输出。不格式化继续." + fi + + if [ "$SUPPORTS_STYLE" = true ]; then + cprint green "[OK] 终端支持粗体和下划线格式." + else + cprint yellow "注意:终端不支持高级文本样式." + fi +} + +# Check whether daemon or web is installed +is_component_installed() { + local component_name="$1" + local component_path="${install_dir}/${component_name}" + + if [[ -d "$component_path" ]]; then + cprint green "组件 '$component_name' 已经被安装在 $component_path" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=true + elif [[ "$component_name" == "web" ]]; then + web_installed=true + fi + + return 0 + else + cprint yellow "组件 '$component_name' 未被安装" + + # Set corresponding global variable + if [[ "$component_name" == "daemon" ]]; then + daemon_installed=false + elif [[ "$component_name" == "web" ]]; then + web_installed=false + fi + + return 1 + fi +} + +check_component_permission() { + local component="$1" + local service_file="${systemd_file}${component}.service" + + if [[ ! -f "$service_file" ]]; then + cprint yellow "找不到服务文件: $service_file" + return 0 # nothing changed + fi + + # Extract the User= line if it exists + local user_line + user_line=$(grep -E '^User=' "$service_file" 2>/dev/null | head -1) + + local user + if [[ -z "$user_line" ]]; then + user="root" # default if no User= is defined + else + user="${user_line#User=}" + fi + + # Validate user + if [[ "$user" != "root" && "$user" != "mcsm" ]]; then + cprint red bold "不支持的用户 '$user' 在 $service_file. 使用 'root' 或 'mcsm'." + exit 1 + fi + + # Assign to appropriate global + if [[ "$component" == "web" ]]; then + web_installed_user="$user" + elif [[ "$component" == "daemon" ]]; then + daemon_installed_user="$user" + fi + + cprint cyan "已删除 $component 以用户身份安装: $user" + return 0 +} + + + +parse_args() { + local explicit_install_flag=false + + while [[ $# -gt 0 ]]; do + case "$1" in + --install-dir) + if [[ -n "$2" ]]; then + install_dir="$2" + shift 2 + else + echo "错误:--install-dir需要一个路径参数." + exit 1 + fi + ;; + --node-install-dir) + if [[ -n "$2" ]]; then + node_install_dir="$2" + shift 2 + else + echo "错误:--node-install-dir需要一个路径参数." + exit 1 + fi + ;; + --install) + explicit_install_flag=true + if [[ -n "$2" && "$2" != --* ]]; then + case "$2" in + daemon) + install_daemon=true + is_component_installed "daemon" + install_web=false + check_component_permission "daemon" + ;; + web) + install_daemon=false + is_component_installed "web" + install_web=true + check_component_permission "web" + ;; + all) + install_daemon=true + install_web=true + is_component_installed "daemon" + is_component_installed "web" + check_component_permission "daemon" + check_component_permission "web" + ;; + *) + echo "错误:--install的值无效。期望‘daemon’, ‘web’或‘all’." + echo "Usage: --install daemon|web|all" + exit 1 + ;; + esac + shift 2 + else + echo "错误:提供了--install标志,但没有值。请指定:daemon、web或all." + echo "使用方法: --install daemon|web|all" + exit 1 + fi + ;; + --user) + if [[ -n "$2" ]]; then + case "$2" in + root) + install_user="root" + ;; + mcsm) + install_user="mcsm" + ;; + *) + echo "错误:无效用户 '$2'. 只有 'root' 和 'mcsm' 受支持." + echo "使用方法: --user root|mcsm" + exit 1 + ;; + esac + shift 2 + else + echo "错误:--user需要一个值 (root 或 mcsm)." + exit 1 + fi + ;; + --install-source) + if [[ -n "$2" ]]; then + install_source_path="$2" + shift 2 + else + echo "错误:--install-source需要文件路径." + exit 1 + fi + ;; + --force-permission) + force_permission=true + shift + ;; + *) + echo "错误:未知参数t: $1" + exit 1 + ;; + esac + done + + # Auto-detect branch: only run if --install was not explicitly passed + if [[ "$explicit_install_flag" == false ]]; then + daemon_installed=false + web_installed=false + + if is_component_installed "daemon"; then + daemon_installed=true + check_component_permission "daemon" + fi + if is_component_installed "web"; then + web_installed=true + check_component_permission "web" + fi + + # When only one component installed, we wanted to process that one only. + if [[ "$daemon_installed" == true && "$web_installed" == false ]]; then + install_daemon=true + install_web=false + elif [[ "$daemon_installed" == false && "$web_installed" == true ]]; then + install_daemon=false + install_web=true + else + install_daemon=true + install_web=true + fi + fi +} + + +# Get Distribution & Architecture Info +detect_os_info() { + distro="Unknown" + version="Unknown" + arch=$(uname -m) + + # Try primary source + if [ -f /etc/os-release ]; then + . /etc/os-release + distro_id="${ID,,}" + version_id="${VERSION_ID,,}" + + case "$distro_id" in + ubuntu) + distro="Ubuntu" + version="$version_id" + ;; + debian) + distro="Debian" + version="$version_id" + ;; + centos) + distro="CentOS" + version="$version_id" + ;; + rhel*) + distro="RHEL" + version="$version_id" + ;; + arch) + distro="Arch" + version="rolling" + ;; + *) + distro="${ID:-Unknown}" + version="$version_id" + ;; + esac + fi + + # Fallbacks for missing or invalid version + if [[ -z "$version" || "$version" == "unknown" || "$version" == "" ]]; then + if [ -f /etc/issue ]; then + version_guess=$(grep -oP '[0-9]+(\.[0-9]+)*' /etc/issue | head -1) + if [[ -n "$version_guess" ]]; then + version="$version_guess" + fi + fi + fi + + # Normalize version: keep only major version + version_full="$version" + cprint cyan "检测到操作系统: $distro $version_full" + cprint cyan "检测到架构: $arch" +} + +# Check if all required commands are available +check_required_commands() { + local missing=0 + + for cmd in "${required_commands[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + echo "错误:必需的命令 '$cmd' 在PATH中不可用." + missing=1 + fi + done + + if [ "$missing" -ne 0 ]; then + echo "缺少一个或多个必需的命令。请安装后再试." + return 1 + fi + + cprint green "所有必需的命令都可用." + return 0 +} + +# Print with specified color and style, fallback to RESET if not supported. +# Supported colors*: black|red|green|yellow|blue|magenta|cyan|white +# Supported styles*: bold|underline|italic|clear_line|strikethrough +# *Note: some style may not necessarily work on all terminals. +# Example usage: +# cprint green bold "Installation completed successfully." +# cprint red underline "Failed to detect required command: wget" +# cprint yellow "Warning: Disk space is low." +# cprint underline "Failed to detect required command: wget" +# cprint bold green underline"Installation completed successfully." + +cprint() { + local color="" + local text="" + local styles="" + local disable_prefix=false + local disable_newline=false + + while [[ $# -gt 1 ]]; do + case "$1" in + black|red|green|yellow|blue|magenta|cyan|white) + color="$1" + ;; + bold|underline|italic|clear_line|strikethrough) + styles+="${STYLES[$1]}" + ;; + noprefix) + disable_prefix=true + ;; + nonl) + disable_newline=true + ;; + esac + shift + done + + text="$1" + + local prefix_text="" + if [[ "$disable_prefix" != true ]]; then + local timestamp="[$(date +%H:%M:%S)]" + local label="[MCSM Installer]" + prefix_text="${FG_COLORS[white]}$timestamp $label${RESET} " + fi + + local prefix="" + if [[ -n "$color" && "$SUPPORTS_COLOR" = true ]]; then + prefix+="${FG_COLORS[$color]}" + fi + if [[ "$SUPPORTS_STYLE" = true || "$styles" == *"${STYLES[clear_line]}"* ]]; then + prefix="$styles$prefix" + fi + + if [[ "$disable_newline" == true ]]; then + printf "%b%b%s%b" "$prefix_text" "$prefix" "$text" "$RESET" + else + printf "%b%b%s%b\n" "$prefix_text" "$prefix" "$text" "$RESET" + fi +} + + + + +# Permission check before proceed with installation +permission_barrier() { + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "当前没有安装组件-跳过权限检查." + return 0 + fi + + for component in web daemon; do + local is_installed_var="${component}_installed" + local installed_user_var="${component}_installed_user" + + if [[ "${!is_installed_var}" == true ]]; then + local installed_user="${!installed_user_var}" + + # Step 0: Ensure installed user is detected + if [[ -z "$installed_user" ]]; then + cprint red bold "检测到 '$component' 已安装,但无法从其systemd服务文件确定用户." + cprint red "这可能表示自定义或不支持的服务文件设置." + cprint red "拒绝执行以避免潜在的冲突." + exit 1 + fi + + # Step 1: User match check with optional force override + if [[ "$installed_user" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "权限不匹配 '$component':" + cprint yellow "以用户身份安装: $installed_user" + cprint yellow "目标安装用户: $install_user" + cprint yellow "用户不匹配,但设置了--force-permission。继续和更新权限…" + sleep 3 + else + cprint red bold "权限不匹配 '$component':" + cprint red "以用户身份安装: $installed_user" + cprint red "目标安装用户: $install_user" + cprint red "用户不匹配,但设置了--force-permission。继续和更新权限..." + exit 1 + fi + else + cprint green bold "权限检查已通过: '$installed_user' 匹配目标用户." + fi + + fi + done + + # Step 2: Directory ownership check + local dir_owner + dir_owner=$(stat -c '%U' "$install_dir" 2>/dev/null) + + if [[ -z "$dir_owner" ]]; then + cprint red bold "无法确定安装目录的所有者: $install_dir" + exit 1 + fi + + if [[ "$dir_owner" != "$install_user" ]]; then + if [[ "$force_permission" == true ]]; then + cprint yellow bold "安装目录所有权不匹配:" + cprint yellow " 目录: $install_dir" + cprint yellow " 归: $dir_owner" + cprint yellow " 预期: $install_user" + cprint yellow " --force-permission设置。尽管不匹配,但继续." + sleep 3 + else + cprint red bold "安装目录所有权不匹配:" + cprint red " 目录: $install_dir" + cprint red " 归: $dir_owner" + cprint red " 预期: $install_user" + exit 1 + fi + else + cprint green bold "安装目录所有权检查通过: '$install_dir' is owned by '$install_user'." + fi + + cprint green bold "验证了权限和所有权。继续." + return 0 +} + + + +# Map OS arch with actual Node.js Arch name +# This function should be placed after var arch has been assigned a valid value. +resolve_node_arch() { + case "$arch" in + x86_64) + node_arch="x64" + ;; + aarch64) + node_arch="arm64" + ;; + armv7l) + node_arch="armv7l" + ;; + loongarch64) + node_arch="loong64" + # Use unoffical build + node_download_url_base=$node_unoffical_build_url + ;; + *) + cprint red bold "Node.js不支持的架构: $arch" + return 1 + ;; + esac + + # Assign node_path based on resolved arch and current version/install dir + node_path="${node_install_dir}/node-${node_version}-linux-${node_arch}" + + cprint cyan "解析了Node.js架构: $node_arch" + cprint cyan "Node.js安装路径: $node_path" +} + +# Check if Node.js at PATH is valid. +# This function check Node.js version + NPM (if Node.js valid) +verify_node_at_path() { + local node_path="$1" + node_bin_path="$node_path/bin/node" + npm_bin_path="$node_path/bin/npm" + + # Node binary missing + if [ ! -x "$node_bin_path" ]; then + return 1 + fi + + local installed_ver + installed_ver="$("$node_bin_path" -v 2>/dev/null | sed 's/^v//')" + + if [[ -z "$installed_ver" ]]; then + return 1 + fi + + if [ "$strict_node_version_check" = true ]; then + if [[ "$installed_ver" != "$required_node_ver" ]]; then + return 3 + fi + else + local cmp + cmp=$(printf "%s\n%s\n" "$required_node_ver" "$installed_ver" | sort -V | head -1) + if [[ "$cmp" != "$required_node_ver" ]]; then + return 2 + fi + fi + + # Check if npm exists and works using node (not $PATH/npm) + if [ ! -x "$npm_bin_path" ]; then + return 4 + fi + + # Use node to run npm.js directly, in case env is broken + local npm_version + npm_version="$("$node_bin_path" "$npm_bin_path" --version 2>/dev/null)" + if [[ -z "$npm_version" ]]; then + return 4 + fi + + return 0 +} + + +# Node.js pre-check. check if we need to install Node.js before installer run. +# Use postcheck_node_after_install() to check after install. +check_node_installed() { + verify_node_at_path "$node_path" + local result=$? + + case $result in + 0) + cprint green bold "Node.js和npm在 $node_path (版本 $required_node_ver 或兼容)" + install_node=false + ;; + 1) + cprint yellow bold "Node.js二进制文件未找到或无法使用 $node_path" + install_node=true + ;; + 2) + cprint red bold "Node.js版本 $node_path 太老. 要求: >= $required_node_ver" + install_node=true + ;; + 3) + cprint red bold "Node.js版本不匹配。要求: $required_node_ver, 发现了其他的Node.js版本." + install_node=true + ;; + 4) + cprint red bold "Node.js存在,但npm缺失或损坏." + install_node=true + ;; + *) + cprint red bold "Node验证中出现意外错误." + install_node=true + ;; + esac +} + +# Node.js post-check. check if Node.js is valid after install. +postcheck_node_after_install() { + verify_node_at_path "$node_path" + if [[ $? -ne 0 ]]; then + cprint red bold "Node.js安装失败或无效 $node_path" + return 1 + else + cprint green bold "Node.js的安装和运行在 $node_path" + return 0 + fi +} + +# Install Node.js and check +install_node() { + local archive_name="node-${node_version}-linux-${node_arch}.tar.xz" + local target_dir="${node_install_dir}/node-${node_version}-linux-${node_arch}" + local archive_path="${node_install_dir}/${archive_name}" + local download_url="${node_download_url_base}${node_version}/${archive_name}" + local fallback="$node_download_fallback" + + cprint cyan bold "安装Node.js $node_version 架构: $node_arch" + + mkdir -p "$node_install_dir" || { + cprint red bold "创建Node安装目录失败: $node_install_dir" + return 1 + } + + # Download + cprint cyan "下载Node.js: $download_url" + if ! wget --progress=bar:force -O "$archive_path" "$download_url"; then + cprint yellow "主下载失败。尝试备用下载……" + + if [[ -n "$fallback" ]]; then + if [[ "$fallback" =~ ^https?:// ]]; then + cprint cyan "从备用URL下载: $fallback" + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "备用下载失败: $fallback" + return 1 + fi + elif [ -f "$fallback" ]; then + cprint cyan "从本地备份进行复制: $fallback" + cp "$fallback" "$archive_path" || { + cprint red bold "复制备用Node.js存档失败 $fallback" + return 1 + } + else + cprint red bold "无效的备用路径: $fallback" + return 1 + fi + else + cprint red bold "没有配置备用源。不能继续进行." + return 1 + fi + fi + + # Extract archive + cprint cyan "提取Node.js存档..." + if ! tar -xf "$archive_path" -C "$node_install_dir"; then + cprint red bold "提取Node.js文件失败." + return 1 + fi + + chmod -R a+rx "$target_dir" || { + cprint red bold "在Node.js文件上设置执行权限失败." + return 1 + } + + verify_node_at_path "$target_dir" + local result=$? + if [[ $result -ne 0 ]]; then + cprint red bold "Node.js安装验证失败." + return 1 + fi + + cprint cyan "清理文件……" + rm -f "$archive_path" + + cprint green bold "Node.js $node_version 安装成功 $target_dir" + # Save resolved binary paths to global variables + node_bin_path="${target_dir}/bin/node" + npm_bin_path="${target_dir}/bin/npm" + + cprint green "Node.js 二进制文件: $node_bin_path" + cprint green "npm 二进制文件: $npm_bin_path" + return 0 +} + +# Function to download MCSM package. fetch from primary URL first, then fallback URL. +# This function only put extracted file(s) into install_dir, it does not perform the actual update. +download_mcsm() { + local archive_name="$package_name" + local archive_path="${tmp_dir}/${archive_name}" + local primary_url="${download_base_url}${archive_name}" + local fallback="$download_fallback_url" + + cprint cyan bold "下载MCSManager安装包…" + + # Step 1: Try downloading from primary URL + if ! wget --progress=bar:force -O "$archive_path" "$primary_url"; then + cprint yellow "主下载失败。尝试备用资源…" + + if [[ -z "$fallback" ]]; then + cprint red bold "没有指定备用URL或路径." + return 1 + fi + + if [[ "$fallback" =~ ^https?:// ]]; then + if ! wget --progress=bar:force -O "$archive_path" "$fallback"; then + cprint red bold "备用下载失败 $fallback" + return 1 + fi + elif [[ -f "$fallback" ]]; then + cp "$fallback" "$archive_path" || { + cprint red bold "未能复制备用文件 $fallback" + return 1 + } + else + cprint red bold "备用路径无效: $fallback" + return 1 + fi + fi + + # Step 2: Generate extract directory + local suffix + suffix=$(tr -dc 'a-z0-9' /dev/null; then + cprint green "用户 '$install_user' 已经存在." + else + cprint cyan "创建系统用户: $install_user (无登录,无密码)..." + if ! useradd --system --home "$install_dir" --shell /usr/sbin/nologin "$install_user"; then + cprint red bold "创建用户失败: $install_user" + exit 1 + fi + cprint green "用户 '$install_user' 已创建." + fi + + + # Docker integration + if command -v docker &>/dev/null; then + cprint cyan "Docker已被安装 -检查组分配…" + + if getent group docker &>/dev/null; then + if id -nG "$install_user" | grep -qw docker; then + cprint green "用户 '$install_user' 已经在“docker”组中." + else + cprint cyan "添加用户 '$install_user' 到 'docker' 组..." + if usermod -aG docker "$install_user"; then + cprint green "授予的Docker组访问权限 '$install_user'." + else + cprint red "未能添加 '$install_user' 给“Docker”组。这个用户可能无法使用Docker." + fi + fi + else + cprint red "安装了Docker,但没有找到Docker组。跳过组分配." + fi + else + cprint yellow "未安装Docker -跳过Docker组配置." + fi + + return 0 +} +# Function to stop MCSM services if they exist +stop_mcsm_services() { + cprint yellow bold "试图停止mcsm-web和mcsm-daemon服务..." + + # Attempt to stop mcsm-web + cprint blue "正在停止 mcsm-web..." + if systemctl stop mcsm-web; then + cprint green "mcsm-web 已停止." + else + cprint red bold "警告:未能停止mcsm-web(可能不存在或已停止)." + fi + + # Attempt to stop mcsm-daemon + cprint blue "正在停止 mcsm-daemon..." + if systemctl stop mcsm-daemon; then + cprint green "mcsm-daemon 已停止." + else + cprint red bold "警告:未能停止mcsm-daemon(可能不存在或已停止)." + fi +} +# Prepare file & permissions before install. +mcsm_install_prepare() { + + # Stop service if existed + stop_mcsm_services + + if [[ ! -d "$install_tmp_dir" ]]; then + cprint red bold "临时安装目录不存在: $install_tmp_dir" + exit 1 + fi + + cprint cyan "改变所有权 $install_tmp_dir 到用户 '$install_user'..." + chown -R "$install_user":"$install_user" "$install_tmp_dir" || { + cprint red bold "所有权变更失败 $install_tmp_dir" + cleanup_install_tmp + exit 1 + } + + # Normalize install_dir to ensure it ends with a slash + [[ "${install_dir}" != */ ]] && install_dir="${install_dir}/" + + if [[ "$web_installed" == false && "$daemon_installed" == false ]]; then + cprint cyan "没有检测到现有组件-跳过数据备份/清理." + return 0 + fi + + cprint green bold "已成功准备现有组件." + return 0 +} + +# Install or update a component +install_component() { + local component="$1" + local target_path="${install_dir}${component}" + local backup_data_path="${install_dir}${backup_prefix}${component}" + local source_path="${install_tmp_dir}/mcsmanager/${component}" + + cprint cyan bold "安装/更新组件: $component" + + # Step 1: Move new component to install_dir + if [[ ! -d "$source_path" ]]; then + cprint red bold "找不到源目录: $source_path" + cleanup_install_tmp + exit 1 + fi + +# [20:49:07] [MCSM Installer] 安装/更新组件: web +# [20:49:07] [MCSM Installer] 更新的文件 /opt/mcsmanager/mcsm_9gha/mcsmanager/web → /opt/mcsmanager/web +# [20:49:07] [MCSM Installer] 已移动 web 到 /opt/mcsmanager/web + cprint cyan "删除依赖库文件 $target_path/node_modules/" + if [[ -d "$target_path/node_modules/" ]]; then + rm -rf "$target_path/node_modules/" + fi + + if cp -a "$source_path"/. "$target_path"; then + cprint green "更新的文件 $source_path → $target_path" + rm -rf "$source_path" + else + cprint red bold "更新文件失败 $source_path → $target_path" + cleanup_install_tmp + exit 1 + fi + cprint green "已移动 $component 到 $target_path" + + + # Step 3: Install NPM dependencies + if [[ ! -x "$npm_bin_path" ]]; then + cprint red bold "找不到npm二进制文件或无法执行: $npm_bin_path" + cleanup_install_tmp + exit 1 + fi + + cprint cyan "正在使用npm安装依赖库 $component ..." + pushd "$target_path" >/dev/null || { + cprint red bold "更改目录失败 $target_path" + cleanup_install_tmp + exit 1 + } + + + if ! "$node_bin_path" "$npm_bin_path" install --registry=https://registry.npmmirror.com --no-audit --no-fund --loglevel=warn; then + cprint red bold "NPM依赖项安装失败 $component" + popd >/dev/null + cleanup_install_tmp + exit 1 + fi + + popd >/dev/null + cprint green bold "组件 '$component' 安装/更新成功." +} + +# Create systemd service for a given component. +# This will overwrite the existing service file. +create_systemd_service() { + local component="$1" + local service_path="${systemd_file}${component}.service" + local working_dir="${install_dir}${component}" + local exec="${node_bin_path} app.js" + + if [[ ! -d "$working_dir" ]]; then + cprint red bold "找不到组件目录: $working_dir" + cleanup_install_tmp + return 1 + fi + + cprint cyan "创建systemd服务 '$component'..." + + cat > "$service_path" </dev/null | awk '{print $1}') + [[ -z "$ip_address" ]] && ip_address="你的IP" + + # Daemon info + if [[ "$install_daemon" == true ]]; then + local daemon_address="ws://$ip_address:${daemon_port:-Failed to Retrieve from Config file}" + local daemon_key_display="${daemon_key:-Failed to Retrieve from Config file}" + + cprint yellow noprefix "守护进程地址:" + cprint white noprefix " $daemon_address" + cprint yellow noprefix "守护进程秘钥:" + cprint white noprefix " $daemon_key_display" + echo "" + fi + + # Web info + if [[ "$install_web" == true ]]; then + local web_address="http://$ip_address:${web_port:-Failed to Retrieve from Config file}" + cprint yellow noprefix "HTTP面板地址:" + cprint white noprefix nonl " $web_address " + cprint yellow noprefix "(在你的浏览器中打开)" + echo "" + fi + + # Port guidance + cprint yellow noprefix "注意:" + cprint white noprefix " 确保防火墙放行上述端口." + cprint white noprefix " 如果从外部网络访问,您可能需要在路由器上配置端口转发." + echo "" + + # Service management help + cprint yellow noprefix "MCSManager管理命令:" + if [[ "$install_daemon" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-daemon.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-daemon.service" + fi + if [[ "$install_web" == true ]]; then + cprint white noprefix nonl " systemctl start " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl stop " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl restart " + cprint yellow noprefix "mcsm-web.service" + cprint white noprefix nonl " systemctl status " + cprint yellow noprefix "mcsm-web.service" + fi + echo "" + + # Official doc + cprint yellow noprefix "官方文档:" + cprint white noprefix " https://docs.mcsmanager.com/zh_cn/" + echo "" + + # HTTPS support + cprint yellow noprefix "需要HTTPS?" + cprint white noprefix " 为了开启HTTPS安全访问,需要配置反向代理:" + cprint white noprefix " https://docs.mcsmanager.com/zh_cn/ops/proxy_https.html" + echo "" + + if [[ "$force_permission" == true ]]; then + cprint red noprefix "[重点] 您选择在安装期间重写权限." + cprint red noprefix " 你可能需要运行: chown -R $install_user 手动更新权限." + fi + + # Closing message + cprint green noprefix "安装完成。享受使用MCSManager管理服务器的乐趣!" + echo "" +} + +install_mcsm() { + local components=() + + if [[ "$install_web" == true ]]; then + install_component "web" + create_systemd_service "web" + components+=("web") + fi + + if [[ "$install_daemon" == true ]]; then + install_component "daemon" + create_systemd_service "daemon" + components+=("daemon") + fi + + # Reload systemd after any service file changes + if (( ${#components[@]} > 0 )); then + cprint cyan "重新加载systemd守护进程..." + # systemctl daemon-reexec + systemctl daemon-reload + + for comp in "${components[@]}"; do + local svc="mcsm-${comp}.service" + + cprint cyan "启用服务: $svc" + if systemctl enable "$svc" &>/dev/null; then + cprint green "已启用服务: $svc" + else + cprint red bold "启用服务失败: $svc" + cleanup_install_tmp + exit 1 + fi + done + fi + + # Clean tmp dir + cleanup_install_tmp + # Extract installed component info + safe_run extract_component_info "未能从已安装的服务中提取运行时信息" + safe_run print_install_result "未能打印安装结果" + +} + +main() { + trap 'echo "发生意外错误."; exit 99' ERR + safe_run detect_terminal_capabilities "检测终端功能失败" + safe_run check_root "脚本必须以root身份运行" + safe_run parse_args "解析参数失败" "$@" + safe_run detect_os_info "OS检测失败" + # To be moved to a master pre check function. + safe_run resolve_node_arch "解析Node.js架构失败" + + safe_run check_required_commands "缺少必要的系统命令" + + safe_run check_node_installed "在预期目录上检测到Node.js或npm失败。Node.js将被安装." + if [ "$install_node" = true ]; then + safe_run install_node "Node.js安装失败" + fi + + safe_run permission_barrier "权限验证失败-中止安装" + + safe_run prepare_user "准备用户权限失败。处理步骤." + + safe_run download_mcsm "获取MCSManager源失败。处理步骤" + safe_run mcsm_install_prepare "准备安装时出错" + + safe_run install_mcsm "未能安装 MCSManager" +} +main "$@" diff --git a/templates.json b/templates.json index 6bd8682..d57e51e 100644 --- a/templates.json +++ b/templates.json @@ -14,18 +14,19 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.8 Purpur", - "title": "Minecraft 1.21.8", + "description": "Minecraft 1.21.11 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.11", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "55MB", "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.8-2481.jar", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.11-2538.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.8-2481.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.11-2538.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -35,18 +36,41 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.6 Purpur", - "title": "Minecraft 1.21.6", + "description": "Minecraft 1.21.10 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.10", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "55MB", "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.6-2465.jar", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.10-2535.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.6-2465.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.10-2535.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "Minecraft 1.21.8 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.8", + "category": "mc-purpur", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "55MB", + "remark": "Only Purpur included", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.8-2496.jar", + "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/purpur", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.8-2496.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -56,18 +80,19 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.5 Purpur", - "title": "Minecraft 1.21.5", + "description": "Minecraft 1.21.6 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.6", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "55MB", "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.5-2450.jar", + "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.6-2465.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.5-2450.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.6-2465.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -77,8 +102,8 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.4 Purpur", - "title": "Minecraft 1.21.4", + "description": "Minecraft 1.21.4 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.4", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -86,6 +111,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.4-2416.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.4-2416.jar nogui", @@ -98,8 +124,8 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.3 Purpur", - "title": "Minecraft 1.21.3", + "description": "Minecraft 1.21.3 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.3", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -107,6 +133,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.3-2358.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.3-2358.jar nogui", @@ -119,8 +146,8 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.21.1 Purpur", - "title": "Minecraft 1.21.1", + "description": "Minecraft 1.21.1 Purpur Quick Server Setup, High Performance, Low Resource Usage, Plugin Support, No Mod Support", + "title": "[PurpurMC] Minecraft 1.21.1", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -128,6 +155,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.21.1-2329.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.21.1-2329.jar nogui", @@ -141,7 +169,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Purpur] Minecraft 1.20.6 Purpur", - "title": "Minecraft 1.20.6", + "title": "[PurpurMC] Minecraft 1.20.6", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -149,6 +177,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.20.6-2233.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.20.6-2233.jar nogui", @@ -162,7 +191,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Purpur] Minecraft 1.20.4 Purpur", - "title": "Minecraft 1.20.4", + "title": "[PurpurMC] Minecraft 1.20.4", "category": "mc-purpur", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -170,6 +199,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.20.4-2176.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.20.4-2176.jar nogui", @@ -183,7 +213,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Purpur] Minecraft 1.20.1 Purpur", - "title": "Minecraft 1.20.1", + "title": "[PurpurMC] Minecraft 1.20.1", "category": "mc-purpur", "runtime": "Java 17+", "hardware": "RAM 4G+", @@ -191,6 +221,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.20.1-2062.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.20.1-2062.jar nogui", @@ -204,7 +235,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Purpur] Minecraft 1.19.2 Purpur", - "title": "Minecraft 1.19.2", + "title": "[PurpurMC] Minecraft 1.19.2", "category": "mc-purpur", "runtime": "Java 17+", "hardware": "RAM 4G+", @@ -212,6 +243,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.19.2-1858.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.19.2-1858.jar nogui", @@ -225,7 +257,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Purpur] Minecraft 1.18.2 Purpur", - "title": "Minecraft 1.18.2", + "title": "[PurpurMC] Minecraft 1.18.2", "category": "mc-purpur", "runtime": "Java 17+", "hardware": "RAM 4G+", @@ -233,6 +265,7 @@ "remark": "Only Purpur included", "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.18.2-1632.jar", "author": "purpurmc.org", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/purpur", "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.18.2-1632.jar nogui", @@ -245,18 +278,19 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.17.1 Purpur", - "title": "Minecraft 1.17.1", - "category": "mc-purpur", - "runtime": "Java 16+", + "description": "[Paper] Minecraft 1.21.11 Paper", + "title": "[PaperMC] Minecraft 1.21.11", + "category": "mc-paper", + "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "50MB", - "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.17.1-1428.jar", - "author": "purpurmc.org", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.11/builds/39/downloads/paper-1.21.11-39.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { - "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.17.1-1428.jar nogui", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.11-39.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -266,18 +300,19 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Purpur] Minecraft 1.16.5 Purpur", - "title": "Minecraft 1.16.5", - "category": "mc-purpur", - "runtime": "Java 8+", + "description": "[Paper] Minecraft 1.21.10 Paper", + "title": "[PaperMC] Minecraft 1.21.10", + "category": "mc-paper", + "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "50MB", - "remark": "Only Purpur included", - "targetLink": "https://github.com/SkyKingPX/MCSManagerServerSoftware/releases/download/PurpurMC/purpur-1.16.5-1171.jar", - "author": "purpurmc.org", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.10/builds/117/downloads/paper-1.21.10-117.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { - "type": "minecraft/java/purpur", - "startCommand": "java -Xms4096M -Xmx4096M -jar purpur-1.16.5-1171.jar nogui", + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.10-117.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -288,17 +323,18 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.8 Paper", - "title": "Minecraft 1.21.8", + "title": "[PaperMC] Minecraft 1.21.8", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "50MB", "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/10/downloads/paper-1.21.8-10.jar", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/60/downloads/paper-1.21.8-60.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-10.jar nogui", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-60.jar nogui", "stopCommand": "stop", "updateCommand": "", "ie": "utf-8", @@ -309,14 +345,15 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.6 Paper", - "title": "Minecraft 1.21.6", + "title": "[PaperMC] Minecraft 1.21.6", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "50MB", "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.6/builds/48/downloads/paper-1.21.4-48.jar", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.6/builds/48/downloads/paper-1.21.6-48.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.6-48.jar nogui", @@ -330,7 +367,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.4 Paper", - "title": "Minecraft 1.21.4", + "title": "[PaperMC] Minecraft 1.21.4", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -338,6 +375,7 @@ "remark": "Only Paper included", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/232/downloads/paper-1.21.4-232.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.4-232.jar nogui", @@ -351,7 +389,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.3 Paper", - "title": "Minecraft 1.21.3", + "title": "[PaperMC] Minecraft 1.21.3", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -359,6 +397,7 @@ "remark": "Only Paper included", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.3/builds/82/downloads/paper-1.21.3-82.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.3-82.jar nogui", @@ -372,7 +411,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.1 Paper", - "title": "Minecraft 1.21.1", + "title": "[PaperMC] Minecraft 1.21.1", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -380,6 +419,7 @@ "remark": "Only Paper included", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/132/downloads/paper-1.21.1-132.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.1-132.jar nogui", @@ -393,7 +433,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.20.6 Paper", - "title": "Minecraft 1.20.6", + "title": "[PaperMC] Minecraft 1.20.6", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -401,6 +441,7 @@ "remark": "Only Paper included", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.6/builds/151/downloads/paper-1.20.6-151.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.6-151.jar nogui", @@ -414,7 +455,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.20.4 Paper", - "title": "Minecraft 1.20.4", + "title": "[PaperMC] Minecraft 1.20.4", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 4G+", @@ -422,6 +463,7 @@ "remark": "Only Paper included", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/499/downloads/paper-1.20.4-499.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.4-499.jar nogui", @@ -431,32 +473,11 @@ "oe": "utf-8" } }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.20.2 Paper", - "title": "Minecraft 1.20.2", - "category": "mc-paper", - "runtime": "Java 17+", - "hardware": "RAM 4G+", - "size": "150MB", - "remark": "Includes some basic plugins", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.2/builds/318/downloads/paper-1.20.2-318.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.2-318.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, { "language": "en_us", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.20.1 Paper", - "title": "Minecraft 1.20.1", + "title": "[PaperMC] Minecraft 1.20.1", "category": "mc-paper", "runtime": "Java 17+", "hardware": "RAM 4G+", @@ -464,6 +485,7 @@ "remark": "Includes some basic plugins", "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.1/builds/196/downloads/paper-1.20.1-196.jar", "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/paper", "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.1-196.jar nogui", @@ -476,125 +498,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.19.4 Paper", - "title": "Minecraft 1.19.4", - "category": "mc-paper", - "runtime": "Java 17+", - "hardware": "RAM 4G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.19.4/builds/550/downloads/paper-1.19.4-550.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.19.4-550.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.19.2 Paper", - "title": "Minecraft 1.19.2", - "category": "mc-paper", - "runtime": "Java 17+", - "hardware": "RAM 4G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.19.2/builds/307/downloads/paper-1.19.2-307.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.19.2-307.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.18.2 Paper", - "title": "Minecraft 1.18.2", - "category": "mc-paper", - "runtime": "Java 17+", - "hardware": "RAM 4G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.18.2/builds/388/downloads/paper-1.18.2-388.jar", - "author": "papermc.io", + "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", + "title": "[NeoForge] Minecraft 1.21.11", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.11.8-beta/neoforge-21.11.8-beta-installer.jar", + "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.18.2-388.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.17.1 Paper", - "title": "Minecraft 1.17.1", - "category": "mc-paper", - "runtime": "Java 16+", - "hardware": "RAM 4G+", - "size": "60MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.17.1/builds/411/downloads/paper-1.17.1-411.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.17.1-411.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.16.5 Paper", - "title": "Minecraft 1.16.5", - "category": "mc-paper", - "runtime": "Java 8+", - "hardware": "RAM 4G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.16.5/builds/794/downloads/paper-1.16.5-794.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.16.5-794.jar nogui", - "stopCommand": "stop", - "updateCommand": "", - "ie": "utf-8", - "oe": "utf-8" - } - }, - { - "language": "en_us", - "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.12.2 Paper", - "title": "Minecraft 1.12.2", - "category": "mc-paper", - "runtime": "Java 8+", - "hardware": "RAM 4G+", - "size": "50MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.12.2/builds/1620/downloads/paper-1.12.2-1620.jar", - "author": "papermc.io", - "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.12.2-1620.jar nogui", + "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "", + "updateCommand": "java -jar neoforge-21.11.8-beta-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -602,20 +520,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "[Paper] Minecraft 1.8.8 Paper", - "title": "Minecraft 1.8.8", - "category": "mc-paper", - "runtime": "Java 7+", - "hardware": "RAM 4G+", - "size": "20MB", - "remark": "Only Paper included", - "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.8.8/builds/445/downloads/paper-1.8.8-445.jar", - "author": "papermc.io", + "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", + "title": "[NeoForge] Minecraft 1.21.10", + "category": "mc-neoforge", + "runtime": "Java 21+", + "hardware": "RAM 8G+", + "size": "7MB", + "remark": "Minecraft NeoForge", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.10.64/neoforge-21.10.64-installer.jar", + "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { - "type": "minecraft/java/paper", - "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.8.8-445.jar nogui", + "type": "minecraft/java", + "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "", + "updateCommand": "java -jar neoforge-21.10.64-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -624,19 +543,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.21.8 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.21.8", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.4-beta/neoforge-21.8.4-beta-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.8.47/neoforge-21.8.47-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-21.8.4-beta-installer.jar --installServer", + "updateCommand": "java -jar neoforge-21.8.47-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -645,7 +565,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.21.6 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.21.6", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", @@ -653,6 +573,7 @@ "remark": "Minecraft NeoForge", "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.6.20-beta/neoforge-21.6.20-beta-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", @@ -666,19 +587,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.21.5 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.21.5", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.5.87/neoforge-21.5.87-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.5.95/neoforge-21.5.95-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-21.5.87-installer.jar --installServer", + "updateCommand": "java -jar neoforge-21.5.95-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -687,19 +609,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.21.4 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.21.4", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.147/neoforge-21.4.147-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.154/neoforge-21.4.154-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-21.4.147-installer.jar --installServer", + "updateCommand": "java -jar neoforge-21.4.154-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -708,19 +631,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.21.1 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.21.1", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.193/neoforge-21.1.193-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.209/neoforge-21.1.209-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-21.1.193-installer.jar --installServer", + "updateCommand": "java -jar neoforge-21.1.209-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -729,19 +653,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.20.6 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.20.6", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/20.6.137/neoforge-20.6.137-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/20.6.138/neoforge-20.6.138-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-20.6.137-installer.jar --installServer", + "updateCommand": "java -jar neoforge-20.6.138-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -750,19 +675,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.20.4 (Supports Mods)", + "title": "[NeoForge] Minecraft 1.20.4", "category": "mc-neoforge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/20.4.248/neoforge-20.4.248-installer.jar", + "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/20.4.250/neoforge-20.4.250-installer.jar", "author": "neoforged.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-20.4.248-installer.jar --installServer", + "updateCommand": "java -jar neoforge-20.4.250-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -771,19 +697,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "NeoForge 1.20.2 (Supports Mods)", - "category": "mc-neoforge", + "title": "[Forge] Minecraft 1.21.11", + "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", - "remark": "Minecraft NeoForge", - "targetLink": "https://maven.neoforged.net/releases/net/neoforged/neoforge/20.2.93/neoforge-20.2.93-installer.jar", - "author": "neoforged.net", + "remark": "Minecraft Forge", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.11-61.0.3/forge-1.21.11-61.0.3-installer.jar", + "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { - "type": "minecraft/java", + "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar neoforge-20.2.93-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.11-61.0.3-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -792,19 +719,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.21.8 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.10", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.0.0/forge-1.21.8-58.0.0-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.10-60.1.5/forge-1.21.10-60.1.5-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.8-58.0.0-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.10-60.1.5-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -813,19 +741,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.21.6 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.8", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.6-56.0.9/forge-1.21.6-56.0.9-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.8-58.1.1/forge-1.21.8-58.1.1-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.6-56.0.9-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.8-58.1.1-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -834,19 +763,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.21.5 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.6", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.5-55.0.23/forge-1.21.5-55.0.23-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.6-56.0.9/forge-1.21.6-56.0.9-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.5-55.0.23-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.6-56.0.9-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -855,19 +785,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.21.4 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.5", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.3/forge-1.21.4-54.1.3-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.5-55.1.0/forge-1.21.5-55.1.0-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.4-54.1.3-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.5-55.1.0-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -876,19 +807,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.21.1 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.4", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.1/forge-1.21.1-52.1.1-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.4-54.1.6/forge-1.21.4-54.1.6-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.21.1-52.1.1-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.4-54.1.6-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -897,19 +829,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.20.6 (Supports Mods)", + "title": "[Forge] Minecraft 1.21.1", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.6-50.2.0/forge-1.20.6-50.2.0-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.21.1-52.1.3/forge-1.21.1-52.1.3-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.20.6-50.2.0-installer.jar --installServer", + "updateCommand": "java -jar forge-1.21.1-52.1.3-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -918,19 +851,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.20.4 (Supports Mods)", + "title": "[Forge] Minecraft 1.20.6", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.4-49.2.0/forge-1.20.4-49.2.0-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.6-50.2.1/forge-1.20.6-50.2.1-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.20.4-49.2.0-installer.jar --installServer", + "updateCommand": "java -jar forge-1.20.6-50.2.1-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -939,19 +873,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.20.1 (Supports Mods)", + "title": "[Forge] Minecraft 1.20.4", "category": "mc-forge", - "runtime": "Java 17+", + "runtime": "Java 21+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.4.4/forge-1.20.1-47.4.4-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.4-49.2.0/forge-1.20.4-49.2.0-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.20.1-47.4.4-installer.jar --installServer", + "updateCommand": "java -jar forge-1.20.4-49.2.0-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -960,19 +895,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.19.4 (Supports Mods)", + "title": "[Forge] Minecraft 1.20.1", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.19.4-45.4.0/forge-1.19.4-45.4.0-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.4.4/forge-1.20.1-47.4.4-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.19.4-45.4.0-installer.jar --installServer", + "updateCommand": "java -jar forge-1.20.1-47.4.4-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -981,19 +917,20 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.19.2 (Supports Mods)", + "title": "[Forge] Minecraft 1.19.4", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", "size": "7MB", "remark": "Minecraft Forge", - "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.19.2-43.5.0/forge-1.19.2-43.5.0-installer.jar", + "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.19.4-45.4.0/forge-1.19.4-45.4.0-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", "stopCommand": "stop", - "updateCommand": "java -jar forge-1.19.2-43.5.0-installer.jar --installServer", + "updateCommand": "java -jar forge-1.19.4-45.4.0-installer.jar --installServer", "ie": "utf-8", "oe": "utf-8" } @@ -1002,7 +939,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.18.2 (Supports Mods)", + "title": "[Forge] Minecraft 1.18.2", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -1010,6 +947,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.18.2-40.3.9/forge-1.18.2-40.3.9-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1023,7 +961,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.17.1 (Supports Mods)", + "title": "[Forge] Minecraft 1.17.1", "category": "mc-forge", "runtime": "Java 16+", "hardware": "RAM 8G+", @@ -1031,6 +969,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.17.1-37.1.1/forge-1.17.1-37.1.1-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1044,7 +983,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.16.5 (Supports Mods)", + "title": "[Forge] Minecraft 1.16.5", "category": "mc-forge", "runtime": "Java 8+", "hardware": "RAM 8G+", @@ -1052,6 +991,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.16.5-36.2.42/forge-1.16.5-36.2.42-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1065,7 +1005,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.12.2 (Supports Mods)", + "title": "[Forge] Minecraft 1.12.2", "category": "mc-forge", "runtime": "Java 8+", "hardware": "RAM 8G+", @@ -1073,6 +1013,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.12.2-14.23.5.2860/forge-1.12.2-14.23.5.2860-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1086,7 +1027,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.8.9 (Supports Mods)", + "title": "[Forge] Minecraft 1.8.9", "category": "mc-forge", "runtime": "Java 7+", "hardware": "RAM 8G+", @@ -1094,6 +1035,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.8.9-11.15.1.2318-1.8.9/forge-1.8.9-11.15.1.2318-1.8.9-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1107,7 +1049,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "Tip: The default startup command is \"sh ./run.sh\". If you need to run it on Windows, please change start command to \"run.bat\" after installation.", - "title": "Forge 1.7.10 (Supports Mods)", + "title": "[Forge] Minecraft 1.7.10", "category": "mc-forge", "runtime": "Java 7+", "hardware": "RAM 8G+", @@ -1115,6 +1057,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.7.10-10.13.4.1614-1.7.10/forge-1.7.10-10.13.4.1614-1.7.10-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1127,20 +1070,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.21.8 with Fabric Loader", - "title": "Fabric 1.21.8 (Supports Mods)", + "description": "Minecraft 1.21.11 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.11", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.8 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.11 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1148,20 +1092,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.21.6 with Fabric Loader", - "title": "Fabric 1.21.6 (Supports Mods)", + "description": "Minecraft 1.21.10 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.10", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.6 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.10 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1169,20 +1114,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.21.5 with Fabric Loader", - "title": "Fabric 1.21.5 (Supports Mods)", + "description": "Minecraft 1.21.8 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.8", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.5 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.8 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1190,20 +1136,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.21.4 with Fabric Loader", - "title": "Fabric 1.21.4 (Supports Mods)", + "description": "Minecraft 1.21.6 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.6", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.4 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.6 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1211,20 +1158,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.21.1 with Fabric Loader", - "title": "Fabric 1.21.1 (Supports Mods)", + "description": "Minecraft 1.21.5 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.5", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.21.1 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.5 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1232,20 +1180,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.20.6 with Fabric Loader", - "title": "Fabric 1.20.6 (Supports Mods)", + "description": "Minecraft 1.21.4 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.4", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.20.6 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.4 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1253,20 +1202,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.20.4 with Fabric Loader", - "title": "Fabric 1.20.4 (Supports Mods)", + "description": "Minecraft 1.21.1 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.21.1", "category": "mc-fabric", "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.20.4 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.21.1 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1274,20 +1224,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.20.1 with Fabric Loader", - "title": "Fabric 1.20.1 (Supports Mods)", + "description": "Minecraft 1.20.6 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.20.6", "category": "mc-fabric", - "runtime": "Java 17+", + "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.20.1 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.20.6 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1295,20 +1246,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.19.4 with Fabric Loader", - "title": "Fabric 1.19.4 (Supports Mods)", + "description": "Minecraft 1.20.4 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.20.4", "category": "mc-fabric", - "runtime": "Java 17+", + "runtime": "Java 21+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.19.4 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.20.4 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1316,20 +1268,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.19.2 with Fabric Loader", - "title": "Fabric 1.19.2 (Supports Mods)", + "description": "Minecraft 1.20.1 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.20.1", "category": "mc-fabric", "runtime": "Java 17+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.19.2 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.20.1 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1337,20 +1290,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.18.2 with Fabric Loader", - "title": "Fabric 1.18.2 (Supports Mods)", + "description": "Minecraft 1.19.4 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.19.4", "category": "mc-fabric", "runtime": "Java 17+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.18.2 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.19.4 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1358,20 +1312,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.17.1 with Fabric Loader", - "title": "Fabric 1.17.1 (Supports Mods)", + "description": "Minecraft 1.18.2 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.18.2", "category": "mc-fabric", - "runtime": "Java 16+", + "runtime": "Java 17+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.17.1 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.18.2 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1379,20 +1334,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.16.5 with Fabric Loader", - "title": "Fabric 1.16.5 (Supports Mods)", + "description": "Minecraft 1.17.1 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.17.1", "category": "mc-fabric", - "runtime": "Java 8+", + "runtime": "Java 16+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.16.5 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.17.1 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1400,20 +1356,21 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.15.2 with Fabric Loader", - "title": "Fabric 1.15.2 (Supports Mods)", + "description": "Minecraft 1.16.5 with Fabric Loader", + "title": "[FabricMC] Minecraft 1.16.5", "category": "mc-fabric", "runtime": "Java 8+", "hardware": "RAM 4G+", "size": "5MB", "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", + "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.1.0/fabric-installer-1.1.0.jar", "author": "fabricmc.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/fabric", "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.15.2 -downloadMinecraft -noprofile", + "updateCommand": "java -jar fabric-installer-1.1.0.jar server -mcversion 1.16.5 -downloadMinecraft -noprofile", "ie": "utf-8", "oe": "utf-8" } @@ -1421,20 +1378,43 @@ { "language": "en_us", "gameType": "Minecraft", - "description": "Minecraft 1.14.4 with Fabric Loader", - "title": "Fabric 1.14.4 (Supports Mods)", - "category": "mc-fabric", - "runtime": "Java 8+", - "hardware": "RAM 4G+", - "size": "5MB", - "remark": "Minecraft Fabric", - "targetLink": "https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.3/fabric-installer-1.0.3.jar", - "author": "fabricmc.net", + "description": "[Vanilla] Minecraft 1.21.11", + "title": "[Vanilla] Minecraft 1.21.11", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/64bb6d763bed0a9f1d632ec347938594144943ed/server.jar", + "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { - "type": "minecraft/java/fabric", - "startCommand": "java -Xms4096M -Xmx4096M -jar fabric-server-launch.jar nogui", + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Vanilla] Minecraft 1.21.10", + "title": "[Vanilla] Minecraft 1.21.10", + "category": "mc-vanilla", + "runtime": "Java 21+", + "hardware": "RAM 2G+", + "size": "55MB", + "remark": "Minecraft Java", + "targetLink": "https://piston-data.mojang.com/v1/objects/95495a7f485eedd84ce928cef5e223b757d2f764/server.jar", + "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java", + "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", "stopCommand": "stop", - "updateCommand": "java -jar fabric-installer-1.0.3.jar server -mcversion 1.14.4 -downloadMinecraft -noprofile", + "updateCommand": "", "ie": "utf-8", "oe": "utf-8" } @@ -1443,7 +1423,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.21.8", - "title": "Minecraft 1.21.8", + "title": "[Vanilla] Minecraft 1.21.8", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1451,6 +1431,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1464,7 +1445,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.21.6", - "title": "Minecraft 1.21.6", + "title": "[Vanilla] Minecraft 1.21.6", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1472,6 +1453,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/6e64dcabba3c01a7271b4fa6bd898483b794c59b/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1485,7 +1467,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.21.5", - "title": "Minecraft 1.21.5", + "title": "[Vanilla] Minecraft 1.21.5", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1493,6 +1475,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/e6ec2f64e6080b9b5d9b471b291c33cc7f509733/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1506,7 +1489,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.21.4", - "title": "Minecraft 1.21.4", + "title": "[Vanilla] Minecraft 1.21.4", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1514,6 +1497,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1527,7 +1511,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.21.1", - "title": "Minecraft 1.21.1", + "title": "[Vanilla] Minecraft 1.21.1", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1535,6 +1519,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1548,7 +1533,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.20.6", - "title": "Minecraft 1.20.6", + "title": "[Vanilla] Minecraft 1.20.6", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1556,6 +1541,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/145ff0858209bcfc164859ba735d4199aafa1eea/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1569,7 +1555,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.20.4", - "title": "Minecraft 1.20.4", + "title": "[Vanilla] Minecraft 1.20.4", "category": "mc-vanilla", "runtime": "Java 21+", "hardware": "RAM 2G+", @@ -1577,6 +1563,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/8dd1a28015f51b1803213892b50b7b4fc76e594d/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1590,7 +1577,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.20.1", - "title": "Minecraft 1.20.1", + "title": "[Vanilla] Minecraft 1.20.1", "category": "mc-vanilla", "runtime": "Java 17+", "hardware": "RAM 2G+", @@ -1598,6 +1585,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/84194a2f286ef7c14ed7ce0090dba59902951553/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1611,7 +1599,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.19.4", - "title": "Minecraft 1.19.4", + "title": "[Vanilla] Minecraft 1.19.4", "category": "mc-vanilla", "runtime": "Java 17+", "hardware": "RAM 2G+", @@ -1619,6 +1607,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/8f3112a1049751cc472ec13e397eade5336ca7ae/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1632,7 +1621,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.18.2", - "title": "Minecraft 1.18.2", + "title": "[Vanilla] Minecraft 1.18.2", "category": "mc-vanilla", "runtime": "Java 17+", "hardware": "RAM 2G+", @@ -1640,6 +1629,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/c8f83c5655308435b3dcf03c06d9fe8740a77469/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1653,7 +1643,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.17.1", - "title": "Minecraft 1.17.1", + "title": "[Vanilla] Minecraft 1.17.1", "category": "mc-vanilla", "runtime": "Java 16+", "hardware": "RAM 2G+", @@ -1661,6 +1651,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1674,7 +1665,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.16.5", - "title": "Minecraft 1.16.5", + "title": "[Vanilla] Minecraft 1.16.5", "category": "mc-vanilla", "runtime": "Java 8+", "hardware": "RAM 2G+", @@ -1682,6 +1673,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1695,7 +1687,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.12.2", - "title": "Minecraft 1.12.2", + "title": "[Vanilla] Minecraft 1.12.2", "category": "mc-vanilla", "runtime": "Java 8+", "hardware": "RAM 2G+", @@ -1703,6 +1695,7 @@ "remark": "Minecraft Java", "targetLink": "https://piston-data.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1716,7 +1709,7 @@ "language": "en_us", "gameType": "Minecraft", "description": "[Vanilla] Minecraft 1.8.9", - "title": "Minecraft 1.8.9", + "title": "[Vanilla] Minecraft 1.8.9", "category": "mc-vanilla", "runtime": "Java 7+", "hardware": "RAM 2G+", @@ -1724,6 +1717,7 @@ "remark": "Minecraft Java", "targetLink": "https://launcher.mojang.com/v1/objects/b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd/server.jar", "author": "Mojang Studios", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms2048M -Xmx2048M -jar server.jar nogui", @@ -1737,7 +1731,7 @@ "language": "zh_cn", "gameType": "Minecraft", "description": "[Paper] Minecraft 1.21.1 快速开服", - "title": "Minecraft 1.20.1", + "title": "[PaperMC] Minecraft 1.20.1", "category": "mc-paper", "runtime": "Java 17+", "hardware": "RAM 4G+", @@ -1745,6 +1739,7 @@ "remark": "包含基础插件,萌新快速开服!低配机器专属!", "targetLink": "https://cloud.alongw.cn/f/DzvHK/Paper-1.21.1-ZH.zip", "author": "alongw.cn", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms4096M -Xmx4096M -jar server.jar nogui", @@ -1758,7 +1753,7 @@ "language": "zh_cn", "gameType": "Minecraft", "description": "[Paper] 中小型互通服推荐,1.20.4 版本,快速开服,包含ESS、锁箱子、操作回滚、领地商店等基础插件。", - "title": "Minecraft 1.20.4 (低配机器推荐)", + "title": "[PaperPC] Minecraft 1.20.4 (低配机器推荐)", "category": "mc-paper", "runtime": "Java 21+", "hardware": "RAM 6G+", @@ -1766,6 +1761,7 @@ "remark": "支持插件,最低 8GB 内存要求", "targetLink": "https://url.alww.top/mcsm/paper1.20.4.zip", "author": "alongw.cn", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java", "startCommand": "java -Xms6144M -Xmx6144M -jar server.jar nogui", @@ -1775,11 +1771,209 @@ "oe": "utf-8" } }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.21.8 Paper", + "title": "[PaperMC] Minecraft 1.21.8", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.8/builds/60/downloads/paper-1.21.8-60.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.8-60.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.21.6 Paper", + "title": "[PaperMC] Minecraft 1.21.6", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.6/builds/48/downloads/paper-1.21.6-48.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.6-48.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.21.4 Paper", + "title": "[PaperMC] Minecraft 1.21.4", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/232/downloads/paper-1.21.4-232.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.4-232.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.21.3 Paper", + "title": "[PaperMC] Minecraft 1.21.3", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.3/builds/82/downloads/paper-1.21.3-82.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.3-82.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.21.1 Paper", + "title": "[PaperMC] Minecraft 1.21.1", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/132/downloads/paper-1.21.1-132.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.21.1-132.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.20.6 Paper", + "title": "[PaperMC] Minecraft 1.20.6", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.6/builds/151/downloads/paper-1.20.6-151.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.6-151.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.20.4 Paper", + "title": "[PaperMC] Minecraft 1.20.4", + "category": "mc-paper", + "runtime": "Java 21+", + "hardware": "RAM 4G+", + "size": "50MB", + "remark": "Only Paper included", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.4/builds/499/downloads/paper-1.20.4-499.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.4-499.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.20.2 Paper", + "title": "[PaperMC] Minecraft 1.20.2", + "category": "mc-paper", + "runtime": "Java 17+", + "hardware": "RAM 4G+", + "size": "150MB", + "remark": "Includes some basic plugins", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.2/builds/318/downloads/paper-1.20.2-318.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.2-318.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, + { + "language": "en_us", + "gameType": "Minecraft", + "description": "[Paper] Minecraft 1.20.1 Paper", + "title": "[PaperMC] Minecraft 1.20.1", + "category": "mc-paper", + "runtime": "Java 17+", + "hardware": "RAM 4G+", + "size": "200MB", + "remark": "Includes some basic plugins", + "targetLink": "https://api.papermc.io/v2/projects/paper/versions/1.20.1/builds/196/downloads/paper-1.20.1-196.jar", + "author": "papermc.io", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", + "setupInfo": { + "type": "minecraft/java/paper", + "startCommand": "java -Xms4096M -Xmx4096M -jar paper-1.20.1-196.jar nogui", + "stopCommand": "stop", + "updateCommand": "", + "ie": "utf-8", + "oe": "utf-8" + } + }, { "language": "zh_cn", "gameType": "Minecraft", "description": "注意:默认的启动命令是 \"sh ./run.sh\",如果需要在 Windows 上运行,请在安装后将命令修改为 \"start.bat\"", - "title": "Forge 1.20.1 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.20.1 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -1787,6 +1981,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.3.33/forge-1.20.1-47.3.33-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1800,7 +1995,7 @@ "language": "zh_cn", "gameType": "Minecraft", "description": "注意:默认的启动命令是 \"sh ./run.sh\",如果需要在 Windows 上运行,请在安装后将命令修改为 \"start.bat\"", - "title": "Forge 1.20.6 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.20.6 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 21+", "hardware": "RAM 8G+", @@ -1808,6 +2003,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.6-50.1.48/forge-1.20.6-50.1.48-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh", @@ -1821,7 +2017,7 @@ "language": "zh_cn", "gameType": "Minecraft", "description": "注意:默认的启动命令是 \"sh ./run.sh\",如果需要在 Windows 上运行,请在安装后将命令修改为 \"start.bat\"", - "title": "Forge 1.19.2 Java 版 (支持模组)", + "title": "[Forge] Minecraft 1.19.2 Java 版 (支持模组)", "category": "mc-forge", "runtime": "Java 17+", "hardware": "RAM 8G+", @@ -1829,6 +2025,7 @@ "remark": "Minecraft Forge", "targetLink": "https://maven.minecraftforge.net/net/minecraftforge/forge/1.19.2-43.4.20/forge-1.19.2-43.4.20-installer.jar", "author": "minecraftforge.net", + "image": "https://mcsmanager.oss-cn-guangzhou.aliyuncs.com/package-images/minecraft.webp", "setupInfo": { "type": "minecraft/java/forge", "startCommand": "sh ./run.sh",