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ớiMINIO_ACCESS_KEY
mà bạn đã cấu hình lúc cài đặt MinIO serverMINIO_SECRET_KEY
: Đây là secret key, giống như password vậy, value bạn đặt trùng khớp vớiMINIO_SECRET_KEY
mà bạn đã cấu hình lúc cài đặt MinIO serverMINIO_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ủaMINIO_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ườngMINIO_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!