- Cloudflare R2 miễn phí được tới đâu?
- Bảng free tier hàng tháng
- 10 GB và 10 triệu requests đi được xa đến đâu?
- Cách Cloudflare R2 tính tiền chi tiết
- Bảng giá paid (Standard Storage)
- Class A và Class B là gì?
- Cách tính storage (GB-month)
- Ví dụ tính tiền thực tế
- Infrequent Access: khi nào nên dùng?
- Hướng dẫn thiết lập Cloudflare R2 từ con số 0
- Bước 1: Tạo tài khoản và kích hoạt R2
- Bước 2: Tạo Bucket
- Bước 3: Bật Public Access (tùy chọn nhưng nên làm)
- Bước 4: Tạo API Token và lấy credentials
- Bước 5: Upload và download file bằng Node.js (chạy được ngay)
- Bước 6: Kết nối R2 với Wrangler CLI (tùy chọn)
- Bước 7: Cấu hình với các framework phổ biến
- Những điều cần nhớ khi dùng R2
- Kết luận
Trong bài viết này, chúng ta sẽ đi qua từng khía cạnh: free tier cho phép bạn dùng miễn phí tới đâu, cách Cloudflare tính tiền khi vượt ngưỡng, và hướng dẫn thiết lập bucket từ con số 0 với code chạy được ngay.
Cloudflare R2 miễn phí được tới đâu?
R2 có một trong những free tier hào phóng nhất trong ngành object storage. Quan trọng hơn: free tier không có thời hạn. Không giống AWS S3 (chỉ miễn phí 12 tháng đầu), R2 cho phép bạn dùng miễn phí vĩnh viễn miễn là nằm trong giới hạn.
Bảng free tier hàng tháng
| Tài nguyên | Miễn phí mỗi tháng |
|---|---|
| Storage (Standard) | 10 GB-month |
| Class A operations (write/list) | 1 triệu requests |
| Class B operations (read) | 10 triệu requests |
| Egress (data transfer ra internet) | Luôn miễn phí |
Lưu ý quan trọng: Infrequent Access storage không có free tier. Nếu bạn muốn dùng tier này, bạn sẽ bị tính phí ngay từ byte đầu tiên. Ngoài ra, các thao tác xóa (DeleteObject, DeleteBucket, AbortMultipartUpload) hoàn toàn miễn phí và không tính vào Class A hay Class B.
10 GB và 10 triệu requests đi được xa đến đâu?
Con số này đủ cho hầu hết dự án cá nhân, portfolio, blog và môi trường dev/staging:
- Portfolio nhiếp ảnh: 500 ảnh high-res ~10 MB mỗi ảnh = khoảng 5 GB. 10 triệu Class B requests/tháng đủ để xử lý traffic lớn.
- Static site assets: Blog, landing page, documentation site serve ảnh và PDF từ R2. Egress free nên traffic spike không làm bill tăng.
- Dev environment: Test upload file, presigned URL, S3-compatible integration mà không lo bill.
- Backup tài liệu quan trọng: Hợp đồng, hóa đơn, record ít được truy cập nhưng cần sẵn sàng.
Giới hạn đầu tiên bạn sẽ chạm phải gần như luôn là storage (10 GB), chứ không phải operations. Nếu dự án của bạn lưu video 4K, RAW ảnh hoặc dataset lớn, 10 GB sẽ đầy rất nhanh.
Cách Cloudflare R2 tính tiền chi tiết
R2 tính phí dựa trên hai thành phần chính: storage và operations. Egress luôn miễn phí cho cả free tier lẫn paid.
Bảng giá paid (Standard Storage)
| Tài nguyên | Giá |
|---|---|
| Standard storage | $0.015 / GB-month |
| Infrequent Access storage | $0.01 / GB-month |
| Class A operations (Standard) | $4.50 / triệu requests |
| Class B operations (Standard) | $0.36 / triệu requests |
| Class A operations (Infrequent Access) | $9.00 / triệu requests |
| Class B operations (Infrequent Access) | $0.90 / triệu requests |
| Data retrieval (Infrequent Access) | $0.01 / GB |
| Egress (ra internet) | Miễn phí |
Class A và Class B là gì?
Cloudflare chia operations thành hai nhóm để tính giá khác nhau:
Class A (write/list): Các thao tác ghi hoặc liệt kê dữ liệu. Giá cao hơn vì tốn tài nguyên hơn.
- PutObject (upload file)
- CreateMultipartUpload, UploadPart, CompleteMultipartUpload
- CopyObject
- ListObjects, ListObjectsV2
- PutBucketEncryption, PutBucketCors, PutBucketLifecycleConfiguration
Class B (read): Các thao tác đọc dữ liệu hoặc kiểm tra metadata. Giá rẻ hơn nhiều.
- GetObject (download file)
- HeadObject (kiểm tra file tồn tại, đọc size, content type)
- GetObjectRange (tải một phần file, byte-range requests)
Delete operations hoàn toàn miễn phí.
Cách tính storage (GB-month)
Storage không tính theo “bạn đang lưu bao nhiêu GB ngay lúc này”, mà tính theo peak storage mỗi ngày, rồi lấy trung bình trong 30 ngày.
Ví dụ:
- Lưu 1 GB liên tục 30 ngày = 1 GB-month.
- Lưu 1 GB trong 5 ngày đầu, sau đó tăng lên 3 GB trong 25 ngày còn lại = (1 × 5/30) + (3 × 25/30) = 2.66 GB-month.
Ví dụ tính tiền thực tế
Scenario 1: Website nhỏ, 50 GB storage, traffic vừa phải
| Chi phí | Tính toán | Thành tiền |
|---|---|---|
| Storage (50 GB) | 50 × $0.015 | $0.75 |
| Class A (100K writes) | Dưới 1M, nằm trong free tier | $0 |
| Class B (2M reads) | Dưới 10M, nằm trong free tier | $0 |
| Egress (500 GB downloaded) | Luôn miễn phí | $0 |
| Tổng | $0.75/tháng |
Scenario 2: Media archive 1 TB, 10M reads/ngày
| Chi phí | Tính toán | Thành tiền |
|---|---|---|
| Storage (1,000 GB) | 1,000 × $0.015 | $15.00 |
| Class A (1M writes) | Dưới 1M, free tier | $0 |
| Class B (300M reads/tháng) | (300M – 10M free) × $0.36/triệu | $104.40 |
| Egress (10 TB) | Luôn miễn phí | $0 |
| Tổng | $119.40/tháng |
So sánh với AWS S3: Với cùng scenario 2, chỉ riêng egress 10 TB trên S3 đã tốn khoảng $900 (tính $0.09/GB). R2 tiết kiệm hoàn toàn khoản này. Đó là lý do R2 “rẻ” — không phải storage rẻ hơn nhiều, mà là egress biến mất.
Infrequent Access: khi nào nên dùng?
Infrequent Access (IA) có giá storage thấp hơn ($0.01 vs $0.015), nhưng:
- Không có free tier.
- Class A và Class B operations đắt gấp đôi.
- Phí retrieval $0.01/GB.
- Thời hạn lưu trữ tối thiểu 30 ngày. Nếu xóa sớm hơn, bạn vẫn bị tính phí như lưu đủ 30 ngày.
IA phù hợp cho cold data — backup ít truy cập, archive, log cũ. Không nên dùng cho file được đọc thường xuyên.
Hướng dẫn thiết lập Cloudflare R2 từ con số 0
Dưới đây là hướng dẫn đầy đủ, cập nhật theo giao diện Cloudflare Dashboard hiện tại. Bạn sẽ tạo bucket, lấy credentials, bật public access và kết nối bằng code JavaScript (Node.js) chạy được ngay.
Bước 1: Tạo tài khoản và kích hoạt R2
- Truy cập https://dash.cloudflare.com/sign-up và tạo tài khoản (hoặc đăng nhập nếu đã có).
- Trong Dashboard, chọn Storage & Databases > R2 Object Storage > Overview.
- Click Purchase R2 hoặc Get Started để kích hoạt. R2 có free tier nên bạn không cần nhập thẻ tín dụng ngay lập tức để bắt đầu.
Bước 2: Tạo Bucket
- Trong R2 Overview, click Create Bucket.
- Bucket name: Nhập tên duy nhất toàn cầu, ví dụ
my-project-assets-2026. Chỉ dùng chữ thường, số và dấu gạng ngang. - Location: Chọn Automatic để Cloudflare phân phối tự động, hoặc chọn region gần người dùng nhất (APAC cho Việt Nam).
- Click Create Bucket.
Bước 3: Bật Public Access (tùy chọn nhưng nên làm)
Nếu bạn muốn người dùng cuối truy cập trực tiếp file qua URL (ảnh, video, PDF), cần bật public access:
- Vào bucket vừa tạo, chọn tab Settings.
- Kéo xuống phần Public Development URL (r2.dev).
- Click Enable. Một popup yêu cầu gõ
allowđể xác nhận. - Sau khi bật, bạn sẽ nhận được URL dạng:
https://pub-xxxxxxxxxxxxx.r2.dev. Lưu lại — đây là base URL để truy cập file công khai.
Hoặc dùng Custom Domain (nâng cao): Trong tab Public Access, click Connect Domain, nhập domain của bạn (ví dụ cdn.yoursite.com) và làm theo hướng dẫn DNS. Custom domain có lợi thế SEO và branding hơn r2.dev.
Bước 4: Tạo API Token và lấy credentials
Đây là bước quan trọng nhất để kết nối R2 từ code hoặc CLI.
- Trong R2 Overview, click Manage API Tokens (hoặc vào bucket > Settings > R2 API Tokens).
- Click Create API Token.
- Token name: Đặt tên dễ nhớ, ví dụ
my-app-r2-access. - Permissions: Chọn Admin Read & Write nếu app cần upload và download. Chọn Admin Read only nếu chỉ cần đọc.
- TTL: Để Forever nếu dùng cho production, hoặc đặt thời hạn nếu cần bảo mật cao hơn.
- Click Create API Token.
- SAO CHÉP NGAY ba giá trị sau (chỉ hiển thị một lần):
- Access Key ID
- Secret Access Key
- Account ID
Lấy S3 API Endpoint:
Endpoint của bạn có dạng:
https://{ACCOUNT_ID}.r2.cloudflarestorage.comThay {ACCOUNT_ID} bằng Account ID vừa copy. Ví dụ:
https://a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6.r2.cloudflarestorage.comBước 5: Upload và download file bằng Node.js (chạy được ngay)
Cài đặt AWS SDK v3 (R2 tương thích S3 API):
npm init -y
npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presignerTạo file r2.js:
import { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import { readFileSync } from "fs";
// Cấu hình R2 client
const R2 = new S3Client({
region: "auto",
endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
},
});
const BUCKET_NAME = process.env.R2_BUCKET_NAME;
// 1. Upload file lên R2
async function uploadFile(filePath, key) {
const fileBuffer = readFileSync(filePath);
const command = new PutObjectCommand({
Bucket: BUCKET_NAME,
Key: key,
Body: fileBuffer,
ContentType: "image/jpeg", // Thay đổi theo loại file
});
await R2.send(command);
console.log(`Uploaded: ${key}`);
}
// 2. Tạo presigned URL để chia sẻ file (có thời hạn)
async function getPresignedUrl(key, expiresIn = 3600) {
const command = new GetObjectCommand({
Bucket: BUCKET_NAME,
Key: key,
});
const url = await getSignedUrl(R2, command, { expiresIn });
console.log(`Presigned URL (expires in ${expiresIn}s): ${url}`);
return url;
}
// 3. Liệt kê file trong bucket
async function listFiles() {
const command = new ListObjectsV2Command({
Bucket: BUCKET_NAME,
MaxKeys: 10,
});
const response = await R2.send(command);
console.log("Files:", response.Contents?.map(c => c.Key) || []);
}
// 4. Chạy demo
async function main() {
try {
await uploadFile("./photo.jpg", "uploads/photo.jpg");
await getPresignedUrl("uploads/photo.jpg", 3600);
await listFiles();
} catch (err) {
console.error("Error:", err);
}
}
main();Tạo file .env trong cùng thư mục:
R2_ACCOUNT_ID=your-account-id-here
R2_ACCESS_KEY_ID=your-access-key-id
R2_SECRET_ACCESS_KEY=your-secret-access-key
R2_BUCKET_NAME=your-bucket-nameChạy:
node r2.jsNếu bạn đã bật public access qua r2.dev hoặc custom domain, file sẽ có thể truy cập trực tiếp qua URL:
https://pub-xxxxxxxxxxxxx.r2.dev/uploads/photo.jpgBước 6: Kết nối R2 với Wrangler CLI (tùy chọn)
Nếu bạn đang dùng Cloudflare Workers, Wrangler CLI là cách tốt nhất để tương tác với R2:
# Cài đặt Wrangler
npm install -g wrangler
# Đăng nhập
npx wrangler login
# Tạo bucket
npx wrangler r2 bucket create my-bucket
# Upload file
npx wrangler r2 object put my-bucket/file.txt --file ./file.txt
# Liệt kê file
npx wrangler r2 object list my-bucketBước 7: Cấu hình với các framework phổ biến
Next.js (App Router):
// app/api/upload/route.js
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({
region: "auto",
endpoint: process.env.R2_ENDPOINT,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
},
});
export async function POST(request) {
const formData = await request.formData();
const file = formData.get("file");
const buffer = Buffer.from(await file.arrayBuffer());
await s3.send(new PutObjectCommand({
Bucket: process.env.R2_BUCKET_NAME,
Key: `uploads/${file.name}`,
Body: buffer,
ContentType: file.type,
}));
return Response.json({
url: `${process.env.R2_PUBLIC_URL}/uploads/${file.name}`
});
}WordPress (với plugin Offload Media):
- Cài plugin Offload Media hoặc WP Offload Media.
- Vào Settings, chọn Cloudflare R2 làm provider.
- Nhập Account ID, Access Key, Secret Key.
- Chọn bucket đã tạo.
- Click Verify Credentials rồi Save.
Những điều cần nhớ khi dùng R2
- Egress free nhưng Class B không free vượt ngưỡng. Mỗi lần người dùng xem ảnh trên R2 là một GetObject = Class B. Dưới 10 triệu/tháng thì miễn phí, nhưng nếu website có hàng trăm triệu impressions, Class B sẽ tính phí.
- Không có độ trễ zero. R2 không phải CDN cache edge-to-edge như Cloudflare Images. File được lưu trên R2 và serve qua Cloudflare network, nhưng lần đọc đầu tiên từ một edge location có thể chậm hơn một chút so với cache hit.
- R2.dev subdomain không nên dùng cho production lâu dài. Nên gắn custom domain để kiểm soát hoàn toàn URL và tránh phụ thuộc vào subdomain của Cloudflare.
- Infrequent Access không có free tier. Đừng chuyển sang IA nếu bạn đang cố tận dụng free tier.
- Delete operations miễn phí. Bạn có thể xóa thoải mái mà không bị tính phí operations.
Kết luận
Cloudflare R2 là một trong những object storage tốt nhất cho developer indie, startup và bất kỳ ai cần serve file với chi phí dễ dự đoán. Free tier 10 GB + 10 triệu Class B requests + egress miễn phí vĩnh viễn đủ để chạy portfolio, blog, dev environment hoặc thậm chí small SaaS trong giai đoạn đầu.
Điểm mạnh thực sự của R2 không phải storage rẻ hơn S3 (chỉ rẻ hơn một chút), mà là việc loại bỏ hoàn toàn phí egress — khoản chi phí thường chiếm 80-90% bill object storage truyền thống. Nếu ứng dụng của bạn có nhiều người dùng download, xem media, hoặc truy cập file thường xuyên, R2 có thể giảm bill hàng tháng từ hàng trăm đô xuống chỉ còn vài đô.
Hãy bắt đầu bằng cách tạo một bucket, chạy đoạn code Node.js ở trên, và upload file đầu tiên. Nếu bạn đã dùng S3 trước đây, việc chuyển sang R2 gần như không cần thay đổi code — chỉ cần thay endpoint và credentials.

Bình luận