Addon 2x Sử dụng DigitalOcean Spaces hoặc Amazon S3 để lưu trữ tệp trong XF 2.1 & XF 2.2

PVS

Super Moderator
Thành viên BQT
Sử dụng DigitalOcean Spaces hoặc Amazon S3 để lưu trữ tệp trong XF 2.1 & XF 2.2

Khả năng tương thích của phiên bản XenForo


Tải xuống chỉ tương thích với XenForo 2.1 và XenForo 2.2. XenForo 2.3 được hỗ trợ bằng cách làm theo hướng dẫn nhưng không còn cần tải xuống kèm theo tài nguyên này nữa.

Tại sao lại có hướng dẫn này?

Kể từ XenForo 2.0.0, XenForo đã hỗ trợ lưu trữ tệp từ xa bằng hệ thống tệp trừu tượng có tên là Flysystem. Hệ thống này được gọi là hệ thống tệp trừu tượng vì nó thêm một lớp trừu tượng giữa code và hệ thống tệp. Điều đó có nghĩa là nó cung cấp API nhất quán để thực hiện các hoạt động của hệ thống tệp sao cho cho dù hệ thống tệp là hệ thống tệp dựa trên đĩa cục bộ hay hệ thống tệp phân tán và có thể truy cập từ xa, code của XenForo sẽ gọi cùng các hàm và Flysystem sẽ xử lý phần còn lại.

Mặc dù hữu ích nhưng đây không phải là điều hiển nhiên hoặc dễ thiết lập nhất nên hướng dẫn này và add-on đi kèm sẽ giúp ích.

Vì vậy, nếu bạn đang có kế hoạch sử dụng chức năng tải lên video trong XF 2.1 trở lên và lo lắng về yêu cầu tăng dung lượng đĩa thì điều này sẽ giúp ích.


Làm cho các tệp cần thiết có sẵn

Mặc dù bạn có thể tải xuống các tệp và tự thiết lập các thứ như trình tải tự động, nhưng có lẽ bạn sẽ thích tải xuống tiện ích bổ sung được đính kèm vào tài nguyên này. Bạn có thể cài đặt add-on theo cách thông thường .


Trước khi bắt đầu

Nếu bạn đang thiết lập điều này trên một trang web hiện có, bạn sẽ cần phải di chuyển thủ công các tệp hiện có của mình. Có một phần về điều đó ở cuối. Trong khi bạn đang di chuyển các tệp hiện có, thiết lập mọi thứ và thử nghiệm, khuyên bạn nên đóng diễn đàn trước.


Thiết lập DigitalOcean Spaces

Đề cập đến điều này trước vì đây là cách thiết lập đơn giản nhất. Nếu bạn muốn sử dụng Amazon S3, hãy bỏ qua và đến phần Thiết lập Amazon S3 bên dưới.
  1. Truy cập trang DigitalOcean Cloud và đăng ký hoặc đăng nhập.
  2. Tại thời điểm này, nếu bạn mới sử dụng DigitalOcean, bạn có thể cần phải thiết lập thanh toán.
  3. Bây giờ bạn có thể tạo một dự án mới.
  4. Nhấp vào liên kết "Start using Spaces".
  5. Chọn khu vực trung tâm dữ liệu của bạn (Tôi chọn Amsterdam).
  6. Để nguyên mục "Restrict File Listing".
  7. Chọn một tên duy nhất (tôi đã chọn "xftest")
  8. Nhấp vào "Create a space"
Bây giờ không gian đã được tạo, bạn sẽ có một URL điểm cuối, tương tự như: https://xftest.ams3.digitaloceanspaces.com. Lưu lại điều này để sử dụng sau.

Bây giờ chúng ta cần tạo một số thông tin xác thực API. Để thực hiện việc này:
  1. Nhấp vào "Manage" ở sidebar trái.
  2. Nhấp vào "API".
  3. Trong phần "Spaces access keys", hãy nhấp vào "Generate New Key".
  4. Nhập tên cho key (Tôi vẫn chọn "xftest") và lưu.
Thao tác này sẽ cung cấp cho bạn một key và một secret. Lưu lại chúng.

Cấu hình XF để sử dụng DigitalOcean Spaces

Bây giờ chúng ta cần cấu hình XF để sử dụng DigitalOcean Spaces để lưu trữ tệp. Chúng ta sẽ bắt đầu với những gì thường được đưa vào thư mục data trước. Thông thường, những thứ này bao gồm hình thu nhỏ và ảnh đại diện đính kèm.

Mở tệp src/config.php của bạn.

Trước tiên, chúng ta cần cấu hình client Amazon S3 (API DigitalOcean Spaces tương thích với Amazon AWS SDK).

Chúng ta sẽ thực hiện việc này bằng cách sử dụng a closure để có thể sử dụng lại cùng một code và chúng ta chỉ phải nhập code đó một lần:
PHP:
$s3 = function()
{
   return new \Aws\S3\S3Client([
      'credentials' => [
         'key' => 'ABC',
         'secret' => '123'
      ],
      'region' => 'ams3',
      'version' => 'latest',
      'endpoint' => 'https://ams3.digitaloceanspaces.com'
   ]);
};

Lưu ý rằng keysecret là những gì bạn đã ghi chú sau khi thiết lập "Spaces access key" trước đó. region có thể suy ra từ URL điểm cuối mà bạn đã ghi chú trước đó. Đó là phần sau phần . đầu tiên trong URL, trong trường hợp của tôi là ams3. endpoint là cùng một URL điểm cuối trừ đi tên duy nhất mà bạn đã chọn.

Tiếp theo, chúng ta cần thiết lập bộ điều hợp Flysystem thực tế để sử dụng client S3:
PHP:
$config['fsAdapters']['data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');
};

Cuối cùng, chúng ta cần đảm bảo rằng URL hình đại diện và hình thu nhỏ đính kèm được thêm vào trước URL chính xác. Điều này yêu cầu URL điểm cuối mà bạn đã ghi chú trước đó, một lần nữa:
PHP:
$config['externalDataUrl'] = function($externalPath, $canonical)
{
   return 'https://xftest.ams3.digitaloceanspaces.com/data/' . $externalPath;
};

Vào thời điểm này, mọi thứ sẽ hoạt động theo hướng tải lên mới. Đừng lo lắng nếu bạn nhận thấy ảnh đại diện và ảnh thu nhỏ bị thiếu; nếu bạn có các tệp hiện có, bạn sẽ cần di chuyển chúng theo cách thủ công, chúng ta sẽ xem xét sau.

Trước tiên, chúng ta cần kiểm tra xem cấu hình có hoạt động không. Chỉ cần tải lên một ảnh đại diện mới. Ảnh đại diện sẽ được lưu trữ và phục vụ từ xa!

Nếu bạn kiểm tra tài khoản DigitalOcean Spaces của mình ngay bây giờ, bạn sẽ thấy các thư mục mới đã được tạo có chứa ảnh đại diện mới của bạn:

cloud.digitalocean.com_spaces_xftest_i=3f9b71&path=data_avatars_o_0_.webp

Thành công! Nhưng chúng ta chỉ mới đi được nửa chặng đường!

Bây giờ chúng ta cần thêm hỗ trợ cho cả thư mục internal_data nữa. Nói chung, đây là các tệp đính kèm và bất kỳ thứ gì khác cần "private". Quay lại config.php và code cần thêm rất giống nhau:
PHP:
$config['fsAdapters']['internal-data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');
};

Bây giờ hãy thử tải tệp đính kèm lên bài đăng và giống như trước, giờ bạn sẽ thấy các tệp và thư mục bổ sung trong trình duyệt tệp Spaces của mình.


Thiết lập Amazon S3
  1. Truy cập trang AWS Management Console và đăng ký hoặc đăng nhập.
  2. Trong phần "AWS services", nhập phần "S3" để chuyển đến "S3 Console".
  3. Nhấp vào "Create bucket".
  4. Chọn tên bucket (tôi chọn xftest).
  5. Chọn một khu vực (Tôi đã chọn EU London).
  6. Chấp nhận mọi tùy chọn mặc định khác cho đến khi bucket được tạo.
  7. Bây giờ bạn cần phải vào bảng điều khiển "IAM".
  8. Nhấp vào "Add user".
  9. Chọn tên người dùng (vâng, tôi lại sử dụng xftest ).
  10. Đặt loại quyền truy cập thành "Programmatic".
  11. Để thiết lập quyền, hãy nhấp vào tab "Attach existing policies directly" rồi nhấp vào nút "Create policy".
  12. IAM và các chính sách và quyền khác nhau có thể khá khó khăn. Chúng tôi có thể giúp bạn dễ dàng hơn một chút, mặc dù bạn có thể có các yêu cầu khác. Trên trang này có một tab có tên là "JSON". Dán nội dung sau vào đó, thay thế YOUR-BUCKET-NAME bằng tên bucket bạn đã chọn trước đó:
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. Nhấp vào "Review policy", đặt tên và lưu.
  2. Quay lại trang "Add user" trước đó, nhấp vào nút "Refresh" và tìm kiếm chính sách bạn vừa tạo.
  3. Nhấp vào "Next", sau đó nhấp vào "Create user".
Điều này sẽ cung cấp cho bạn một key và một secret. Lưu lại chúng.


Cấu hình XF để sử dụng Amazon S3

Bây giờ chúng ta cần cấu hình XF để sử dụng Amazon S3 để lưu trữ tệp. Chúng ta sẽ bắt đầu với những gì thường được đưa vào thư mục data trước. Điều này thường bao gồm hình thu nhỏ tệp đính kèm và ảnh đại diện.

Mở tệp src/config.php của bạn.

Chúng ta sẽ thực hiện việc này bằng cách sử dụng closure để có thể sử dụng lại cùng một code và chúng ta chỉ phải nhập code đó một lần:
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'
   ]);
};

Lưu ý rằng keysecret là những gì bạn đã ghi chú sau khi thiết lập người dùng IAM trước đó. region có thể suy ra từ URL điểm cuối S3.

Tiếp theo, chúng ta cần thiết lập bộ điều hợp Flysystem thực tế để sử dụng client S3:
PHP:
$config['fsAdapters']['data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');
};

Cuối cùng, chúng ta cần đảm bảo rằng URL hình đại diện và hình thu nhỏ đính kèm được thêm URL chính xác:
PHP:
$config['externalDataUrl'] = function($externalPath, $canonical)
{
   return 'https://xftest.s3.eu-west-2.amazonaws.com/data/' . $externalPath;
};

Vào thời điểm này, mọi thứ sẽ hoạt động theo hướng tải lên mới. Đừng lo lắng nếu bạn nhận thấy ảnh đại diện và ảnh thu nhỏ bị thiếu; nếu bạn có các tệp hiện có, chúng sẽ cần được di chuyển thủ công, chúng ta sẽ xem xét sau.

Trước tiên, chúng ta cần kiểm tra xem cấu hình có hoạt động không. Chỉ cần đi và tải lên một ảnh đại diện mới. Ảnh đại diện bây giờ sẽ được lưu trữ và phục vụ từ xa!

Nếu bạn kiểm tra trình duyệt tệp bucket của mình ngay bây giờ, bạn sẽ thấy các thư mục mới đã được tạo chứa ảnh đại diện mới của bạn:

s3.console.aws.amazon.com_s3_buckets_xftest_data_avatars_o_0__region=us-east-1&tab=overview.webp

Thành công! Nhưng chúng ta chỉ mới đi được nửa chặng đường!

Bây giờ chúng ta cần thêm hỗ trợ cho cả thư mục internal_data nữa. Nói chung, đây là các tệp đính kèm và bất kỳ thứ gì khác cần "private". Quay lại config.php và code cần thêm rất giống nhau:
PHP:
$config['fsAdapters']['internal-data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');
};

Bây giờ hãy thử tải tệp đính kèm lên bài đăng và giống như trước, giờ bạn sẽ thấy các tệp và thư mục bổ sung trong trình duyệt tệp bucket của mình.


Di chuyển các tệp hiện có sang DigitalOcean Spaces hoặc Amazon S3

Vậy là giờ bạn đã có các tệp được lưu trữ từ xa. Ít nhất là từ thời điểm này trở đi. Nhưng còn tất cả các tệp hiện có thì sao?

Rất may là có một số cách để tương tác với Spaces và S3 để di chuyển nội dung hiện có của bạn rất dễ dàng. Mặc dù đây là thao tác một lần, nhưng tùy thuộc vào số lượng và kích thước của tệp, quá trình này có thể mất khá nhiều thời gian.

Có một số cách để quản lý quy trình này, nhưng có thể nói cách tiếp cận tốt nhất là sử dụng một công cụ có tên là s3cmd , đây là công cụ dòng lệnh đa nền tảng phổ biến để quản lý S3 và các kho lưu trữ đối tượng tương thích với S3.

Bạn có thể cài đặt công cụ s3cmd này trên máy chủ của mình và chạy các lệnh để sao chép các tệp sang vị trí mới cho dù bạn đang sử dụng Spaces hay S3.

Thay vì lặp lại những gì đã viết, tôi sẽ cung cấp cho bạn hướng dẫn sau đây từ DigitalOcean hướng dẫn cách di chuyển các tệp hiện có của bạn bằng s3cmd.


Lưu ý: Khi sao chép các tệp dữ liệu hiện có của bạn, chúng sẽ cần được công khai. Bạn có thể thực hiện việc này bằng cách đặt ACL thành công khai trong khi sao chép: https://www.digitalocean.com/docs/s...sage/#put-all-files-in-your-current-directory

Chúc các bạn thành công.


Nguồn: xenforo.com​
 

Đính kèm

Back
Top