Terence's blog

  • 一、 前言
  • 二、准备工作:获取 Backblaze B2 凭证
  • 三、 核心步骤:修改插件文件
  • 四、 配置插件
  • About Me

修改aaPanel的AWS S3插件以兼容第三方S3 API对象存储(以 Backblaze B2 为例)

  • Terence
  • 2022-09-05
  • 0

一、 前言

宝塔面板(aaPanel)官方的 “AWS S3” 插件默认只支持亚马逊 S3 服务,并未提供自定义 Endpoint(端点)的选项,这导致我们无法直接使用其他兼容 S3 API 的第三方对象存储服务。

Backblaze 是一家知名的云存储提供商,其 B2 Cloud Storage 产品提供了 S3 兼容 API,并且每月有 10GB 的免费存储额度。这个额度对于中小型网站的日常备份来说绰绰有余。

本文将引导你通过修改插件的源代码,使其支持 Backblaze B2,从而实现免费、可靠的异地备份。

二、准备工作:获取 Backblaze B2 凭证

在修改插件之前,你需要先从 Backblaze B2 获取必要的配置信息:

  1. Endpoint URL: 在 B2 创建一个存储桶(Bucket)后,在 “Buckets” 页面找到你的桶,点击桶名,即可看到 S3 Endpoint 地址,例如 s3.us-west-004.backblazeb2.com。
  2. Bucket Name: 你创建的存储桶的名称。
  3. Key ID 和 Application Key: 前往 “Account” -> “App Keys” 页面,生成一个新的 Application Key。请务必记下生成的 keyID 和 applicationKey。

三、 核心步骤:修改插件文件

1.定位文件
使用宝塔面板的文件管理器或 SSH 登录服务器,找到插件的配置文件。路径为:
/www/server/panel/plugin/aws_s3/s3lib/client/aws_s3.py

2.修改代码(建议先备份原文件)
打开 aws_s3.py 文件,搜索定位到 def build_auth(self): 这个方法。在 aws_secret_access_key=self.__secret_key, 这一行(大约在第 101 行)后面,添加一行 endpoint_url 参数,并填入你准备好的 Endpoint URL。

修改前:

session = boto3.session.Session()
client = session.client(
    's3',
    aws_access_key_id=self.__secret_id,
    aws_secret_access_key=self.__secret_key,
    region_name=self.__region
)

修改后(以 B2 us-west为例):

session = boto3.session.Session()
client = session.client(
    's3',
    aws_access_key_id=self.__secret_id,
    aws_secret_access_key=self.__secret_key,
    endpoint_url='https://s3.us-west-004.backblazeb2.com', # <-- 添加此行
    region_name=self.__region
)

3.重启面板
保存文件修改后,在宝塔面板首页或通过 SSH 执行 bt reload 命令来重启面板服务,使修改生效。

四、 配置插件

最后,回到宝塔面板的 AWS S3 插件界面,填写你的 Backblaze B2 信息。对应关系如下:

  • S3密钥ID (secret_id): 填写你的 keyID
  • S3密钥 (secret_key): 填写你的 applicationKey
  • 存储桶名称 (Bucket name): 填写你的 Bucket Name(注意不是 App Key 的名称)
  • 存储路径 (Save Path): 在 Bucket 中用于存放备份的目录,例如 backup/
  • 区域 (Region): 由于我们已硬编码了 Endpoint,此项可随意填写或保持默认。

填写完毕后,点击保存。你可以尝试手动执行一次备份任务,检查文件是否成功上传到你的 Backblaze B2 存储桶中,以验证配置是否成功。


© 2025 Terence's blog
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}