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_KEY
及 SECRET_ACCESS_KEY
建立你自己的Bucket,假設名為data1
,Access Policy
選 custom
下面是參考,所有人都能瀏覽到,但是只有有帳號的人才能上傳/刪除/修改
意思是你的Laravel 有填上ACCESS_KEY
及 SECRET_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會更簡單