Viblo Code
+29

Hướng dẫn tích hợp Min.io với Laravel

Hòa chung bầu không khí kiếm áo từ Viblo May Fest 2021, bài viết này sẽ giới thiệu tới mọi người một opensource là Min.io - Object Storage Server và cách để tích hợp MinIO vào trong ứng dụng Laravel. Mời các bạn cùng đón đọc. 😄

MinIO là gì?

Min.io hay MinIO là một dự án open source, được dùng để dựng Object Storage Server. Nó có API tương thích với AWS S3 nên nếu bạn đang dùng MinIO mà muốn chuyển qua S3 thì sẽ không cần phải sửa lại source code. Ngoài ra, do nó tương thích với S3 nên các driver của S3 cũng sẽ dùng được cho MinIO luôn.

MinIO có các Docker Image được đóng gói sẵn, nên việc setup MinIO server bằng Docker khá nhanh gọn và thuận tiện. Nó cũng có trang dashboard tại http://localhost:9000 giúp bạn có thể xem danh sách các file đã upload lên MinIO server. Mình đánh giá giao diện trang này đơn giản và dễ dùng.

Ở phần tiếp theo, mình sẽ demo cách tích hợp với Laravel, để các bạn hình dung được sơ khai về cách sử dụng MinIO nhé.

Cài đặt MinIO bằng Docker

Nếu dùng boilerplate sun-asterisk-research/docker-php-development thì bạn chỉ cần khai báo thêm service minio trong file services là được.

Còn không bạn có thể dùng file docker-compose tương tự file compose/minio.yml để chạy thử.

version: "3.5"

networks:
  minio:

services:
  minio:
    image: minio/minio:latest
    restart: always
    command:
      - server
      - /data
    ports:
      - 9000:9000
    networks:
      - minio
    environment:
      MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minio}
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-miniostorage}
      MINIO_REGION_NAME: ${MINIO_REGION_NAME:-us-east-1}
    volumes:
      - ${PATH_DATA:-./data}/minio:/data

Sau đó chạy service MinIO lên bằng lệnh:

docker-compose up -d

Truy cập thử trang dashboard của MinIO tại: https://localhost:9000

Tích hợp MinIO với Laravel

Cài đặt thêm filesystem driver

Vì MinIO tương thích với AWS S3 nên chúng ta sẽ sử dụng luôn driver AWS S3 đã có Laravel luôn. Link driver: https://packagist.org/packages/league/flysystem-aws-s3-v3.

Bài này sẽ dùng driver v1, câu lệnh cài đặt như sau:

composer require "league/flysystem-aws-s3-v3:^1.0"

Thêm MinIOServiceProvider.php

<?php

namespace App\Providers;

use Aws\S3\S3Client;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;

class MinIOServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        /**
         * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter.UnusedParameter
         */
        Storage::extend('minio', function ($app, $config) {
            $client = new S3Client([
                'credentials' => [
                    'key'    => $config['key'],
                    'secret' => $config['secret'],
                ],
                'region'      => $config['region'],
                'version'     => 'latest',
                'bucket_endpoint' => false,
                'use_path_style_endpoint' => true,
                'endpoint'    => $config['endpoint'],
            ]);

            $root = $config['root'] ?? null;

            $options = $config['options'] ?? [];

            return new Filesystem(new AwsS3Adapter($client, $config['bucket'], $root, $options));
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
    }
}

Sau đó, bạn khai báo thêm MinIOServiceProvider vào trong file config/app.php nha.

Khai báo MinIO trong config/filesystem.php

Bây giờ, chúng ta sẽ khai báo một driver trong file config/filesystem.php nhé. Bạn thêm cấu hình như sau:

'minio' => [
    'driver' => 'minio',
    'key' => env('MINIO_ACCESS_KEY'),
    'secret' => env('MINIO_SECRET_KEY'),
    'region' => env('MINIO_REGION', 'us-east-1'),
    'bucket' => env('MINIO_DEFAULT_BUCKET', 'images'),
    'endpoint' => env('MINIO_ENDPOINT', 'http://minio:9000'),
],

Trong đó có các biến môi trường để cấu hình kết nối tới MinIO server gồm:

  • MINIO_ACCESS_KEY: Đây là access key, giống như username vậy, value bạn đặt trùng khớp với MINIO_ACCESS_KEY mà bạn đã cấu hình lúc cài đặt MinIO server
  • MINIO_SECRET_KEY: Đây là secret key, giống như password vậy, value bạn đặt trùng khớp với MINIO_SECRET_KEY mà bạn đã cấu hình lúc cài đặt MinIO server
  • MINIO_REGION: MinIO có thể phân tán thành nhiều zone khác nhau, ở bước cài đặt MinIO server có thiết lập tên zone, value của MINIO_REGION bạn cũng đặt trùng khớp với zone đã cài đặt.
  • MINIO_DEFAULT_BUCKET: Tên bucket, nó tương tự như một folder to vậy. Sau khi chạy MinIO, bạn vào trang dashboard của MinIO vào tạo một bucket rồi điền tên bucket đấy cho biến môi trường MINIO_DEFAULT_BUCKET.

Đừng quên đổi biến môi trường FILESYSTEM_CLOUD để thực hiện test thử được nhé.

Upload thử nghiệm

Bây giờ bạn chỉ việc upload thử nghiệm một file bằng tinker của Laravel:

php artisan tinker
>>> Storage::cloud()->put('demo/hello.txt', 'Hello Viblo.asia!')
=> true

Thử đọc nội dung của file ra:

>>> Storage::cloud()->get('demo/hello.txt')
=> "Hello Viblo.asia!"

Bạn mở trang MinIO Dashboard ra sẽ thấy file hello.txt trong thư mục demo:

Tổng kết

Như vậy là mình đã thực hiện tích hợp thành công MinIO với Laravel để lưu trữ các file mà người dùng upload lên thành công. Nếu bạn thấy bài này hay và hữu ích, đừng quên upvote cho bài viết, follow mình để đón đọc nhiều bài viết thú vị hơn về Laravel nhé.

Nếu bạn gặp vấn đề gì cần hỗ trợ khi làm theo tut này, cứ comment vào phía dưới bài viết, mình sẽ hỗ trợ nha.

Cảm ơn các bạn đã đọc bài viết của mình! ❤️ ❤️ ❤️


All Rights Reserved