Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

Triển khai Dịch vụ Lưu trữ S3 Dung Lượng Giới Hạn với ZFS và MinIO


🧠 Giới thiệu

Dịch vụ lưu trữ S3 (như Amazon S3, Wasabi, Backblaze B2...) thường không giới hạn dung lượng lưu trữ upfront, mà tính tiền theo số GB sử dụng, số lần request, băng thông tải xuống, v.v. Tuy nhiên, nếu muốn tự triển khai một dịch vụ S3 để bán cho khách hàng với gói dung lượng cố định (5GB, 10GB, 20GB...), chúng ta cần cơ chế giới hạn dung lượng (quota).

MinIO là một giải pháp S3-compatible open source, nhưng không hỗ trợ quota native per bucket/user. Tuy nhiên, nếu kết hợp với ZFS – một hệ thống file mạnh mẽ hỗ trợ quota, snapshot, compression – chúng ta hoàn toàn có thể triển khai mô hình này với 1 server duy nhất, hiệu quả và đơn giản.


✅ Kiến trúc tổng thể

+-----------------+       +-------------------------+        +--------------------+
|   Khách hàng A  | <--->|    Nginx reverse proxy   | <----> |      MinIO Server   |
+-----------------+       +-------------------------+        |   (S3-compatible)   |
                                                |          +--------------------+
                                                v
                                 +-----------------------------+
                                 |  Dataset ZFS: hddpool/a-bucket |
                                 |     Quota: 10GB              |
                                 +-----------------------------+

🛠 Bước 1: Tạo ZFS pool và dataset

Giả sử có một server với 24 ổ cứng HDD 14TB, chúng ta có thể tạo ZFS pool như sau:

# Tạo pool
zpool create hddpool raidz2 /dev/sd[b-y]

# Tạo dataset riêng cho khách hàng A
zfs create hddpool/a-bucket

# Gán quota 10GB cho dataset
zfs set quota=10G hddpool/a-bucket

🔌 Bước 2: Triển khai MinIO sử dụng dataset này

Chạy MinIO với backend là thư mục tương ứng với dataset ZFS đã gắn quota:

export MINIO_ACCESS_KEY=auser
export MINIO_SECRET_KEY=asecret

minio server /hddpool/a-bucket

🌐 Bước 3: Reverse proxy với Nginx

Cài đặt nginx để đưa S3 endpoint ra ngoài qua domain a.s3.stacklab.vn.

server {
    listen 443 ssl;
    server_name a.s3.stacklab.vn;

    ssl_certificate     /etc/letsencrypt/live/stacklab.vn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/stacklab.vn/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

📊 Kiểm tra dung lượng đã dùng

Kiểm tra dung lượng đã dùng của khách hàng rất đơn giản qua ZFS:

zfs list -o name,used,quota,available hddpool/a-bucket

Ví dụ kết quả:

NAME               USED  QUOTA  AVAIL
hddpool/a-bucket   2.3G   10G     7.7G

🔁 Thay đổi quota (resize)

Tăng/giảm quota linh hoạt:

# Tăng quota lên 20G
zfs set quota=20G hddpool/a-bucket

# Giảm quota (chỉ được nếu USED < quota mới)
zfs set quota=5G hddpool/a-bucket

🔥 Ưu điểm của mô hình này

Tính năng Có không?
Tương thích S3 chuẩn ✅ (MinIO)
Giới hạn dung lượng từng user ✅ (ZFS)
Quản lý tách biệt từng khách ✅ (1 dataset/user)
Monitoring dễ dàng
Backup/snapshot dễ
Tự host, không phụ thuộc cloud

🧠 Kết luận

Mặc dù MinIO không có quota native, nhưng khi kết hợp với ZFS — chúng ta có thể triển khai một dịch vụ S3 nhỏ gọn, giới hạn dung lượng theo từng khách hàng, dễ quản lý và cực kỳ hiệu quả.

Giải pháp này đặc biệt phù hợp nếu:

  • Có một server nhiều ổ đĩa (24 HDD chẳng hạn)
  • Muốn bán dịch vụ lưu trữ backup S3 với dung lượng cố định
  • Không muốn triển khai hệ thống phức tạp như Ceph

📎 Gợi ý nâng cao

  • Sử dụng rclone, awscli, hoặc s3cmd để kiểm tra S3 từ phía khách.
  • Tự động hoá tạo dataset + quota + tài khoản MinIO qua script bash.
  • Triển khai dashboard hiển thị dung lượng used/quota bằng ZFS API.