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