跳转到内容

Using DigitalOcean Spaces or Amazon S3 for file storage 2.4.1

(0 条评价)

1 Screenshot

XenForo 版本兼容性

下载仅与 XenForo 2.1 和 XenForo 2.2 兼容。按照指南操作可支持 XenForo 2.3,但不再需要附加到此资源的下载。

为什么要使用本指南?

自 XenForo 2.0.0 以来,我们使用名为 Flysystem 的抽象文件系统支持远程文件存储。它被称为抽象文件系统,因为它在代码和文件系统之间添加了一个抽象层。这意味着它为执行文件系统操作提供了一致的 API,以便无论文件系统是基于本地磁盘的文件系统还是分布式和远程可访问的文件系统,我们的代码都会调用相同的函数,而 Flysystem 会处理剩下的事情。

虽然这很有用,但它并不是最明显或最直接的设置,所以本指南和随附的附加组件将有所帮助。

因此,如果您打算使用XF 2.1 或更高版本中的视频上传功能,并且您担心增加磁盘空间需求,这将有所帮助。


使所需文件可用

虽然您可以自行下载文件并设置自动加载器之类的东西,但您可能更愿意只下载附加到此资源的附加组件。您可以按照通常的方式安装该附加组件


开始之前

如果您要在现有站点上进行设置,则需要手动移动现有文件。最后有一节介绍此内容。 移动现有文件、进行设置和测试时,我们建议您先关闭论坛。


设置 DigitalOcean Spaces

我们将首先介绍这一点,因为它是最简单的设置方法。如果您更喜欢使用 Amazon S3,请跳至下面的设置 Amazon S3部分。

  1. 前往DigitalOcean Cloud页面并注册或登录。

  2. 此时,如果您是 DigitalOcean 的新用户,您可能需要设置计费。

  3. 您现在可以创建一个新项目。

  4. 单击“开始使用 Spaces”链接。

  5. 选择您的数据中心区域(我选择了阿姆斯特丹)。

  6. 保持“限制文件列表”处于选中状态。

  7. 选择一个唯一的名称(我选择了“xftest”)

  8. 点击“创建空间”

现在空间已创建,您应该有一个端点 URL,类似于:https://xftest.ams3.digitaloceanspaces.com。记下来以备后用。

现在我们需要创建一些 API 凭证。具体操作如下:

  1. 单击左侧边栏中的“管理”。

  2. 点击“API”。

  3. 在“空间访问密钥”部分单击“生成新密钥”。

  4. 输入密钥的名称(再次,我选择了“xftest”)并保存。

这将为您提供一个密钥和一个密码。记下来。

配置 XF 以使用 DigitalOcean Spaces

现在我们需要配置 XF 以使用 DigitalOcean Spaces 进行文件存储。我们将从通常data首先放入目录中的内容开始。这通常包括附件缩略图和头像。

打开您的src/config.php文件。

首先,我们需要配置 Amazon S3 客户端(DigitalOcean Spaces API 与 Amazon AWS SDK 兼容)。

我们将使用 来完成此操作,closure以便我们可以重复使用相同的代码,并且只需输入一次:

PHP:

$s3 = function(){
   return new \Aws\S3\S3Client([
      'credentials' => [
         'key' => 'ABC',
         'secret' => '123'
      ],
      'region' => 'ams3',
      'version' => 'latest',
      'endpoint' => 'https://ams3.digitaloceanspaces.com'
   ]);};


请注意,keysecret是您之前设置“Spaces 访问密钥”后记下的内容。可以从您之前记下的端点 URL 推断出来。它是URL 中region第一个字母后面的部分,在我的情况下是。是相同的端点 URL 减去您选择的唯一名称。 接下来,我们需要设置实际的 Flysystem 适配器以使用 S3 客户端:.ams3endpoint


PHP:

$config['fsAdapters']['data'] = function() use($s3){
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');};


最后,我们需要确保头像和附件缩略图 URL 的前缀是正确的。这需要你之前记下的端点 URL:

PHP:

$config['externalDataUrl'] = function($externalPath, $canonical){
   return 'https://xftest.ams3.digitaloceanspaces.com/data/' . $externalPath;};


此时,一切应该都正常上传了。如果您发现头像和缩略图丢失,请不要惊慌;如果您有现有文件,则需要手动迁移,我们稍后会讲解。

首先,我们需要测试配置是否正常工作。只需上传一个新的头像即可。该头像现在将被存储并远程服务!

如果您现在查看您的 DigitalOcean Spaces 帐户,您应该会看到已创建包含新头像的新文件夹:

187981


现在我们还需要添加对internal_data目录的支持。通常,这些目录指的是附件和其他应该设置为“私有”的内容。回到 config.php 文件,要添加的代码非常类似:

PHP:

$config['fsAdapters']['internal-data'] = function() use($s3){
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');};


现在尝试将附件上传到帖子,与之前类似,您现在应该可以在 Spaces 文件浏览器中看到其他文件和文件夹。


设置 Amazon S3

  1. 转到AWS 管理控制台页面并注册或登录。

  2. 在“AWS 服务”部分输入“S3”以转到“S3 控制台”。

  3. 点击“创建存储桶”。

  4. 选择一个存储桶名称(我选择了 xftest)。

  5. 选择一个地区(我选择了欧盟伦敦)。

  6. 接受任何其他默认选项,直到存储桶创建完成。

  7. 现在您需要转到“IAM”控制台。

  8. 点击“添加用户”。

  9. 选择一个用户名(是的,我再次使用了

  10. 将访问类型设置为“程序化”。

  11. 要设置权限,请单击“直接附加现有策略”选项卡,然后单击“创建策略”按钮。

  12. IAM 以及各种策略和权限可能相当复杂。我们可以让它变得简单一些,尽管您可能有不同的需求。此页面上有一个名为“JSON”的选项卡。将以下内容粘贴到其中,并替换YOUR-BUCKET-NAME为您之前选择的存储桶名称:

JSON:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:putObject",
                "s3:putObjectAcl",
                "s3:ReplicateObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME",
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        }
    ]}
  1. 单击“审查政策”并命名并保存。

  2. 回到上一个“添加用户”页面,点击“刷新”按钮,搜索刚刚创建的策略。

  3. 单击“下一步”,然后单击“创建用户”。

这将为您提供一个密钥和一个密码。记下来。


配置 XF 以使用 Amazon S3

现在我们需要配置 XF 以使用 Amazon S3 进行文件存储。我们将从通常data首先放入目录中的内容开始。这通常包括附件缩略图和头像。

打开您的src/config.php文件。

我们将使用 来执行此操作,closure以便我们可以重复使用相同的代码,并且只需输入一次:

PHP:

$s3 = function(){
   return new \Aws\S3\S3Client([
      'credentials' => [
         'key' => 'ABC',
         'secret' => '123'
      ],
      'region' => 'eu-west-2',
      'version' => 'latest',
      'endpoint' => 'https://s3.eu-west-2.amazonaws.com'
   ]);};


请注意,keysecret是你之前设置 IAM 用户后记下的内容。region可以从 S3 端点 URL 推断出来。

接下来,我们需要设置实际的 Flysystem 适配器来使用 S3 客户端:

PHP:

$config['fsAdapters']['data'] = function() use($s3){
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');};


最后,我们需要确保头像和附件缩略图 URL 前面添加了正确的 URL:

PHP:

$config['externalDataUrl'] = function($externalPath, $canonical){
   return 'https://xftest.s3.eu-west-2.amazonaws.com/data/' . $externalPath;};


此时,一切应该都正常上传了。如果您发现头像和缩略图丢失,请不要惊慌;如果您有现有文件,则需要手动迁移,我们稍后会讲解。

首先,我们需要测试配置是否正常工作。只需上传一个新的头像即可。该头像现在将被远程存储和使用!

现在,如果您查看存储桶文件浏览器,应该会看到已创建包含新头像的新文件夹:

187995



成功了!

现在我们还需要添加对internal_data目录的支持。通常,这些目录指的是附件和其他应该设置为“私有”的内容。回到 config.php 文件,要添加的代码非常类似:

PHP:

$config['fsAdapters']['internal-data'] = function() use($s3){
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');};


现在尝试将附件上传到帖子,和以前一样,您应该在存储桶文件浏览器中看到其他文件和文件夹。


将现有文件移动到 DigitalOcean Spaces 或 Amazon S3

因此,您现在拥有远程托管的文件。至少从现在开始是这样。但是您现有的所有文件怎么办?

值得庆幸的是,有几种方法可以与 Spaces 和 S3 交互,从而非常轻松地移动现有内容。虽然这是一次性操作,但根据文件的数量和大小,可能会花费大量时间。

有几种方法可以管理这个过程,但可以说最好的方法是使用名为s3cmd的工具,这是一种流行的跨平台命令行工具,用于管理 S3 和与 S3 兼容的对象存储。

无论您使用 Spaces 还是 S3,都可以s3cmd在服务器上安装该工具并运行命令将文件复制到新位置。

我不会重复已经写过的内容,而是向您提供来自 DigitalOcean 的以下指南,其中介绍了如何使用 s3cmd 迁移现有文件。

s3cmd 2.x 设置 :: DigitalOcean 产品文档

s3cmd 是一款流行的跨平台命令行工具,用于管理 S3 及兼容 S3 的对象存储。要使用 s3cmd,您需要:s3cmd 2.0.0 或更高版本。您可以使用 s3cmd --version 命令检查您的版本。软件包管理器提供的版本可能已过期,因此我们建议您使用 s3cmd...

www.digitalocean.com


注意:复制现有数据文件时,需要将其设置为公开。您可以在复制时将 ACL 设置为公开:

s3cmd 2.x 与 DigitalOcean Spaces 结合使用的示例 :: DigitalOcean 文档

使用 Spaces 执行常见操作的 s3cmd 命令示例,例如上传和管理文件、设置权限和加密。

版本 2.4.1 的新内容

查看变更日志

发布于

此版本没有可用的变更日志。

用户反馈

没有评价可显示。

重要信息

使用条款 隐私政策 指南 我们在您的设备上放置了cookies,以帮助改善本网站。您可以调整您的 cookie 设置,否则我们将假定您可以继续使用。