Update 试验用脚本

This commit is contained in:
2025-11-02 23:44:51 +08:00
committed by GitHub
parent 20e8395a9e
commit 553ed9035b

View File

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