cat > auto-config-r2.sh << 'EOF' #!/bin/bash # Cloudflare R2 自动配置脚本 echo "========================================" echo " Cloudflare R2 自动配置脚本" echo "========================================" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 检查 rclone 是否安装 check_rclone() { if ! command -v rclone &> /dev/null; then echo -e "${RED}错误: rclone 未安装${NC}" echo "正在安装 rclone..." curl -s https://rclone.org/install.sh | sudo bash > /dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "${RED}rclone 安装失败${NC}" exit 1 fi fi echo -e "${GREEN}✓ rclone 已安装${NC}" } # 显示配置说明 show_instructions() { echo echo -e "${YELLOW}配置说明:${NC}" echo "1. 登录 Cloudflare 控制台 (https://dash.cloudflare.com)" echo "2. 进入 R2 → 你的存储桶" echo "3. 在 'R2 API' 部分找到以下信息:" echo " - Account ID" echo " - Access Key ID" echo " - Secret Access Key" echo "4. 准备好这些信息后继续" echo } # 获取用户输入 get_user_input() { echo -e "${YELLOW}请输入 Cloudflare R2 配置信息:${NC}" read -p "请输入远程配置名称 [默认: r2-storage]: " REMOTE_NAME REMOTE_NAME=${REMOTE_NAME:-r2-storage} read -p "请输入 Account ID: " ACCOUNT_ID while [ -z "$ACCOUNT_ID" ]; do echo -e "${RED}Account ID 不能为空${NC}" read -p "请输入 Account ID: " ACCOUNT_ID done read -p "请输入 Access Key ID: " ACCESS_KEY while [ -z "$ACCESS_KEY" ]; do echo -e "${RED}Access Key ID 不能为空${NC}" read -p "请输入 Access Key ID: " ACCESS_KEY done read -p "请输入 Secret Access Key: " SECRET_KEY while [ -z "$SECRET_KEY" ]; do echo -e "${RED}Secret Access Key 不能为空${NC}" read -p "请输入 Secret Access Key: " SECRET_KEY done read -p "请输入存储桶名称: " BUCKET_NAME while [ -z "$BUCKET_NAME" ]; do echo -e "${RED}存储桶名称不能为空${NC}" read -p "请输入存储桶名称: " BUCKET_NAME done # 构建 endpoint ENDPOINT="https://${ACCOUNT_ID}.r2.cloudflarestorage.com" } # 自动配置 rclone configure_rclone() { echo echo -e "${YELLOW}正在配置 rclone...${NC}" # 使用 rclone config create 非交互式创建 rclone config create "$REMOTE_NAME" s3 \ provider "Other" \ access_key_id "$ACCESS_KEY" \ secret_access_key "$SECRET_KEY" \ endpoint "$ENDPOINT" \ region "auto" \ acl "private" \ --non-interactive if [ $? -eq 0 ]; then echo -e "${GREEN}✓ rclone 配置成功${NC}" echo -e "配置名称: ${YELLOW}$REMOTE_NAME${NC}" else echo -e "${RED}✗ rclone 配置失败${NC}" echo "尝试交互式配置..." interactive_configure fi } # 交互式配置备用方案 interactive_configure() { echo echo -e "${YELLOW}开始交互式配置...${NC}" echo "请按照提示手动输入配置信息:" echo rclone config } # 测试配置 test_configuration() { echo echo -e "${YELLOW}正在测试配置...${NC}" # 测试列出存储桶 echo "1. 测试连接性..." if rclone lsd "$REMOTE_NAME": 2>/dev/null; then echo -e "${GREEN}✓ 连接测试成功${NC}" else echo -e "${YELLOW}⚠ 无法列出所有存储桶,尝试访问指定存储桶...${NC}" fi # 测试访问指定存储桶 echo "2. 测试存储桶访问..." if rclone lsd "$REMOTE_NAME":"$BUCKET_NAME" 2>/dev/null; then echo -e "${GREEN}✓ 存储桶访问测试成功${NC}" return 0 else # 尝试创建目录测试 echo "3. 创建测试目录..." if rclone mkdir "$REMOTE_NAME":"$BUCKET_NAME"/test-connection 2>/dev/null; then echo -e "${GREEN}✓ 目录创建测试成功${NC}" # 清理测试目录 rclone rmdir "$REMOTE_NAME":"$BUCKET_NAME"/test-connection 2>/dev/null return 0 else echo -e "${RED}✗ 配置测试失败${NC}" echo -e "${YELLOW}可能的原因:${NC}" echo " - API 密钥不正确" echo " - 存储桶名称错误" echo " - API 令牌权限不足" echo " - 网络连接问题" return 1 fi fi } # 创建管理脚本 create_management_scripts() { # 创建备份脚本 cat > r2-backup.sh << 'SCRIPTEOF' #!/bin/bash # Cloudflare R2 自动备份脚本 REMOTE="r2-storage" BUCKET="${1:-default-bucket}" BACKUP_SOURCE="${2:-/opt/1panel}" BACKUP_PREFIX="backup" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="/tmp/${BACKUP_PREFIX}_${DATE}.tar.gz" echo "[$(date)] 开始备份到 Cloudflare R2" echo "备份源: $BACKUP_SOURCE" echo "目标: $REMOTE:$BUCKET/backups/" # 检查源目录 if [ ! -d "$BACKUP_SOURCE" ]; then echo "错误: 源目录不存在: $BACKUP_SOURCE" exit 1 fi # 创建备份 echo "创建备份文件..." tar -czf "$BACKUP_FILE" -C "$BACKUP_SOURCE" . 2>/dev/null if [ $? -ne 0 ]; then echo "错误: 备份文件创建失败" exit 1 fi # 上传到 R2 echo "上传到 Cloudflare R2..." rclone copy "$BACKUP_FILE" "$REMOTE:$BUCKET/backups/" if [ $? -eq 0 ]; then echo "✓ 备份成功: ${BACKUP_PREFIX}_${DATE}.tar.gz" # 清理本地备份文件 rm -f "$BACKUP_FILE" # 显示备份信息 echo "备份位置: $REMOTE:$BUCKET/backups/${BACKUP_PREFIX}_${DATE}.tar.gz" echo "文件大小: $(du -h "$BACKUP_FILE" 2>/dev/null | cut -f1) (压缩后)" else echo "错误: 上传到 R2 失败" exit 1 fi echo "[$(date)] 备份完成" SCRIPTEOF # 创建管理脚本 cat > r2-manage.sh << 'MANAGEEOF' #!/bin/bash # Cloudflare R2 管理脚本 REMOTE="r2-storage" BUCKET="${1:-default-bucket}" case "$2" in "list") echo "列出存储桶内容:" rclone lsd "$REMOTE:$BUCKET" ;; "ls") echo "列出详细文件:" rclone ls "$REMOTE:$BUCKET" ;; "mkdir") if [ -z "$3" ]; then echo "用法: $0 mkdir <目录名>" exit 1 fi echo "创建目录: $3" rclone mkdir "$REMOTE:$BUCKET/$3" ;; "upload") if [ -z "$3" ]; then echo "用法: $0 upload <本地文件> [远程路径]" exit 1 fi REMOTE_PATH="${4:-/}" echo "上传文件: $3 → $REMOTE:$BUCKET$REMOTE_PATH" rclone copy "$3" "$REMOTE:$BUCKET$REMOTE_PATH" ;; "download") if [ -z "$3" ]; then echo "用法: $0 download <远程文件> [本地路径]" exit 1 fi LOCAL_PATH="${4:-./}" echo "下载文件: $REMOTE:$BUCKET/$3 → $LOCAL_PATH" rclone copy "$REMOTE:$BUCKET/$3" "$LOCAL_PATH" ;; *) echo "Cloudflare R2 管理脚本" echo "用法: $0 <存储桶名称> <命令> [参数]" echo "" echo "命令:" echo " list 列出存储桶内容" echo " ls 列出所有文件" echo " mkdir <目录名> 创建目录" echo " upload <文件> [路径] 上传文件" echo " download <文件> [路径] 下载文件" echo "" echo "示例:" echo " $0 my-bucket list" echo " $0 my-bucket upload backup.tar.gz" echo " $0 my-bucket mkdir backups" ;; esac MANAGEEOF chmod +x r2-backup.sh r2-manage.sh echo -e "${GREEN}✓ 管理脚本已创建${NC}" } # 显示使用说明 show_usage() { echo echo -e "${GREEN}========================================" echo " 配置完成!" echo "========================================" echo echo -e "远程配置名称: ${YELLOW}$REMOTE_NAME${NC}" echo -e "存储桶名称: ${YELLOW}$BUCKET_NAME${NC}" echo -e "Endpoint: ${YELLOW}$ENDPOINT${NC}" echo echo -e "${GREEN}常用命令:${NC}" echo "列出存储桶: ${YELLOW}rclone lsd $REMOTE_NAME:${NC}" echo "列出文件: ${YELLOW}rclone ls $REMOTE_NAME:$BUCKET_NAME${NC}" echo "创建目录: ${YELLOW}rclone mkdir $REMOTE_NAME:$BUCKET_NAME/目录名${NC}" echo "上传文件: ${YELLOW}rclone copy 文件.txt $REMOTE_NAME:$BUCKET_NAME/${NC}" echo "下载文件: ${YELLOW}rclone copy $REMOTE_NAME:$BUCKET_NAME/文件.txt ./${NC}" echo echo -e "${GREEN}使用管理脚本:${NC}" echo "自动备份: ${YELLOW}./r2-backup.sh${NC}" echo "管理存储桶: ${YELLOW}./r2-manage.sh $BUCKET_NAME list${NC}" echo echo -e "${YELLOW}安全提醒: 请妥善保管你的 API 密钥!${NC}" echo "========================================" } # 主函数 main() { check_rclone show_instructions get_user_input configure_rclone if test_configuration; then create_management_scripts show_usage else echo -e "${RED}配置测试失败,请检查输入的信息${NC}" echo "你可以手动运行: rclone config" fi } # 运行主函数 main EOF # 给脚本执行权限 chmod +x auto-config-r2.sh echo "自动配置脚本已创建: auto-config-r2.sh" echo "运行命令开始配置: ./auto-config-r2.sh"