ติดตั้ง MinIO Object Storage บน VPS แทน AWS S3
MinIO คือ high-performance object storage ที่ใช้ S3 API เดียวกับ Amazon S3 ทำให้ migrate จาก S3 ได้โดยแทบไม่ต้องแก้ code ติดตั้งบน VPS ส่วนตัวทำให้ประหยัดค่า cloud storage และ bandwidth อย่างมาก เหมาะสำหรับเก็บ user uploads, backup database, static assets และ Docker images
ติดตั้ง MinIO ด้วย Docker Compose
mkdir -p ~/minio/data
cd ~/minio
cat > docker-compose.yml << 'EOF'
version: "3.8"
services:
minio:
image: minio/minio:latest
container_name: minio
restart: unless-stopped
ports:
- "9000:9000" # S3 API
- "9001:9001" # Web console
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: yourStrongPassword123
volumes:
- ./data:/data
command: server /data --console-address ":9001"
EOF
docker compose up -d
ตั้ง Nginx Reverse Proxy ให้ MinIO
sudo nano /etc/nginx/sites-available/minio
server {
listen 443 ssl;
server_name minio.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/minio.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/minio.yourdomain.com/privkey.pem;
# S3 API
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 1024m;
}
}
server {
listen 443 ssl;
server_name console.minio.yourdomain.com;
# Web console
location / {
proxy_pass http://localhost:9001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
ใช้ MinIO Client (mc)
# ดาวน์โหลด mc
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
# ตั้ง alias
mc alias set myminio https://minio.yourdomain.com minioadmin yourStrongPassword123
# สร้าง bucket
mc mb myminio/uploads
mc mb myminio/backups
# อัพโหลดไฟล์
mc cp /path/to/file.zip myminio/backups/
# ดูไฟล์ใน bucket
mc ls myminio/backups/
ใช้งานกับ Laravel (ตัวอย่าง)
# .env
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=yourStrongPassword123
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=uploads
AWS_ENDPOINT=https://minio.yourdomain.com
AWS_USE_PATH_STYLE_ENDPOINT=true
# filesystems.php
's3' => [
'driver' => 's3',
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => true,
...
]
ตั้ง Bucket Policy และ Versioning
หลังสร้าง bucket ควรกำหนด access policy ให้ชัด และเปิด versioning เพื่อกู้ไฟล์ที่ถูกเขียนทับหรือลบโดยพลาด:
# ตั้ง alias ไปยัง MinIO ของเรา
mc alias set myminio https://s3.yourdomain.com ACCESS_KEY SECRET_KEY
# เปิด versioning (กู้ไฟล์เก่าได้)
mc version enable myminio/backups
# ตั้ง bucket เป็น private (default) หรือ download-only
mc anonymous set download myminio/public-assets
mc anonymous set none myminio/backups
# ตั้ง lifecycle ลบ object เก่าอัตโนมัติหลัง 90 วัน
mc ilm rule add --expire-days 90 myminio/temp-uploads
ตรวจสอบว่า MinIO ทำงานถูกต้อง
# ตรวจ container
docker compose ps
# ตรวจ API endpoint
curl -I https://minio.yourdomain.com/minio/health/live
# ทดสอบ upload/download
mc cp /etc/hostname myminio/backups/test.txt
mc ls myminio/backups/
mc rm myminio/backups/test.txt
/minio/health/live ตอบ 200 เมื่อ service พร้อม ใช้ใน Uptime Kuma หรือ monitoring ได้ทันที
แก้ปัญหาที่พบบ่อย
Error: "SignatureDoesNotMatch" เมื่อเชื่อมจาก SDK
Region ใน SDK ต้องตรงกับที่ตั้งใน MinIO ถ้าใช้ custom region ต้องระบุให้ตรงกัน หรือใช้ us-east-1 ซึ่งเป็น default:
mc admin info myminio | grep -i region
Upload ไฟล์ใหญ่ล้มเหลว (413 Entity Too Large)
Nginx มี client_max_body_size เพิ่มใน nginx config:
# /etc/nginx/sites-available/minio
client_max_body_size 10240m; # 10GB
sudo nginx -t && sudo systemctl reload nginx
MinIO Console เปิดไม่ได้ (WebSocket error)
Console ใช้ WebSocket ต้องตั้ง proxy ให้รองรับ upgrade header:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 900s;
คำถามที่พบบ่อย
MinIO รองรับ versioning เหมือน S3 ไหม?
ได้ MinIO รองรับ S3 versioning เปิดผ่าน mc version enable myminio/bucketname ทำให้เก็บประวัติการเปลี่ยนแปลงไฟล์ได้ และ restore เวอร์ชันเก่าได้ทันที
ประหยัดกว่า AWS S3 แค่ไหน?
AWS S3 คิด $0.023/GB/เดือน บวก bandwidth และ request cost MinIO บน VPS เสีย fixed cost ของ VPS อย่างเดียว สำหรับ storage 100 GB+ ต่อเดือน MinIO มักประหยัดกว่ามาก โดยเฉพาะถ้า VPS นั้น run service อื่นอยู่แล้ว
Backup MinIO ทำอย่างไร?
ใช้ mc mirror ทำ cross-site backup หรือ sync กับ S3 จริงสำหรับ offsite backup: mc mirror myminio/important s3/backup-bucket --watch