Cấu hình R2 Storage
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:
# 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-58977fa508a4R2_DOWNLOAD_TOKEN mặc định bằng một UUID ngẫu nhiên. Token này được dùng để bảo vệ các file cấu hình khỏi truy cập trái phép.Hướng dẫn cấu hình từng bước
Tạo R2 Bucket trên Cloudflare
Đăng nhập Cloudflare Dashboard và tạo bucket lưu trữ mới:
- 1. Truy cập Cloudflare Dashboard
- 2. Chọn R2 từ menu bên trái
- 3. Click Create bucket
- 4. Đặt tên bucket (ví dụ:
openvpn-configs) - 5. Chọn location gần với người dùng của bạn
- 6. Click Create bucket
R2_BUCKET_NAMETạ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
Bước 2: Create API Token
Click Create API Token để tạo credentials mới
Bước 3: Cấu hình permissions
- PermissionObject Read & Write - Cho phép đọc, ghi và list objects
- ScopeApply to specific buckets only - Chọn bucket đã tạo ở bước 1
Bước 4: Lưu credentials
Sao chép Access Key ID và Secret Access Key để điền vào:
- →
R2_ACCESS_KEY_ID - →
R2_SECRET_ACCESS_KEY
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:
Account ID
Từ S3 API endpoint:
https://eba7a4693383ce39f359229132d1111f.r2.cloudflarestorage.com/openvpnLấy phần trước .r2.cloudflarestorage.com:
R2_ACCOUNT_ID=eba7a4693383ce39f359229132d1111fPublic Domain
Từ phần Public R2.dev Bucket URL hoặc Custom Domain:
https://pub-xxx.r2.devHoặc cấu hình custom domain (khuyến nghị):
R2_PUBLIC_BASE_URL=api.openvpn.panelCấ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. Trong Bucket Settings, tìm mục Custom Domains
- 2. Click Connect Domain
- 3. Nhập subdomain (ví dụ:
api.openvpn.panel) - 4. Cloudflare sẽ tự động tạo DNS record
- 5. Đợi vài phút để DNS propagate
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. Vào domain quản lý trên Cloudflare Dashboard
- 2. Chọn Security → WAF → Custom rules
- 3. Click Create rule
Bước 2: Cấu hình Rule 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
8638b5a1-77df-4d24-8253-58977fa508a4 bằng token tùy chỉnh của bạn (giá trị của R2_DOWNLOAD_TOKEN)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_TOKENCậ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
nano /opt/ov-node/.envThêm/cập nhật các biến sau
# 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-a0d9e8f7c6b5Khởi động lại dịch vụ
# 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-nodeKiể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. Đăng nhập vào OV-Panel
- 2. Tạo một user mới hoặc cập nhật user hiện có
- 3. Kiểm tra Cloudflare R2 Dashboard → Bucket của bạn
- 4. Xác nhận file
.ovpnđã được upload lên R2
2. Test Download
- 1. Trong OV-Panel, click nút download config của user
- 2. URL sẽ có dạng:
https://api.openvpn.panel/user123.ovpn?token=YOUR_TOKEN - 3. File nên download thành công
- 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_NAMEkhớ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_TOKENtrong.envkhớ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ô:
