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/download9001: 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 APIconsole.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
mcCLI
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:
FullhoặcFull (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_URLnếu dùng proxy - Luôn bật
forcePathStyle - Đừng dùng
set downloadnếu không muốn lộ file list - Dùng
mcCLI 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.