cat > r2-auto-setup.sh << 'EOF' #!/bin/bash # Cloudflare R2 一键配置脚本 R2_SETUP_VERSION="1.0" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } warn() { echo -e "${YELLOW}[警告]${NC} $1" } error() { echo -e "${RED}[错误]${NC} $1" } info() { echo -e "${BLUE}[信息]${NC} $1" } # 显示横幅 show_banner() { clear echo -e "${GREEN}" echo "================================================" echo " Cloudflare R2 一键配置脚本 v$R2_SETUP_VERSION" echo "================================================" echo -e "${NC}" } # 检查系统 check_system() { log "检查系统环境..." # 检查 curl if ! command -v curl &> /dev/null; then error "curl 未安装,正在安装..." apt-get update && apt-get install -y curl || yum install -y curl fi # 检查 unzip if ! command -v unzip &> /dev/null; then warn "unzip 未安装,正在安装..." apt-get install -y unzip || yum install -y unzip fi } # 安装 rclone install_rclone() { if command -v rclone &> /dev/null; then log "rclone 已安装,版本: $(rclone version | head -1)" return 0 fi log "安装 rclone..." curl -s https://rclone.org/install.sh | sudo bash > /dev/null 2>&1 if command -v rclone &> /dev/null; then log "✓ rclone 安装成功" else error "rclone 安装失败" exit 1 fi } # 获取用户输入 get_user_input() { echo info "请提供 Cloudflare R2 配置信息:" echo read -p "请输入配置名称 [默认: r2-storage]: " REMOTE_NAME REMOTE_NAME=${REMOTE_NAME:-r2-storage} read -p "请输入 Account ID: " ACCOUNT_ID while [ -z "$ACCOUNT_ID" ]; do error "Account ID 不能为空" read -p "请输入 Account ID: " ACCOUNT_ID done read -p "请输入 Access Key ID: " ACCESS_KEY while [ -z "$ACCESS_KEY" ]; do error "Access Key ID 不能为空" read -p "请输入 Access Key ID: " ACCESS_KEY done read -p "请输入 Secret Access Key: " SECRET_KEY while [ -z "$SECRET_KEY" ]; do error "Secret Access Key 不能为空" read -p "请输入 Secret Access Key: " SECRET_KEY done read -p "请输入存储桶名称: " BUCKET_NAME while [ -z "$BUCKET_NAME" ]; do error "存储桶名称不能为空" read -p "请输入存储桶名称: " BUCKET_NAME done ENDPOINT="https://${ACCOUNT_ID}.r2.cloudflarestorage.com" } # 配置 R2 configure_r2() { log "配置 Cloudflare R2..." # 删除已存在的配置 rclone config delete "$REMOTE_NAME" --quiet > /dev/null 2>&1 # 创建新配置 rclone config create "$REMOTE_NAME" s3 \ provider Cloudflare \ access_key_id "$ACCESS_KEY" \ secret_access_key "$SECRET_KEY" \ endpoint "$ENDPOINT" \ region auto \ acl private \ --non-interactive if [ $? -eq 0 ]; then log "✓ R2 配置成功" else error "R2 配置失败" return 1 fi } # 测试配置 test_configuration() { log "测试 R2 连接..." # 测试存储桶访问 if rclone lsd "$REMOTE_NAME":"$BUCKET_NAME" > /dev/null 2>&1; then log "✓ 存储桶访问测试成功" return 0 fi # 尝试创建测试目录 warn "存储桶访问失败,尝试创建测试目录..." if rclone mkdir "$REMOTE_NAME":"$BUCKET_NAME"/r2-test > /dev/null 2>&1; then log "✓ 目录创建测试成功" rclone rmdir "$REMOTE_NAME":"$BUCKET_NAME"/r2-test > /dev/null 2>&1 return 0 else error "配置测试失败" warn "请检查:" warn "1. 存储桶名称是否正确" warn "2. API 密钥权限是否足够" warn "3. 网络连接是否正常" return 1 fi } # 创建管理脚本 create_management_scripts() { log "创建管理脚本..." # 备份脚本 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" LOG_FILE="/var/log/r2-backup.log" log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" echo "$1" } log "开始备份到 Cloudflare R2" # 检查源目录 if [ ! -d "$BACKUP_SOURCE" ]; then log "错误: 源目录不存在: $BACKUP_SOURCE" exit 1 fi # 创建备份 log "创建备份文件: $BACKUP_FILE" tar -czf "$BACKUP_FILE" -C "$BACKUP_SOURCE" . 2>/dev/null if [ $? -ne 0 ]; then log "错误: 备份文件创建失败" exit 1 fi # 上传到 R2 log "上传到 Cloudflare R2..." rclone copy "$BACKUP_FILE" "$REMOTE:$BUCKET/backups/" if [ $? -eq 0 ]; then log "✓ 备份成功: ${BACKUP_PREFIX}_${DATE}.tar.gz" rm -f "$BACKUP_FILE" else log "错误: 上传到 R2 失败" exit 1 fi log "备份完成" SCRIPTEOF # 管理脚本 cat > r2-manage.sh << 'MANAGEEOF' #!/bin/bash REMOTE="r2-storage" BUCKET="${1}" COMMAND="${2}" ARG1="${3}" ARG2="${4}" show_help() { echo "Cloudflare R2 管理脚本" echo "用法: $0 <存储桶> <命令> [参数]" echo echo "命令:" echo " list 列出存储桶内容" echo " ls 列出所有文件" echo " size 显示存储桶大小" echo " mkdir <目录名> 创建目录" echo " upload <文件> [路径] 上传文件" echo " download <文件> [路径] 下载文件" echo " delete <文件> 删除文件" echo " sync <本地路径> 同步目录" echo echo "示例:" echo " $0 my-bucket list" echo " $0 my-bucket upload file.txt" echo " $0 my-bucket mkdir backups" } if [ -z "$BUCKET" ] || [ -z "$COMMAND" ]; then show_help exit 1 fi case "$COMMAND" in "list") rclone lsd "$REMOTE:$BUCKET" ;; "ls") rclone ls "$REMOTE:$BUCKET" ;; "size") rclone size "$REMOTE:$BUCKET" ;; "mkdir") if [ -z "$ARG1" ]; then echo "错误: 请指定目录名" exit 1 fi rclone mkdir "$REMOTE:$BUCKET/$ARG1" ;; "upload") if [ -z "$ARG1" ]; then echo "错误: 请指定要上传的文件" exit 1 fi REMOTE_PATH="${ARG2:-/}" rclone copy "$ARG1" "$REMOTE:$BUCKET$REMOTE_PATH" ;; "download") if [ -z "$ARG1" ]; then echo "错误: 请指定要下载的文件" exit 1 fi LOCAL_PATH="${ARG2:-./}" rclone copy "$REMOTE:$BUCKET/$ARG1" "$LOCAL_PATH" ;; "delete") if [ -z "$ARG1" ]; then echo "错误: 请指定要删除的文件" exit 1 fi rclone delete "$REMOTE:$BUCKET/$ARG1" ;; "sync") if [ -z "$ARG1" ]; then echo "错误: 请指定本地路径" exit 1 fi rclone sync "$ARG1" "$REMOTE:$BUCKET/" ;; *) show_help ;; esac MANAGEEOF # 快速测试脚本 cat > r2-test.sh << 'TESTEOF' #!/bin/bash echo "测试 Cloudflare R2 连接..." rclone lsd r2-storage: echo echo "测试完成" TESTEOF chmod +x r2-backup.sh r2-manage.sh r2-test.sh log "✓ 管理脚本创建完成" } # 显示完成信息 show_success() { echo echo -e "${GREEN}" echo "========================================" echo " 配置完成!" echo "========================================" echo -e "${NC}" echo info "配置信息:" echo " - 远程名称: $REMOTE_NAME" echo " - 存储桶: $BUCKET_NAME" echo " - Endpoint: $ENDPOINT" echo info "可用命令:" echo " rclone lsd $REMOTE_NAME: 列出存储桶" echo " rclone ls $REMOTE_NAME:$BUCKET_NAME 列出文件" echo " ./r2-backup.sh 自动备份" echo " ./r2-manage.sh $BUCKET_NAME list 管理存储桶" echo " ./r2-test.sh 快速测试" echo warn "安全提醒: 请妥善保管 API 密钥!" echo } # 主函数 main() { show_banner check_system install_rclone get_user_input if configure_r2 && test_configuration; then create_management_scripts show_success else error "配置失败,请检查输入信息" exit 1 fi } # 运行主函数 main "$@" EOF # 给脚本执行权限并运行 chmod +x r2-auto-setup.sh && ./r2-auto-setup.sh