Vấn đề: Tại sao phải tự build Object Storage khi đã có AWS S3?
Chi phí lưu trữ đám mây (Cloud Storage) như AWS S3 hay Google Cloud Storage nhìn qua thì có vẻ rẻ, nhưng khi dung lượng dữ liệu lên tới hàng chục Terabyte và băng thông truyền tải (egress) tăng cao, hóa đơn hàng tháng sẽ khiến bạn giật mình. Chưa kể, đối với các doanh nghiệp tại Việt Nam, việc lưu trữ dữ liệu nhạy cảm trên server nước ngoài đôi khi vi phạm các quy định về chủ quyền dữ liệu.
Giải pháp tối ưu nhất lúc này là tự xây dựng một hệ thống Object Storage tương thích hoàn toàn với API của S3. MinIO nổi lên như một ứng cử viên sáng giá nhất nhờ hiệu năng cực cao và khả năng mở rộng linh hoạt. Tuy nhiên, cài đặt MinIO trên một hệ điều hành khắt khe về bảo mật như CentOS Stream 9 không đơn giản là chạy một câu lệnh xong ngay. Nếu không xử lý đúng SELinux và Firewalld, bạn sẽ liên tục gặp lỗi ‘Permission Denied’ hoặc không thể truy cập được Dashboard từ bên ngoài.
Hồi mình làm dự án cho một bên tài chính, họ yêu cầu dữ liệu tuyệt đối không được ra khỏi hạ tầng On-premise. Lúc đó AWS S3 coi như gạch tên đầu nước. Mình đã phải setup cụm MinIO trên CentOS Stream và chạy mượt mà đến tận bây giờ. Dưới đây là quy trình chuẩn chỉnh mà mình đã đúc kết được.
Bước 1: Chuẩn bị môi trường và người dùng hệ thống
Để đảm bảo an toàn, chúng ta không bao giờ chạy MinIO dưới quyền root. Việc đầu tiên là tạo một user riêng biệt và chuẩn bị thư mục lưu trữ dữ liệu.
# Cập nhật hệ thống
sudo dnf update -y
# Tạo user hệ thống cho MinIO
sudo useradd -r minio-user -s /sbin/nologin
# Tạo thư mục chứa dữ liệu và cấu hình
sudo mkdir -p /mnt/data /etc/minio
sudo chown minio-user:minio-user /mnt/data /etc/minio
Bước 2: Tải và cài đặt MinIO Binary
Thay vì sử dụng các bản phân phối phức tạp, mình ưu tiên dùng binary trực tiếp từ trang chủ của MinIO để dễ dàng kiểm soát phiên bản.
# Tải bản server
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# Cấp quyền thực thi và di chuyển vào thư mục hệ thống
chmod +x minio
sudo mv minio /usr/local/bin/
Kiểm tra xem file đã chạy được chưa bằng lệnh: minio --version. Nếu hiện thông tin phiên bản là bạn đã thành công một nửa.
Bước 3: Cấu hình biến môi trường (Environment Variables)
MinIO quản lý các tham số cấu hình thông qua một file environment. Bạn cần tạo file /etc/default/minio để định nghĩa các thông số như tài khoản admin, port và đường dẫn dữ liệu.
sudo nano /etc/default/minio
Dán nội dung sau vào file (nhớ thay đổi mật khẩu mạnh hơn nhé):
# Thư mục lưu trữ dữ liệu
MINIO_VOLUMES="/mnt/data"
# Địa chỉ và Port cho API
MINIO_OPTS="--address :9000 --console-address :9001"
# Tài khoản quản trị tối cao
MINIO_ROOT_USER=admin_minio_itfz
MINIO_ROOT_PASSWORD=Thay_Doi_Mat_Khau_Nay_Ngay
# (Tùy chọn) Domain nếu bạn dùng Proxy
# MINIO_SERVER_URL="https://minio.yourdomain.com"
Bước 4: Thiết lập Systemd Service
Để MinIO tự khởi động cùng hệ thống và dễ dàng quản lý, chúng ta cần tạo một file service cho systemd.
sudo nano /etc/systemd/system/minio.service
Nội dung file service:
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Tự động restart nếu crash
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
Bước 5: Xử lý SELinux và Firewalld – Khúc xương khó gặm
Đây là phần mà nhiều hướng dẫn trên mạng bỏ qua, dẫn đến việc service không start được hoặc client không kết nối tới được. CentOS Stream 9 bật SELinux ở chế độ Enforcing mặc định.
Cấu hình SELinux
Dịch vụ MinIO cần quyền đọc/ghi vào thư mục dữ liệu và quyền bind vào các port mạng. Thay vì tắt SELinux (rất thiếu chuyên nghiệp và kém an toàn), hãy gán nhãn đúng cho nó:
# Gán nhãn cho binary
sudo chcon -t bin_t /usr/local/bin/minio
# Gán nhãn cho thư mục dữ liệu để MinIO có quyền ghi
sudo semanage fcontext -a -t mnt_t "/mnt/data(/.*)?"
sudo restorecon -Rv /mnt/data
Cấu hình Firewalld
MinIO sử dụng port 9000 cho API và 9001 cho Console. Hãy mở chúng ngay:
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --reload
Bước 6: Kích hoạt và Kiểm tra
Bây giờ là lúc tận hưởng thành quả. Hãy reload lại daemon và start service:
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
# Kiểm tra trạng thái
sudo systemctl status minio
Nếu dòng chữ active (running) hiện lên màu xanh, chúc mừng bạn! Bạn có thể truy cập vào giao diện web qua địa chỉ: http://IP_CUA_BAN:9001.
Kinh nghiệm thực tế khi vận hành MinIO
Trong quá trình quản trị các cụm MinIO lớn, mình nhận ra một vài điểm mấu chốt mà bạn nên lưu ý:
- Sử dụng HTTPS: Đừng bao giờ chạy MinIO qua HTTP ở môi trường Production. Bạn nên sử dụng Nginx làm Reverse Proxy và cài đặt SSL từ Let’s Encrypt để bảo vệ dữ liệu truyền tải.
- Giám sát (Monitoring): MinIO cung cấp endpoint
/minio/v2/metrics/clustertương thích với Prometheus. Hãy tích hợp nó vào Grafana để theo dõi dung lượng và tốc độ đọc/ghi theo thời gian thực. - Backup cấu hình: Mặc dù dữ liệu nằm trong
/mnt/data, nhưng các cấu hình người dùng, policy thường nằm trong một thư mục ẩn.minio.sysbên trong đó. Đừng bao giờ can thiệp thủ công vào thư mục này.
Việc tự xây dựng hệ thống Object Storage trên CentOS Stream 9 không chỉ giúp tiết kiệm chi phí mà còn giúp bạn làm chủ hoàn toàn hạ tầng dữ liệu của mình. Với sự hỗ trợ của SELinux và Firewalld, hệ thống của bạn sẽ cực kỳ vững chắc trước các cuộc tấn công từ bên ngoài.

