→ From Coder to Shipper
From Coder to Shipper · Lưu trữ

Object storage (S3 / MinIO)

Lưu file dưới dạng object trong một bucket và truy cập từng file bằng URL — nơi lưu mở rộng, bền vững cho upload, ảnh, và backup ngoài VPS của bạn.

← / → để chuyển slide · chuyển EN/VI bên dưới

Toàn cảnh

Object storage là gì?

Quên đi thư mục và ổ đĩa. Bạn đặt file vào một container và dịch vụ lưu trữ trả về một link.

File trở thành object

Object là file kèm metadata (kích thước, content-type, tag) — lưu thành một đơn vị.

Bucket = một container

Bucket là một không gian tên phẳng chứa object. Không có thư mục thật, chỉ có đường dẫn trong key.

Mọi thứ đều có URL

Mỗi object được truy cập bằng một URL HTTP thường, nên trình duyệt, CDN, và dịch vụ khác tải về trực tiếp được.

Dành cho web

Ảnh, file user upload, video, backup đều hợp — bất cứ thứ gì bạn muốn phân phối qua internet.

Toàn cảnh

Nó làm gì

Bạn nói chuyện với nó qua mạng bằng một API — upload, liệt kê, tải về, xóa. Nó tự mở rộng và bền vững.

Upload & tải về qua HTTP

REST/S3 API: put một object, get lại, list bucket, delete. Chạy được từ CLI, SDK, hay HTTP thô.

Mỗi object = một key + một URL

Key là tên object (vd uploads/101.png). URL là địa chỉ ổn định để phân phối nó.

Mở rộng cực lớn

Nó trải trên hàng nghìn ổ đĩa ở nhiều máy. Bạn không bao giờ phải tính capacity — thêm hàng tỷ object vẫn chạy.

Rẻ hơn + bền hơn

Thường rẻ hơn ổ đĩa VPS, và dữ liệu được nhân bản nên sống sót khi phần cứng hỏng (S3 cam kết độ bền 11 số chín).

1
Phần 1 · Khái niệm cốt lõi

Bốn khối xây dựng

Mọi thứ trong object storage chỉ là bốn ý tưởng này.

Khái niệm cốt lõi

Bucket, object, key, URL

Bốn cái tên, một mô hình trong đầu. Học thuộc là hiểu cả hệ thống.

Bucket

Container có tên (không gian tên) chứa object. vd myapp-uploads. Một tài khoản có thể có nhiều.

Object

Một file kèm metadata (content-type, kích thước, tag tùy chỉnh). Đúng thứ bạn lưu.

Key

Tên object trong bucket — đường dẫn bạn thấy. vd avatars/101.png. Phải duy nhất trong bucket.

URL

Địa chỉ HTTP phân phối object. vd https://myapp.s3.../avatars/101.png. Đây là thứ bạn đưa vào app.

Mô hình trong đầu

Một bucket, nhiều object, mỗi object một URL

Bucket chứa các object; key của mỗi object trở thành một phần URL của nó. Đó là toàn bộ hệ thống.

Bucket
myapp-uploads
một container có tên (không gian tên)
→
Objects
avatars/101.png posts/778.jpg backups/0920.sql
→
URLs
https://myapp-uploads.s3.amazonaws.com/avatars/101.png https://myapp-uploads.s3.amazonaws.com/posts/778.jpg https://myapp-uploads.s3.amazonaws.com/backups/0920.sql
Vì sao

Vì sao bạn dùng nó

Khi file của bạn không nên nằm trên ổ đĩa VPS, đây là câu trả lời.

Upload của user (avatar, ảnh)

Lưu những gì user upload ngoài ổ app, rồi phân phối bằng URL — không bao giờ làm phình to VPS.

Media & file tĩnh

Video, audio, báo cáo được tạo ra, font — mọi thứ lớn mà user tải trực tiếp.

Backup, ngoài VPS

Sao chép DB dump và config sang nơi bền vững, để ổ VPS chết không kéo theo dữ liệu của bạn.

Phân phối tốt, tự mở rộng

Nó được thiết kế để tải qua internet; đặt một CDN ở phía trước là phân phối nhanh toàn cầu.

Hai cái tên

Hai cái tên bạn sẽ gặp

Một là classic trên cloud, một là bạn tự chạy trên VPS.

AWS S3

Bản gốc và là chuẩn. Simple Storage Service — API mà tất cả dịch vụ khác sao chép. Có free tier, trả theo mức dùng.

MinIO

Mở nguồn, tự host, tương thích S3. Chạy trong container trên VPS của bạn và dùng y hệt các tool S3.

Cùng một API, bên nào cũng vậy

Vì MinIO nói được S3, code viết cho S3 chạy với MinIO mà không đổi gì — chỉ cần trỏ endpoint sang VPS.

Cloud hay tự host

S3 = thuê từ AWS. MinIO = tự sở hữu trên máy bạn. Cùng mô hình trong đầu, cùng lệnh, khác chủ nhà.

Hai cái tên

S3 so với MinIO, nhìn nhanh

Cùng API, cùng lệnh — khác biệt thật sự duy nhất là ai chạy nó.

ĐiểmAWS S3MinIO
Chạy ởCloud AWS — bạn thuêTrên VPS của bạn — bạn tự host
Chi phíTrả theo GB lưu + requestChỉ hóa đơn VPS bạn đang có
APIS3 — the originalS3-compatible — same SDKs / CLI
Cài đặtTạo bucket, trỏ sangChạy 1 container, tạo bucket
Phù hợpProduction, không cần lo, không opsVPS, kiểm soát hoàn toàn, dữ liệu là của bạn
Ví dụ cốt lõi · CLI

Upload bằng AWS CLI

aws s3 cp là lệnh một dòng bạn dùng nhiều nhất: đường dẫn local vào, đường dẫn bucket ra.

bash
# copy a local file into a bucket (this is the whole upload)
aws s3 cp ./avatar.png s3://myapp-uploads/avatars/101.png

# make a public bucket, then list what's inside it
aws s3 mb s3://myapp-uploads --acl public-read
aws s3 ls s3://myapp-uploads/avatars/

Trỏ các lệnh y hệt này sang MinIO bằng cách đặt endpoint URL — không gì khác thay đổi.

Ví dụ cốt lõi · CLI

Một phiên CLI thật

Tạo bucket, upload một object, liệt kê — và đây là URL của nó.

ops@vps — zsh
$ aws s3 mb s3://myapp-uploads
make_bucket: myapp-uploads
$ aws s3 cp ./post.jpg s3://myapp-uploads/posts/778.jpg
upload: ./post.jpg to s3://myapp-uploads/posts/778.jpg
$ aws s3 ls s3://myapp-uploads/posts/
2026-10-27 04:35:00 482137 778.jpg
$ echo https://myapp-uploads.s3.amazonaws.com/posts/778.jpg
https://myapp-uploads.s3.amazonaws.com/posts/778.jpg
Ví dụ cốt lõi · Python

Upload bằng client Python nhỏ (boto3)

put_object là toàn bộ phần upload trong Python. Đổi client sang endpoint MinIO và đúng code này chạy trên VPS.

python
import boto3

s3 = boto3.client("s3")
s3.put_object(
    Bucket="myapp-uploads",
    Key="posts/778.jpg",
    Body=open("post.jpg", "rb").read(),
)

# now it's live — the same S3 API works against MinIO too:
print("https://myapp-uploads.s3.amazonaws.com/posts/778.jpg")

Với MinIO: boto3.client("s3", endpoint_url="http://your-vps:9000", ...).

Phân phối nó

URL của object — cách bạn truy cập

Phần thưởng là một link thường. Ba cách bạn thực sự dùng để phân phối.

URL bucket công khai

Nếu bucket cho phép đọc công khai, https://myapp-uploads.s3.../key hoạt động — đưa thẳng vào <img src>. Đơn giản, nhưng ai cũng thấy được.

URL presigned

Với bucket riêng, sinh một link ký có hạn thời gian để user tải — không cần truy cập công khai.

CDN ở phía trước

Cấu hình production phổ biến: S3 (hay MinIO) sau một CDN — nó cache và phân phối object nhanh từ gần mỗi user.

Toàn cảnh

Nơi lưu file ngoài VM của bạn

Đặt cạnh ổ đĩa VPS là thấy ngay lý do dùng.

Ổ đĩa VPS

Một ổ, một máy. Đầy dần, và nếu nó chết thì upload, ảnh, backup của bạn mất theo. Bạn tự lo capacity.

Ổn cho code. Không phải nhà đúng cho file mà người dùng tải về.

Object storage (S3 / MinIO)

Một bucket các object, mỗi object một URL. Tự mở rộng, được nhân bản nên bền, và CDN phía trước làm nó nhanh.

Nhà ngoài VM cho upload và media.

Object storage là file của bạn ngoài VM — một bucket các object, mỗi cái một URL, tự mở rộng.
Mô hình trong đầu cần giữ

Một bucket. Các object. Mỗi object một URL.

Tiếp theo: đặt một CDN phía trước để phân phối nhanh toàn cầu.