CarrierWave tách model khỏi storage backend, nhưng abstraction không xóa trách nhiệm cấu hình S3.
1 | # config/initializers/carrierwave.rb |
Trên AWS, SDK/Fog nên nhận credential từ IAM role. Local có thể dùng profile hoặc environment; không commit access key.
Uploader
1 | class DocumentUploader < CarrierWave::Uploader::Base |
Allowlist extension/MIME chỉ là lớp đầu; metadata client có thể giả. File không tin cậy cần scan và không nên public trước khi processing hoàn tất.
URL private
Với fog_public = false, tạo URL có thời hạn thay vì mở bucket:
1 | record.file.url(expires: 10.minutes.from_now.to_i) |
API cụ thể phụ thuộc adapter/version; test integration thay vì đoán option từ blog cũ.
Processing
Resize/convert ảnh tốn CPU và memory. Đưa version processing nặng sang background job, giữ original private, và invalidate/version CDN khi object thay đổi.
Khi nào dùng Active Storage?
Rails hiện đại có Active Storage, direct upload, variants và service adapter tích hợp framework. CarrierWave vẫn hợp lý cho project đang dùng ổn định hoặc cần uploader DSL cụ thể. Migration chỉ vì “core Rails nghe sang hơn” cũng có thể tạo incident rất core.
Checklist
- IAM least privilege, bucket private.
- Credential ngoài source.
- Randomized key và filename sanitization.
- Size/type validation + malware scanning khi cần.
- Background processing.
- Lifecycle rule cho temporary/orphan objects.
- CDN và cache strategy rõ ràng.