164 lines
4.6 KiB
Bash
164 lines
4.6 KiB
Bash
#!/bin/bash
|
||
|
||
# ==========================================
|
||
# SublinkX/E 部署脚本 (带自动备份恢复功能)
|
||
# 路径锁定: /data/sublinkx
|
||
# ==========================================
|
||
|
||
set -e
|
||
|
||
# 定义路径和备份地址
|
||
PROJECT_DIR="/data/sublinkx"
|
||
COMPOSE_FILE="$PROJECT_DIR/docker-compose.yml"
|
||
BACKUP_URL="https://pub-b69a7194f4ea42fba6aa990c49bded91.r2.dev/data/sublinkx.zip"
|
||
|
||
# 检查并安装必要工具 (wget, unzip)
|
||
echo "正在检查系统环境..."
|
||
if ! command -v unzip &> /dev/null; then
|
||
echo "未找到 unzip,正在安装..."
|
||
if [ -f /etc/debian_version ]; then
|
||
apt-get update && apt-get install -y unzip wget
|
||
elif [ -f /etc/redhat-release ]; then
|
||
yum install -y unzip wget
|
||
fi
|
||
fi
|
||
|
||
echo "=================================================="
|
||
echo "请选择要部署的版本 / Select Version:"
|
||
echo "1. SublinkX (原版 - jaaksi/sublinkx) - 仅全新部署"
|
||
echo "2. SublinkE (新版 - eun1e/sublinke) - 部署并恢复数据"
|
||
echo "=================================================="
|
||
read -p "请输入数字 [1-2]: " choice
|
||
|
||
# 1. 停止旧服务
|
||
if [ -f "$COMPOSE_FILE" ]; then
|
||
echo "检测到旧配置,正在停止旧容器..."
|
||
cd "$PROJECT_DIR"
|
||
docker compose down 2>/dev/null || true
|
||
fi
|
||
|
||
# 2. 准备目录
|
||
echo "正在准备目录: $PROJECT_DIR ..."
|
||
mkdir -p "$PROJECT_DIR"
|
||
|
||
# 3. 如果选择 2,执行备份恢复逻辑
|
||
if [ "$choice" == "2" ]; then
|
||
echo "--------------------------------------------------"
|
||
echo "🔄 正在下载并恢复备份数据..."
|
||
echo "下载地址: $BACKUP_URL"
|
||
|
||
# 下载到临时目录
|
||
wget -O /tmp/sublinkx_backup.zip "$BACKUP_URL"
|
||
|
||
echo "正在解压数据..."
|
||
# 解压到临时文件夹以检查结构
|
||
rm -rf /tmp/sublink_restore_temp
|
||
mkdir -p /tmp/sublink_restore_temp
|
||
unzip -o /tmp/sublinkx_backup.zip -d /tmp/sublink_restore_temp
|
||
|
||
# 智能移动数据 (防止压缩包内包含/不包含根文件夹的情况)
|
||
# 如果解压后有一个名为 sublinkx 的文件夹,则移动其内容;否则移动所有内容
|
||
if [ -d "/tmp/sublink_restore_temp/sublinkx" ]; then
|
||
echo "检测到目录嵌套,正在移动内部数据..."
|
||
cp -rf /tmp/sublink_restore_temp/sublinkx/* "$PROJECT_DIR/"
|
||
else
|
||
echo "检测到直接结构,正在移动数据..."
|
||
cp -rf /tmp/sublink_restore_temp/* "$PROJECT_DIR/"
|
||
fi
|
||
|
||
# 清理临时文件
|
||
rm -f /tmp/sublinkx_backup.zip
|
||
rm -rf /tmp/sublink_restore_temp
|
||
|
||
# 确保 plugins 目录存在 (以防备份里没有)
|
||
mkdir -p "$PROJECT_DIR"/plugins
|
||
|
||
echo "✅ 数据恢复完成!"
|
||
echo "--------------------------------------------------"
|
||
else
|
||
# 选项 1 的常规目录创建
|
||
mkdir -p "$PROJECT_DIR"/{db,template,logs}
|
||
fi
|
||
|
||
# 4. 生成 Docker Compose 文件
|
||
if [ "$choice" == "1" ]; then
|
||
echo "正在生成 SublinkX (jaaksi) 配置文件..."
|
||
cat > "$COMPOSE_FILE" << 'EOF'
|
||
version: '3.8'
|
||
services:
|
||
sublinkx:
|
||
image: jaaksi/sublinkx:latest
|
||
container_name: sublinkx
|
||
ports:
|
||
- "8000:8000"
|
||
volumes:
|
||
- ./db:/app/db
|
||
- ./template:/app/template
|
||
- ./logs:/app/logs
|
||
environment:
|
||
- TZ=Asia/Shanghai
|
||
restart: unless-stopped
|
||
networks:
|
||
- sublinkx-network
|
||
|
||
networks:
|
||
sublinkx-network:
|
||
driver: bridge
|
||
EOF
|
||
|
||
elif [ "$choice" == "2" ]; then
|
||
echo "正在生成 SublinkE (eun1e) 配置文件..."
|
||
cat > "$COMPOSE_FILE" << 'EOF'
|
||
version: '3.8'
|
||
services:
|
||
sublinke:
|
||
image: eun1e/sublinke
|
||
container_name: sublinke
|
||
ports:
|
||
- "8000:8000"
|
||
volumes:
|
||
- ./db:/app/db
|
||
- ./template:/app/template
|
||
- ./logs:/app/logs
|
||
- ./plugins:/app/plugins
|
||
environment:
|
||
- TZ=Asia/Shanghai
|
||
restart: unless-stopped
|
||
networks:
|
||
- sublinkx-network
|
||
|
||
networks:
|
||
sublinkx-network:
|
||
driver: bridge
|
||
EOF
|
||
else
|
||
echo "输入错误,脚本退出。"
|
||
exit 1
|
||
fi
|
||
|
||
# 5. 启动服务
|
||
cd "$PROJECT_DIR"
|
||
echo "正在启动容器..."
|
||
docker compose up -d
|
||
|
||
# 6. 检查状态
|
||
echo "等待服务初始化..."
|
||
sleep 5
|
||
SERVER_IP=$(hostname -I | awk '{print $1}')
|
||
|
||
echo "=================================================="
|
||
if docker compose ps | grep -q "Up"; then
|
||
echo "✅ 部署成功!"
|
||
if [ "$choice" == "2" ]; then
|
||
echo "模式: SublinkE (已恢复备份)"
|
||
else
|
||
echo "模式: SublinkX (全新安装)"
|
||
fi
|
||
echo "访问地址: http://${SERVER_IP}:8000"
|
||
echo "数据位置: $PROJECT_DIR"
|
||
echo "=================================================="
|
||
else
|
||
echo "❌ 启动失败,请运行以下命令查看日志:"
|
||
echo "cd $PROJECT_DIR && docker compose logs"
|
||
fi
|