fix: 强化 Sub2API 安装与更新流程
- 在修改安装文件前先校验 Docker 与 Compose 是否可用 - 让“不安装”选项直接干净退出,而不是触发更新 - 复用已检测到的 Compose 命令执行安装和更新操作 - 在无 apt 的系统上跳过系统包更新 - 限制自动更新日志增长,并保留日志文件 inode
This commit is contained in:
+56
-33
@@ -10,6 +10,29 @@ port80=8230
|
||||
install_dir=/root/data/docker_data/Sub2API
|
||||
update_script="$install_dir/auto-update.sh"
|
||||
env_file="$install_dir/.env"
|
||||
update_log="$install_dir/auto-update.log"
|
||||
|
||||
# 检测 compose 命令,结果存入全局数组 compose_cmd;检测失败返回 1
|
||||
detect_compose() {
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
compose_cmd=(docker compose)
|
||||
elif command -v docker-compose >/dev/null 2>&1; then
|
||||
compose_cmd=(docker-compose)
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# 前置检查:docker 与 compose 必须先就绪,避免改完配置文件才发现环境缺失
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "未检测到 docker,请先安装 Docker 后再运行本脚本。" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! detect_compose; then
|
||||
echo "未检测到 docker compose 或 docker-compose,请先安装 Docker Compose。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 交互:已有安装时默认只更新,避免覆盖数据库账号、密码和连接配置
|
||||
existing_install=0
|
||||
@@ -23,32 +46,33 @@ if [ "$existing_install" -eq 1 ]; then
|
||||
echo " 2) 强制重装 Sub2API(重写 docker-compose.yml,保留 .env 与数据目录)"
|
||||
else
|
||||
echo " 1) 安装 Sub2API(默认)"
|
||||
echo " 2) 不安装,立即执行 Docker 更新"
|
||||
echo " 2) 不安装,退出"
|
||||
fi
|
||||
read -r -p "请输入选项 [1/2](默认 1):" action_choice
|
||||
action_choice="${action_choice:-1}"
|
||||
|
||||
if { [ "$existing_install" -eq 1 ] && [ "$action_choice" = "1" ]; } || { [ "$existing_install" -eq 0 ] && [ "$action_choice" = "2" ]; }; then
|
||||
echo "已选择:立即执行 Docker 更新。"
|
||||
if [ -x "$update_script" ]; then
|
||||
"$update_script"
|
||||
elif [ -f "$install_dir/docker-compose.yml" ]; then
|
||||
cd "$install_dir" || { echo "无法进入安装目录 $install_dir" >&2; exit 1; }
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
compose_cmd=(docker compose)
|
||||
elif command -v docker-compose >/dev/null 2>&1; then
|
||||
compose_cmd=(docker-compose)
|
||||
else
|
||||
echo "未检测到 docker compose 或 docker-compose,无法执行更新。" >&2
|
||||
# 严格校验输入,防止误输入落入重装流程
|
||||
if [ "$action_choice" != "1" ] && [ "$action_choice" != "2" ]; then
|
||||
echo "无效选项:$action_choice,已退出。未做任何修改。" >&2
|
||||
exit 1
|
||||
fi
|
||||
# 只更新 app 服务(Sub2API 镜像),不动 db / redis
|
||||
|
||||
if [ "$existing_install" -eq 0 ] && [ "$action_choice" = "2" ]; then
|
||||
echo "已选择不安装,退出。"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$existing_install" -eq 1 ] && [ "$action_choice" = "1" ]; then
|
||||
echo "已选择:立即执行 Docker 更新。"
|
||||
if [ -x "$update_script" ]; then
|
||||
# 优先用已生成的 auto-update.sh(同样只更新 app,不动 db / redis)
|
||||
"$update_script"
|
||||
else
|
||||
cd "$install_dir" || { echo "无法进入安装目录 $install_dir" >&2; exit 1; }
|
||||
# 回退方案:直接用 compose 只更新 app 服务(Sub2API 镜像),不动 db / redis
|
||||
"${compose_cmd[@]}" pull app
|
||||
"${compose_cmd[@]}" up -d app
|
||||
docker image prune -f
|
||||
else
|
||||
echo "未检测到已安装的 Sub2API(缺少 $install_dir/docker-compose.yml),请先安装。" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Docker 更新完成。"
|
||||
exit 0
|
||||
@@ -65,10 +89,14 @@ if [ "$existing_install" -eq 1 ] && [ "$action_choice" = "2" ]; then
|
||||
fi
|
||||
|
||||
|
||||
# 1、更新包(更新失败不阻断后续安装)
|
||||
# 1、更新包(更新失败不阻断后续安装;非 Debian 系无 apt 则跳过)
|
||||
if command -v apt >/dev/null 2>&1; then
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt update -y || true
|
||||
apt upgrade -y || true #更新一下包
|
||||
else
|
||||
echo "未检测到 apt,跳过系统包更新。"
|
||||
fi
|
||||
|
||||
# 2、创建安装目录
|
||||
mkdir -p "$install_dir"
|
||||
@@ -195,20 +223,8 @@ services:
|
||||
- TZ=\${TZ:-Asia/Shanghai}
|
||||
EOF
|
||||
|
||||
# 5、安装
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "未检测到 docker,请先安装 Docker 后再运行本脚本。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
docker compose up -d
|
||||
elif command -v docker-compose >/dev/null 2>&1; then
|
||||
docker-compose up -d
|
||||
else
|
||||
echo "未检测到 docker compose 或 docker-compose,请先安装 Docker Compose。" >&2
|
||||
exit 1
|
||||
fi
|
||||
# 5、安装(docker 与 compose 已在脚本开头检查过)
|
||||
"${compose_cmd[@]}" up -d
|
||||
|
||||
# 6、打开防火墙的端口
|
||||
if command -v ufw >/dev/null 2>&1; then
|
||||
@@ -242,12 +258,19 @@ fi
|
||||
|
||||
# 清理旧镜像,释放磁盘空间
|
||||
docker image prune -f
|
||||
|
||||
# 修剪日志避免无限增长(只保留最近 1000 行)
|
||||
# 用 cat 覆盖写回而非 mv,保留原 inode,避免 cron 持有的 append 文件描述符失效
|
||||
log_file="$install_dir/auto-update.log"
|
||||
if [ -f "$log_file" ]; then
|
||||
tail -n 1000 "$log_file" > "$log_file.tmp" && cat "$log_file.tmp" > "$log_file" && rm -f "$log_file.tmp"
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod +x "$update_script"
|
||||
|
||||
# 写入每日 04:00 自动更新任务
|
||||
cron_line="0 4 * * * $update_script >> /root/data/docker_data/Sub2API/auto-update.log 2>&1"
|
||||
cron_line="0 4 * * * $update_script >> $update_log 2>&1"
|
||||
if command -v crontab >/dev/null 2>&1; then
|
||||
# 使用脚本路径去重,避免重复写入 Sub2API 自动更新任务
|
||||
( crontab -l 2>/dev/null | grep -v -F -- "$update_script" || true ; echo "$cron_line" ) | crontab -
|
||||
|
||||
Reference in New Issue
Block a user