From b2ebaf9e063183ee635b8d5454f110c2679b17e8 Mon Sep 17 00:00:00 2001 From: pi-agent Date: Sat, 28 Mar 2026 12:48:13 +0800 Subject: [PATCH] feat: add panel entry script --- README.md | 117 +++++++++++++++++++++++++++++-------------------- panel-start.sh | 64 +++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 48 deletions(-) create mode 100755 panel-start.sh diff --git a/README.md b/README.md index a97d82d..d466f92 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,20 @@ docker run --pull=always \ ## 面板服一键启动方案 -仓库根目录提供了 `start.sh`,适合“只能上传文件、编辑文件,然后点一个固定 shell 脚本启动”的面板服环境。 +仓库根目录提供了: -这个脚本现在**直接复用官方 `packwiz-installer-bootstrap` / `packwiz-installer`**,而不是自己手动管理模组列表。 +- `start.sh`:仓库内真正负责安装与启动服务端的主脚本 +- `panel-start.sh`:专门给面板服上传使用的薄入口脚本 + +推荐你在面板服里这样用: + +1. 直接下载仓库里的 `panel-start.sh` +2. 上传到面板 +3. 如果面板要求固定入口文件名是 `start.sh`,就把它重命名成 `start.sh` +4. 按需要修改里面的变量 +5. 点击运行 + +`start.sh` 现在**直接复用官方 `packwiz-installer-bootstrap` / `packwiz-installer`**,而不是自己手动管理模组列表。 它会自动完成这些事情: @@ -62,21 +73,13 @@ docker run --pull=always \ 2. 读取该 pack 的 `pack.toml` 中的 Minecraft / Fabric 版本 3. 下载并执行 Fabric 官方 installer,生成服务端启动 jar 4. 下载并执行 `packwiz-installer-bootstrap` -5. 用 `packwiz-installer --side server` 根据远程 `pack.toml` 自动同步当前服务端需要的模组 +5. 用 `packwiz-installer --side server` 根据远程或本地 `pack.toml` 自动同步当前服务端需要的模组 6. 自动写入 `eula.txt` 7. 最后启动服务端 -这意味着以后仓库里新增更多目录,例如: +## 方案一:上传整个仓库后直接运行 -- `server-01-random-block` -- `server-02-xxx` -- `server-03-yyy` - -都可以继续复用同一个启动脚本,只需要切换 `PT_SERVER` 即可。 - -## 方案一:你把整个仓库上传到面板服 - -上传后,最简单的执行方式就是: +如果你的面板允许你上传整个仓库,那么直接运行: ```bash PT_SERVER="server-01-random-block" bash start.sh @@ -96,50 +99,74 @@ PT_SERVER="server-01-random-block" PT_JAVA_ARGS="-Xms1G -Xmx1G" bash start.sh PT_SERVER="server-02-xxx" bash start.sh ``` -### 什么时候需要 `PT_REPO_URL / PT_REPO_REF` +## 方案二:只下载并上传 `panel-start.sh` -如果你希望 `packwiz-installer` 始终以远程仓库中的 `pack.toml` 为准,而不是当前本地文件,也可以额外传: +如果你只想下载一个脚本文件再上传到面板,那么请直接使用: -```bash -PT_REPO_URL="https://gitea.service.jazzwhom.top/Passthem/pt-minecraft-modpack" \ -PT_REPO_REF="main" \ -PT_SERVER="server-01-random-block" \ -bash start.sh +- 仓库文件:`panel-start.sh` + +你上传后: + +- 如果面板固定执行文件名就是 `start.sh`,请把 `panel-start.sh` 重命名为 `start.sh` +- 然后编辑这几个变量: + +```sh +REPO_URL="https://gitea.service.jazzwhom.top/Passthem/pt-minecraft-modpack" +REPO_REF="main" +PT_SERVER="server-01-random-block" +PT_JAVA_ARGS="-Xms1G -Xmx1G" ``` -## 方案二:面板服里只粘贴一个“远程拉取并运行”的脚本 +这个脚本会: -如果你的面板服不方便手动上传整个仓库,而是允许你在固定 `.sh` 入口里粘贴脚本,那么可以直接粘贴下面这段: +1. 从 Gitea 下载整个仓库归档 +2. 解压到当前目录下的 `pt-minecraft-modpack/` +3. 自动调用仓库里的 `start.sh` -```bash -#!/usr/bin/env bash -set -Eeuo pipefail +### 直接下载链接 + +你可以直接下载这个文件: + +- `panel-start.sh`: + `https://gitea.service.jazzwhom.top/Passthem/pt-minecraft-modpack/raw/branch/main/panel-start.sh` + +## 方案三:直接复制 `panel-start.sh` 内容到面板里 + +如果你的面板不能单独下载文件,但允许你粘贴脚本内容,也可以把下面这段直接保存成面板入口脚本: + +> 注意:请确保保存为 **LF 换行**,不要是 Windows 的 CRLF。 + +```sh +#!/bin/sh +set -eu REPO_URL="https://gitea.service.jazzwhom.top/Passthem/pt-minecraft-modpack" REPO_REF="main" PT_SERVER="server-01-random-block" INSTALL_DIR="$(pwd)/pt-minecraft-modpack" +ARCHIVE_PATH="$(pwd)/pt-minecraft-modpack.tar.gz" +TMP_DIR="$(pwd)/pt-minecraft-modpack.__tmp" PT_JAVA_ARGS="-Xms1G -Xmx1G" +rm -rf "$TMP_DIR" +mkdir -p "$TMP_DIR" + if command -v curl >/dev/null 2>&1; then - DOWNLOAD() { curl -fL --retry 3 --retry-delay 2 -o "$1" "$2"; } + curl -fL --retry 3 --retry-delay 2 -o "$ARCHIVE_PATH" "$REPO_URL/archive/$REPO_REF.tar.gz" elif command -v wget >/dev/null 2>&1; then - DOWNLOAD() { wget -O "$1" "$2"; } + wget -O "$ARCHIVE_PATH" "$REPO_URL/archive/$REPO_REF.tar.gz" else echo "缺少 curl 或 wget" >&2 exit 1 fi -ARCHIVE_PATH="$INSTALL_DIR.tar.gz" -TMP_DIR="$INSTALL_DIR.__tmp" -rm -rf "$TMP_DIR" -mkdir -p "$TMP_DIR" - -DOWNLOAD "$ARCHIVE_PATH" "$REPO_URL/archive/$REPO_REF.tar.gz" tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR" EXTRACTED_DIR="$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)" -[ -n "$EXTRACTED_DIR" ] || { echo "解压失败" >&2; exit 1; } +if [ -z "$EXTRACTED_DIR" ]; then + echo "解压失败" >&2 + exit 1 +fi rm -rf "$INSTALL_DIR" mv "$EXTRACTED_DIR" "$INSTALL_DIR" @@ -150,27 +177,21 @@ PT_REPO_URL="$REPO_URL" \ PT_REPO_REF="$REPO_REF" \ PT_SERVER="$PT_SERVER" \ PT_JAVA_ARGS="$PT_JAVA_ARGS" \ -bash start.sh +bash ./start.sh ``` -### 这个远程脚本怎么改 +## 环境兼容性说明 -你通常只需要改这几个变量: +有些面板不是用 `bash start.sh`,而是直接用 `sh start.sh`。因此: -- `REPO_REF`:默认 `main`,也可以改成某个分支或 tag -- `PT_SERVER`:你这次要开的服务端目录名 -- `INSTALL_DIR`:解压后的安装目录 -- `PT_JAVA_ARGS`:JVM 参数 - -例如切换到另一个服务端: - -```bash -PT_SERVER="server-02-xxx" -``` +- 面板入口脚本建议使用 `panel-start.sh` 这种 `sh` 兼容的薄脚本 +- 仓库内真正运行 Minecraft 的脚本继续使用 `bash` +- 如果你是从 Windows 编辑/复制脚本,请务必使用 **LF** 换行,不要用 **CRLF** ## 环境要求 -- 必须有 `bash` +- 面板入口脚本需要:`sh` +- 仓库主脚本 `start.sh` 需要:`bash` - 必须有 `java` - 必须有 `curl` 或 `wget` - 远程拉取方案还需要 `tar` diff --git a/panel-start.sh b/panel-start.sh new file mode 100755 index 0000000..d8294ec --- /dev/null +++ b/panel-start.sh @@ -0,0 +1,64 @@ +#!/bin/sh +set -eu + +# 面板入口脚本:适合“面板固定执行 start.sh,但只能上传文件/编辑文件”的环境。 +# 用法: +# 1. 下载本文件 +# 2. 上传到面板,并按需要重命名为面板要求的固定入口名(通常就是 start.sh) +# 3. 修改下面几个变量 +# 4. 点击运行 + +REPO_URL="${REPO_URL:-https://gitea.service.jazzwhom.top/Passthem/pt-minecraft-modpack}" +REPO_REF="${REPO_REF:-main}" +PT_SERVER="${PT_SERVER:-server-01-random-block}" +INSTALL_DIR="${INSTALL_DIR:-$(pwd)/pt-minecraft-modpack}" +ARCHIVE_PATH="${ARCHIVE_PATH:-$(pwd)/pt-minecraft-modpack.tar.gz}" +TMP_DIR="${TMP_DIR:-$(pwd)/pt-minecraft-modpack.__tmp}" +PT_JAVA_ARGS="${PT_JAVA_ARGS:--Xms1G -Xmx1G}" + +log() { + printf '[panel-entry] %s\n' "$*" +} + +fail() { + printf '[panel-entry] ERROR: %s\n' "$*" >&2 + exit 1 +} + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || fail "缺少命令: $1" +} + +need_cmd sh +need_cmd tar +need_cmd find + +rm -rf "$TMP_DIR" +mkdir -p "$TMP_DIR" + +log "下载仓库归档: $REPO_URL ($REPO_REF)" +if command -v curl >/dev/null 2>&1; then + curl -fL --retry 3 --retry-delay 2 -o "$ARCHIVE_PATH" "$REPO_URL/archive/$REPO_REF.tar.gz" +elif command -v wget >/dev/null 2>&1; then + wget -O "$ARCHIVE_PATH" "$REPO_URL/archive/$REPO_REF.tar.gz" +else + fail "缺少 curl 或 wget" +fi + +log "解压仓库归档" +tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR" + +EXTRACTED_DIR="$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)" +[ -n "$EXTRACTED_DIR" ] || fail "解压失败" + +rm -rf "$INSTALL_DIR" +mv "$EXTRACTED_DIR" "$INSTALL_DIR" +rm -rf "$TMP_DIR" "$ARCHIVE_PATH" + +cd "$INSTALL_DIR" +log "调用仓库内 start.sh" +PT_REPO_URL="$REPO_URL" \ +PT_REPO_REF="$REPO_REF" \ +PT_SERVER="$PT_SERVER" \ +PT_JAVA_ARGS="$PT_JAVA_ARGS" \ +bash ./start.sh -- 2.49.0