Files
vps/install/23-Sub2API.sh
T
eddy 82b0e53d85 feat: 为 Sub2API 安装脚本添加数据持久化配置
- 在 Docker Compose 配置中增加数据卷映射,确保应用数据和配置在更新后不丢失
- 注释说明持久化的目的,提升可读性
2026-07-02 04:20:59 +08:00

187 lines
6.5 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
# 安装目录与更新脚本路径
install_dir=/root/data/docker_data/Sub2API
update_script="$install_dir/auto-update.sh"
# 交互:已有安装时默认只更新,避免覆盖数据库账号、密码和连接配置
existing_install=0
if [ -f "$install_dir/docker-compose.yml" ]; then
existing_install=1
fi
echo "请选择操作:"
if [ "$existing_install" -eq 1 ]; then
echo " 1) 已安装,仅更新 Sub2API app 镜像(默认,安全,不覆盖配置/数据库)"
echo " 2) 强制重装 Sub2API(危险,会重写 docker-compose.yml"
else
echo " 1) 安装 Sub2API(默认)"
echo " 2) 不安装,立即执行 Docker 更新"
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
exit 1
fi
# 只更新 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
fi
if [ "$existing_install" -eq 1 ] && [ "$action_choice" = "2" ]; then
echo "检测到已有 Sub2API 安装:$install_dir/docker-compose.yml"
echo "强制重装会覆盖 docker-compose.yml,可能导致数据库账号、密码或连接配置被重置。"
read -r -p "如确需重装,请输入 REINSTALL 确认:" reinstall_confirm
if [ "$reinstall_confirm" != "REINSTALL" ]; then
echo "未确认强制重装,已退出。原有配置未修改。"
exit 0
fi
fi
# 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
volumes:
- ./data/app:/app/data # 持久化 app 配置/数据,避免更新后丢失需要重新配置
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、配置每日自动更新
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 "------------------------"