- vừa được xem lúc

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

1 0 346

Người đăng: Nguyễn Hữu Kim

Theo Viblo Asia

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! ❤️ ❤️ ❤️

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 738

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433