Laravel MinIO整合

Laravel 部分

注:我在Laravel 11測試

安裝s3相關

composer require league/flysystem-aws-s3-v3

.env

AWS_ACCESS_KEY_ID="xxxxxxxxx" 
AWS_SECRET_ACCESS_KEY="xxxxxxxxxx" 
AWS_BUCKET="Bucket_Name" 
AWS_ENDPOINT=https://minio.xxxxx.com

configs/filesystem.php disk 中新增以下這段

        'minio' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
        'bucket' => env('AWS_BUCKET'),
        'endpoint' => env('AWS_ENDPOINT'),
        'use_path_style_endpoint' => true,  // MinIO必須要這行
        ],

php 測試

php artisan tinker
Storage::disk('minio')->put("test.txt","Test For MinIO");

MinIO部分

用你自己方法去安裝,比如docker 等等

假設你用預設port 9001為console 9000為api

前往console 建立 ACCESS_KEYSECRET_ACCESS_KEY

建立你自己的Bucket,假設名為data1Access Policycustom

下面是參考,所有人都能瀏覽到,但是只有有帳號的人才能上傳/刪除/修改

意思是你的Laravel 有填上ACCESS_KEYSECRET_ACCESS_KEY,可直接操作上傳刪除等等,但是其他人,公眾是沒有的,但他們可直接瀏覽/下載你的文件及圖片等等

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::data1/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::data1/*"
            ]
        }
    ]
}

反向代理

安裝完MinIO後正常是 :9000 ,在主機做中反向代理

比如設定 http://data.abc.com -> http://localhost:9000

SSL則 https://data.abc.com -> http://localhost:9000

那麼回到第一步,Laravel 的.env中的endpoint 只需填 https://data.abc.com 不用填上 :9000

最後

MinIO 是個自架版的s3 專門可用來做自己的附件庫/圖床等,如果你跟我一樣同時有多個網站需要管理,由其是laravel這類現代化框架網,那麼在搬server或者備份時,可以把storage跳過,可節省很多時間,由於Laravel 11 開始更簡潔了目標架構

至於為什麼要自架MinIO而不用S3,只是單純我工作原因,有大量閒置的伺服器,所以對S3,這樣做法價格更易控制,如果你不熟管理linux,那麼直接用s3會更簡單