Post

Cài MinIO trên Ubuntu — vài note sau khi tự vật lộn

Cài MinIO trên Ubuntu — vài note sau khi tự vật lộn

Mình vừa setup MinIO trên một con server Ubuntu để làm storage (kiểu S3 clone), nên tiện viết lại vài thứ cho ai cần. Bài này không phải lý thuyết — toàn là những gì mình đã làm + lỗi mình đã dính.


Tổng quan setup của mình

1
2
3
Browser ←→ Cloudflare ←→ Nginx ←→ MinIO
                             ├── 9000 (API)
                             └── 9001 (Console)
  • 9000: app dùng để upload/download
  • 9001: giao diện web quản lý

Mình dùng:

  • Cloudflare để xử lý SSL ngoài
  • Nginx làm reverse proxy vào MinIO

👉 Quan trọng: cần 2 domain riêng

  • s3.domain.com → cho API
  • console.domain.com → để login quản lý

Cài đặt nhanh bằng script

Mình không cài tay, mà nhờ AI viết luôn script cho đỡ mệt:

1
2
curl -O https://gist.githubusercontent.com/jhin1m/1f0b11f7d14a1ffe14b8a04b4e665307/raw/508b246592fbe9832feed4a8507e2393475a3a5c/install-minio.sh
sudo bash install-minio.sh

Script này basically làm hết:

  • tải MinIO
  • tạo user riêng (minio-user)
  • setup systemd
  • config firewall
  • dựng Nginx
  • cài SSL (Cloudflare hoặc Let’s Encrypt)
  • cài luôn mc CLI

Chạy xong là gần như có server dùng luôn.


Một lỗi ngu nhưng rất dễ dính 😅

Chọn sai ổ đĩa lưu data

Lúc script hỏi:

“Data directory là gì?”

👉 Nhớ check trước:

1
df -h

Ví dụ:

  • / = 2TB
  • /home = 13TB

→ thì phải chọn /home/minio-data

Không là sau này đầy ổ root là toang 😭


Sau khi cài xong cần làm gì?

1. Trỏ domain

  • tạo A record trỏ về IP server
  • nếu dùng Cloudflare → bật proxy (màu cam)

SSL mode:

  • Full hoặc Full (Strict)

2. Check server sống chưa

1
2
systemctl status minio
mc admin info local

Mấy lệnh mc mình dùng nhiều

Tạo bucket

1
mc mb local/my-bucket

Upload file

1
mc cp file.jpg local/my-bucket/

Download

1
mc cp local/my-bucket/file.jpg ./

Xoá sạch bucket

1
mc rm --recursive --force local/my-bucket

Kết nối từ app (cực kỳ quan trọng)

Laravel

AWS_ENDPOINT=https://s3.domain.com
AWS_USE_PATH_STYLE_ENDPOINT=true

Node.js

1
forcePathStyle: true

👉 Nếu quên cái này → lỗi DNS ngay.

Vì MinIO dùng dạng:

1
domain.com/bucket/file

chứ không phải:

1
bucket.domain.com/file

Trick bảo mật hay dùng

Mặc định nếu bạn chạy:

1
mc anonymous set download

→ ai cũng:

  • xem file
  • và xem luôn danh sách file

👀 không ổn lắm


Cách mình fix

Chỉ cho download file trực tiếp, không cho list:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat > /tmp/policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {"AWS": ["*"]},
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::my-bucket/*"]
    }
  ]
}
EOF

mc anonymous set-json /tmp/policy.json local/my-bucket

→ dùng link vẫn tải được → nhưng không ai browse được bucket


Những lỗi mình đã gặp (và cách fix)

❌ Login Console bị 401

Do mình từng set:

1
2
MINIO_SERVER_URL
MINIO_BROWSER_REDIRECT_URL

👉 Xoá hết là xong.


❌ SDK báo lỗi kiểu: bucket.domain.com

→ do nó tự chuyển sang subdomain

Fix:

1
forcePathStyle: true

❌ Cloudflare chặn request (403 / Just a moment…)

Cái này khá khó chịu.

Fix nhanh:

  • tắt Bot Fight Mode
  • tạo rule skip cho domain S3
  • nếu vẫn lỗi → chuyển DNS only (tắt proxy)

❌ Mở port mà vẫn không vào được

Do UFW:

1
ufw status numbered

→ rule deny nằm trên allow

Fix: xoá rule sai đi


❌ Không connect được từ máy khác

MinIO đang bind localhost

Fix:

1
--address :9000

Tổng kết kiểu “rút kinh nghiệm xương máu”

  • Đừng set MINIO_SERVER_URL nếu dùng proxy
  • Luôn bật forcePathStyle
  • Đừng dùng set download nếu không muốn lộ file list
  • Dùng mc CLI cho nhanh, Console nhiều lúc hơi tù do bản community bị cắt bớt tính năng

Nếu bạn đang build:

  • hệ thống upload ảnh
  • CDN nội bộ
  • hoặc thay S3 để tiết kiệm chi phí

→ MinIO khá ổn, miễn là config đúng ngay từ đầu.

This post is licensed under CC BY 4.0 by the author.