#!/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 < 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 "------------------------"