318 lines
9.3 KiB
Plaintext
318 lines
9.3 KiB
Plaintext
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 <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 "用法: $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"
|