diff --git a/试验用脚本 b/试验用脚本 index a5cb89f..65b84c8 100644 --- a/试验用脚本 +++ b/试验用脚本 @@ -1,8 +1,10 @@ -cat > r2-auto-setup.sh << 'EOF' +cat > instant-r2-setup.sh << 'EOF' #!/bin/bash -# Cloudflare R2 一键配置脚本 -R2_SETUP_VERSION="1.0" +# Cloudflare R2 一步到位配置脚本 +echo "========================================" +echo " Cloudflare R2 一键配置脚本" +echo "========================================" # 颜色定义 RED='\033[0;31m' @@ -11,109 +13,32 @@ YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' -# 日志函数 -log() { - echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" -} +log() { echo -e "${GREEN}[✓]${NC} $1"; } +warn() { echo -e "${YELLOW}[!]${NC} $1"; } +error() { echo -e "${RED}[✗]${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 -} +# 使用你提供的固定信息 +REMOTE_NAME="r2-storage" +ACCOUNT_ID="c5F-lD9CfUvvI5wNsepuS-ghXU_exa0bgiwBgM_h" +ACCESS_KEY="1204a46f27d9490d0fa37f928d6680a4" +SECRET_KEY="54f24822de0265d98e8c2507d40250ba5254426b4c3b6a6745d5e688c832ac90" +ENDPOINT="https://bb6985de87fb012b3c626aa13eda6797.r2.cloudflarestorage.com" # 安装 rclone install_rclone() { if command -v rclone &> /dev/null; then - log "rclone 已安装,版本: $(rclone version | head -1)" + log "rclone 已安装" 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 +# 自动配置 R2 configure_r2() { log "配置 Cloudflare R2..." - # 删除已存在的配置 + # 删除旧配置 rclone config delete "$REMOTE_NAME" --quiet > /dev/null 2>&1 # 创建新配置 @@ -127,7 +52,8 @@ configure_r2() { --non-interactive if [ $? -eq 0 ]; then - log "✓ R2 配置成功" + log "R2 配置成功" + return 0 else error "R2 配置失败" return 1 @@ -136,226 +62,112 @@ configure_r2() { # 测试配置 test_configuration() { - log "测试 R2 连接..." + log "测试连接..." - # 测试存储桶访问 - if rclone lsd "$REMOTE_NAME":"$BUCKET_NAME" > /dev/null 2>&1; then - log "✓ 存储桶访问测试成功" + # 先尝试列出存储桶 + if rclone lsd "$REMOTE_NAME": &>/dev/null; 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 + warn "基础连接测试失败,尝试创建测试存储桶..." + + # 创建测试存储桶 + TEST_BUCKET="test-bucket-$(date +%s)" + if rclone mkdir "$REMOTE_NAME:$TEST_BUCKET" &>/dev/null; then + log "测试存储桶创建成功" + # 上传测试文件 + echo "R2 Test File - $(date)" > /tmp/r2-test.txt + if rclone copy /tmp/r2-test.txt "$REMOTE_NAME:$TEST_BUCKET/" &>/dev/null; then + log "文件上传测试成功" + rm -f /tmp/r2-test.txt + # 清理测试存储桶 + rclone purge "$REMOTE_NAME:$TEST_BUCKET" &>/dev/null + rclone rmdir "$REMOTE_NAME:$TEST_BUCKET" &>/dev/null + return 0 + fi fi + + error "配置测试失败" + return 1 } -# 创建管理脚本 -create_management_scripts() { +# 创建使用脚本 +create_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" +SOURCE="${2:-/opt/1panel}" +BACKUP_FILE="/tmp/backup-$(date +%Y%m%d_%H%M%S).tar.gz" -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 "备份完成" +echo "备份: $SOURCE → R2:$BUCKET" +tar -czf "$BACKUP_FILE" -C "$SOURCE" . && \ +rclone copy "$BACKUP_FILE" "$REMOTE:$BUCKET/backups/" && \ +echo "备份成功: $(basename $BACKUP_FILE)" && \ +rm -f "$BACKUP_FILE" SCRIPTEOF # 管理脚本 cat > r2-manage.sh << 'MANAGEEOF' #!/bin/bash - REMOTE="r2-storage" -BUCKET="${1}" -COMMAND="${2}" -ARG1="${3}" -ARG2="${4}" +BUCKET="$1" +CMD="$2" -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 - ;; +case "$CMD" in + "list") rclone lsd "$REMOTE:$BUCKET" ;; + "ls") rclone ls "$REMOTE:$BUCKET" ;; + "mkdir") rclone mkdir "$REMOTE:$BUCKET/$3" ;; + "upload") rclone copy "$3" "$REMOTE:$BUCKET/" ;; + "download") rclone copy "$REMOTE:$BUCKET/$3" "./" ;; + *) echo "用法: $0 " ;; 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 "✓ 管理脚本创建完成" + chmod +x r2-backup.sh r2-manage.sh } # 显示完成信息 -show_success() { +show_complete() { echo - echo -e "${GREEN}" echo "========================================" echo " 配置完成!" echo "========================================" - echo -e "${NC}" echo - info "配置信息:" - echo " - 远程名称: $REMOTE_NAME" - echo " - 存储桶: $BUCKET_NAME" - echo " - Endpoint: $ENDPOINT" + echo "远程名称: $REMOTE_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 "常用命令:" + echo " rclone lsd $REMOTE_NAME: # 列出存储桶" + echo " ./r2-backup.sh my-bucket /opt/1panel # 备份目录" + echo " ./r2-manage.sh my-bucket list # 管理文件" echo - warn "安全提醒: 请妥善保管 API 密钥!" + echo "现在你可以:" + echo "1. 在 Cloudflare 控制台创建存储桶" + echo "2. 使用上面的命令进行备份" echo } -# 主函数 +# 主流程 main() { - show_banner - check_system install_rclone - get_user_input if configure_r2 && test_configuration; then - create_management_scripts - show_success + create_scripts + show_complete else - error "配置失败,请检查输入信息" - exit 1 + error "自动配置失败" + echo "请检查:" + echo "1. 网络连接" + echo "2. API 密钥权限" + echo "3. 存储桶是否已创建" fi } -# 运行主函数 -main "$@" +main EOF -# 给脚本执行权限并运行 -chmod +x r2-auto-setup.sh && ./r2-auto-setup.sh +chmod +x instant-r2-setup.sh && ./instant-r2-setup.sh