Files
vps/install/23-Sub2API.sh
T
eddy e2677ce118 feat: 为 Sub2API 添加 app 镜像每日自动更新
- 生成 auto-update.sh,仅拉取并重启 app 服务(不动 db / redis)
- 注册每天 04:00 的定时任务,按脚本路径去重避免重复写入
- 兼容 docker compose 与 docker-compose,安装与更新均自动检测
- 更新后清理悬空镜像,并写入 auto-update.log 日志
- 安装结束时打印手动更新提示与自动更新说明
2026-07-01 03:15:27 +08:00

132 lines
4.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# chmod +x 23-Sub2API.sh && ./23-Sub2API.sh
# curl -sS -O https://gitea.tohub.top/Share/vps/raw/branch/main/install/23-Sub2API.sh && chmod +x 23-Sub2API.sh && ./23-Sub2API.sh
set -euo pipefail
port80=8230
# 1、更新包(更新失败不阻断后续安装)
export DEBIAN_FRONTEND=noninteractive
apt update -y || true
apt upgrade -y || true #更新一下包
# 2、创建安装目录
mkdir -p /root/data/docker_data/Sub2API
cd /root/data/docker_data/Sub2API || { echo "无法进入安装目录 /root/data/docker_data/Sub2API" >&2; exit 1; }
# 3、填写docker-compose配置
cat <<EOF > docker-compose.yml
services:
db:
image: postgres:15-alpine
container_name: sub2api-db
restart: unless-stopped
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=changeme # 改成你自己的密码
- POSTGRES_USER=postgres # 改成你自己的用户名
- POSTGRES_DB=sub2api
redis:
image: redis:7-alpine
container_name: sub2api-redis
restart: unless-stopped
volumes:
- ./data/redis:/data
app:
image: weishaw/sub2api:latest
container_name: sub2api-app
restart: unless-stopped
ports:
- "$port80:8080" # 左边的端口可以更换,右边不要动!
depends_on:
- db
- redis
environment:
# 主机用容器服务名 db / redis,不要写宿主机 IP
- DATABASE_URL=postgres://postgres:changeme@db:5432/sub2api?sslmode=disable # 用户名/密码/库名要与上面 db 对应!
- REDIS_URL=redis://redis:6379
- SERVER_PORT=8080 # 镜像用的是 SERVER_PORT,必须与 ports 右边的容器端口一致
- GIN_MODE=release
EOF
# 4、安装
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、打开防火墙的端口
if command -v ufw >/dev/null 2>&1; then
ufw allow "$port80"
ufw status
else
echo "未检测到 ufw,跳过防火墙端口放行。"
fi
# 6、配置每日自动更新
# install_dir 已在脚本开头创建,这里仅定义路径
install_dir=/root/data/docker_data/Sub2API
update_script="$install_dir/auto-update.sh"
cat <<'EOF' > "$update_script"
#!/bin/bash
set -euo pipefail
install_dir=/root/data/docker_data/Sub2API
cd "$install_dir" # 进入 docker-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
echo "未检测到 docker compose 或 docker-compose,无法自动更新。" >&2
exit 1
fi
# 只更新 app 服务(Sub2API 镜像),不动 db / redis
"${compose_cmd[@]}" pull app
"${compose_cmd[@]}" up -d app
# 清理旧镜像,释放磁盘空间
docker image prune -f
EOF
chmod +x "$update_script"
# 写入每日 04:00 自动更新任务
cron_line="0 4 * * * $update_script >> /root/data/docker_data/Sub2API/auto-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 -
echo "已配置定时自动更新任务:每天 04:00 自动更新 Sub2API app 镜像(不更新 db / redis)。"
else
echo "未检测到 crontab,跳过定时更新任务配置。可手动执行 $update_script 更新。"
fi
# 打印访问链接
echo "------------------------"
echo "访问链接:"
echo "https://sub2api.ghuang.top"
echo "User: admin@localhost"
echo "Password: admin"
echo "------------------------"
echo "已开启定时自动更新:每天 04:00 仅拉取最新 app 镜像并重启(db / redis 不动)。"
echo "手动更新可执行:$update_script"
echo "------------------------"