ติดตั้ง MinIO Object Storage บน VPS แทน AWS S3

ติดตั้ง MinIO Object Storage บน VPS แทน AWS S3

มิถุนายน 2026 · อ่าน 7 นาที

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,
    ...
]
Tip: ตั้ง bucket policy เป็น "public" สำหรับ static assets ที่ต้องเข้าถึงได้จาก browser และ "private" สำหรับ backups ผ่าน MinIO Console > Buckets > Access Policy

ตั้ง 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
Tip: เปิด versioning บน bucket ที่เก็บ backup สำคัญเสมอ แต่ระวัง disk โต — จับคู่กับ lifecycle rule ให้ลบ noncurrent version ที่เก่ากว่า N วันออกอัตโนมัติ

ตรวจสอบว่า 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
Tip: MinIO health check endpoint /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