Cấu hình R2 Storage

Advanced

Tích hợp Cloudflare R2 Object Storage để lưu trữ file cấu hình OpenVPN một cách hiệu quả, tiết kiệm chi phí và dễ dàng quản lý.

Tại sao sử dụng R2 Storage?

Khi hệ thống có quá nhiều người dùng, việc lưu trữ file cấu hình trực tiếp trên các node OpenVPN gặp nhiều thách thức:

Vấn đề

  • ❌ Tốn nhiều dung lượng trên từng node
  • ❌ Khó khăn trong việc quản lý và đồng bộ
  • ❌ Node tập trung vào network, không có storage tốt
  • ❌ Phức tạp khi scale nhiều node

Giải pháp R2

  • ✅ Chi phí thấp (10GB miễn phí/tháng)
  • ✅ Truy cập nhanh qua CDN toàn cầu
  • ✅ Quản lý tập trung, dễ dàng backup
  • ✅ Không giới hạn băng thông

Các biến môi trường cần cấu hình

Sau khi cài đặt OV-Panel, bạn cần thêm các biến môi trường sau vào file .env:

.env
# Cloudflare R2 Storage Configuration
R2_ACCESS_KEY_ID=your_r2_access_key_id
R2_SECRET_ACCESS_KEY=your_r2_secret_access_key
R2_BUCKET_NAME=your_r2_bucket_name

# R2 Endpoint - Chỉ cần Account ID
# Định dạng đầy đủ: https://your_account_id.r2.cloudflarestorage.com
# Chỉ lấy phần your_account_id trước .r2.cloudflarestorage.com
R2_ACCOUNT_ID=your_cloudflare_account_id

# R2 Public URL base (domain tùy chỉnh để download file .ovpn)
R2_PUBLIC_BASE_URL=api.openvpn.panel

# R2 Download token (token bảo mật cho việc download)
# ⚠️ Thay đổi token mặc định này ngay lập tức!
R2_DOWNLOAD_TOKEN=8638b5a1-77df-4d24-8253-58977fa508a4

Hướng dẫn cấu hình từng bước

1

Tạo R2 Bucket trên Cloudflare

Đăng nhập Cloudflare Dashboard và tạo bucket lưu trữ mới:

  1. 1. Truy cập Cloudflare Dashboard
  2. 2. Chọn R2 từ menu bên trái
  3. 3. Click Create bucket
  4. 4. Đặt tên bucket (ví dụ: openvpn-configs)
  5. 5. Chọn location gần với người dùng của bạn
  6. 6. Click Create bucket
2

Tạo API Token cho R2

Tạo credentials để ứng dụng có thể truy cập R2:

Bước 1: Truy cập Account Details

Trong R2 Dashboard, click vào Manage R2 API Tokens hoặc vào Account Details → R2 API Tokens

R2 Account Details

Bước 2: Create API Token

Click Create API Token để tạo credentials mới

Create API Token

Bước 3: Cấu hình permissions

  • Permission
    Object Read & Write - Cho phép đọc, ghi và list objects
  • Scope
    Apply to specific buckets only - Chọn bucket đã tạo ở bước 1
Configure Permissions

Bước 4: Lưu credentials

Save Credentials

Sao chép Access Key IDSecret Access Key để điền vào:

  • R2_ACCESS_KEY_ID
  • R2_SECRET_ACCESS_KEY
3

Lấy thông tin Bucket và Account ID

Trở lại trang Settings của bucket để lấy thông tin còn lại:

Bucket Settings

Account ID

Từ S3 API endpoint:

https://eba7a4693383ce39f359229132d1111f.r2.cloudflarestorage.com/openvpn

Lấy phần trước .r2.cloudflarestorage.com:

R2_ACCOUNT_ID=eba7a4693383ce39f359229132d1111f

Public Domain

Từ phần Public R2.dev Bucket URL hoặc Custom Domain:

https://pub-xxx.r2.dev

Hoặc cấu hình custom domain (khuyến nghị):

R2_PUBLIC_BASE_URL=api.openvpn.panel
4

Cấu hình Custom Domain (Tùy chọn nhưng khuyến nghị)

Sử dụng domain riêng của bạn thay vì r2.dev mặc định:

  1. 1. Trong Bucket Settings, tìm mục Custom Domains
  2. 2. Click Connect Domain
  3. 3. Nhập subdomain (ví dụ: api.openvpn.panel)
  4. 4. Cloudflare sẽ tự động tạo DNS record
  5. 5. Đợi vài phút để DNS propagate
5

Cấu hình bảo mật với Firewall Rules

Bảo vệ file cấu hình bằng token authentication:

Vì R2 bucket với custom domain sẽ public, chúng ta cần thêm WAF rule để chỉ cho phép request có token hợp lệ:

Bước 1: Tạo WAF Custom Rule

  1. 1. Vào domain quản lý trên Cloudflare Dashboard
  2. 2. Chọn Security → WAF → Custom rules
  3. 3. Click Create rule
Firewall Rule

Bước 2: Cấu hình Rule Expression

Expression
(http.host eq "api.openvpn.panel" and not http.request.uri.query contains "token=8638b5a1-77df-4d24-8253-58977fa508a4")

Giải thích:

  • → Áp dụng cho domain api.openvpn.panel
  • → Chặn tất cả request không có ?token=YOUR_TOKEN
  • → Action: Block

Cách hoạt động

❌ Bị chặn

https://api.openvpn.panel/user123.ovpn

✅ Cho phép

https://api.openvpn.panel/user123.ovpn?token=YOUR_TOKEN
6

Cập nhật biến môi trường và khởi động lại

Hoàn tất cấu hình và áp dụng thay đổi:

Mở file .env

Terminal
nano /opt/ov-node/.env

Thêm/cập nhật các biến sau

.env
# Cloudflare R2 Storage Configuration
R2_ACCESS_KEY_ID=abc123xyz456def789ghi012
R2_SECRET_ACCESS_KEY=jkl345mno678pqr901stu234vwx567yz
R2_BUCKET_NAME=openvpn-configs
R2_ACCOUNT_ID=eba7a4693383ce39f359229132d1111f
R2_PUBLIC_BASE_URL=api.openvpn.panel
R2_DOWNLOAD_TOKEN=f7b3c2e1-9a8d-4f3e-b2c1-a0d9e8f7c6b5

Khởi động lại dịch vụ

Terminal
# Khởi động lại backend để load biến môi trường mới
systemctl restart ov-node

# Kiểm tra trạng thái
systemctl status ov-node

Kiểm tra cấu hình

Sau khi hoàn tất các bước trên, hãy kiểm tra xem R2 Storage đã hoạt động chưa:

1. Test Upload

  1. 1. Đăng nhập vào OV-Panel
  2. 2. Tạo một user mới hoặc cập nhật user hiện có
  3. 3. Kiểm tra Cloudflare R2 Dashboard → Bucket của bạn
  4. 4. Xác nhận file .ovpn đã được upload lên R2

2. Test Download

  1. 1. Trong OV-Panel, click nút download config của user
  2. 2. URL sẽ có dạng: https://api.openvpn.panel/user123.ovpn?token=YOUR_TOKEN
  3. 3. File nên download thành công
  4. 4. Nếu bỏ ?token=..., request sẽ bị chặn bởi WAF

Troubleshooting

❌ Lỗi: "Access Denied" khi upload file

Nguyên nhân: API Token không có đủ quyền hoặc sai bucket.

Giải pháp:

  • Kiểm tra API Token có quyền Object Read & Write
  • Xác nhận token được apply cho đúng bucket (R2_BUCKET_NAME)
  • Thử tạo token mới với full permissions
❌ Lỗi: "InvalidAccessKeyId"

Nguyên nhân: Sai R2_ACCESS_KEY_ID hoặc R2_SECRET_ACCESS_KEY.

Giải pháp:

  • Kiểm tra lại credentials trong file .env
  • Đảm bảo không có khoảng trắng thừa
  • Tạo API Token mới nếu cần
❌ Lỗi: "NoSuchBucket"

Nguyên nhân: Sai tên bucket hoặc bucket không tồn tại.

Giải pháp:

  • Kiểm tra R2_BUCKET_NAME khớp với tên bucket trên Cloudflare
  • Bucket name phân biệt chữ hoa/thường
  • Xác nhận bucket đã được tạo thành công
❌ Download bị chặn dù có token

Nguyên nhân: WAF rule không khớp với token trong .env.

Giải pháp:

  • Đảm bảo R2_DOWNLOAD_TOKEN trong .env khớp với token trong WAF rule
  • Kiểm tra WAF rule đang enabled
  • Xem Cloudflare Firewall Events để debug
❌ Download thành công nhưng không có token

Nguyên nhân: WAF rule chưa được áp dụng hoặc expression sai.

Giải pháp:

  • Kiểm tra Custom Domain đã connect đúng chưa
  • Xác nhận WAF rule đang ở trạng thái Deployed
  • Đợi vài phút để rule propagate
  • Test với curl: curl https://api.openvpn.panel/test.txt (phải bị chặn)

Chi phí dự kiến

Cloudflare R2 có mức giá rất cạnh tranh, phù hợp cho mọi quy mô:

Bảng giá R2 Storage

Storage$0.015/GB/tháng (10GB đầu tiên FREE)
Class A Operations (Write)$4.50/triệu request (1 triệu đầu FREE)
Class B Operations (Read)$0.36/triệu request (10 triệu đầu FREE)
Egress Bandwidth
MIỄN PHÍ 100%

Tài liệu tham khảo