Setiap aplikasi butuh simpan file — gambar user, documents, videos, backups. Tapi simpan file di server sendiri itu ribet: manage disk space, handle backup, dan scaling susah.
Sekarang ada cara yang lebih mudah.
Helipod sekarang terintegrasi dengan S3-compatible object storage — termasuk AWS S3, Cloudflare R2, dan provider lainnya. Dengan integrasi ini, kamu bisa upload dan serve file ke cloud storage yang scalable dan cost-effective.
Kenapa Object Storage?
Masalah File Storage Traditional
Server kamu:
├── public/
│ ├── uploads/
│ │ ├── user-123-avatar.jpg (2MB)
│ │ ├── user-456-photo.png (5MB)
│ │ └── document-789.pdf (10MB)
│ └── total: 50GB
└── Disk: 100GB (50% used)
Masalah:
- Disk space terbatas
- Backup ribet
- Scaling susah
- CDN ga ada
- Cost tinggi
Solusi Object Storage
Cloud Storage (S3/R2):
├── Buckets: helipod-uploads
├── Files: 100,000+ objects
├── Storage: 5TB
├── Bandwidth: Unlimited
└── Cost: $0.023/GB/bulan
Hasilnya:
- Storage unlimited
- Backup otomatis
- Scaling otomatis
- CDN built-in
- Cost rendah
Kenapa S3-Compatible?
| Provider | Storage Cost | Bandwidth | Free Tier |
|---|---|---|---|
| AWS S3 | $0.023/GB | $0.09/GB | 5GB/12 bulan |
| Cloudflare R2 | $0.015/GB | Gratis | 10GB gratis |
| DigitalOcean Spaces | $5/bulan | Gratis | 100GB |
Keunggulan S3-Compatible
- Standard API — Sama untuk semua provider
- Migrasi mudah — Pindah provider tanpa ubah kode
- Cost-effective — Bayar sesuai pemakaian
- Scalable — Tanpa batas
- Reliable — 99.999999999% durability
Cara Integrasi S3 ke Helipod
Langkah 1: Pilih Provider
Opsi A: Cloudflare R2 (Recommended)
- Buka dash.cloudflare.com
- Masuk ke R2 Object Storage
- Klik Create bucket
- Catat Account ID, Access Key, dan Secret Key
Opsi B: AWS S3
- Buka AWS Console
- Masuk ke S3
- Klik Create bucket
- Buat IAM User dengan akses S3
- Catat Access Key dan Secret Key
Opsi C: DigitalOcean Spaces
- Buka cloud.digitalocean.com
- Masuk to Spaces
- Klik Create Spaces
- Catat Endpoint, Access Key, dan Secret Key
Langkah 2: Connect ke Helipod
- Buka project Helipod
- Masuk ke Settings → Integrations
- Cari Object Storage (S3) dan klik Connect
- Isi konfigurasi:
S3_ENDPOINT=https://xxx.r2.cloudflarestorage.com
S3_BUCKET=helipod-uploads
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
Langkah 3: Test Upload
Buka Storage Playground di Helipod:
- Masuk ke Project → Object Storage
- Upload test file
- Copy URL file yang di-upload
Jika berhasil, integrasi sudah siap!
Fitur Unggulan
File Browser
┌─────────────────────────────────────────┐
│ Bucket: helipod-uploads │
├─────────────────────────────────────────┤
│ 📁 uploads/ │
│ ├── 📁 users/ │
│ │ ├── 🖼️ user-123-avatar.jpg (2MB) │
│ │ └── 🖼️ user-456-photo.png (5MB) │
│ └── 📁 documents/ │
│ └── 📄 contract-789.pdf (10MB) │
│ 📁 backups/ │
│ └── 📦 backup-2026-06-17.tar.gz │
├─────────────────────────────────────────┤
│ Storage: 2.3GB / Unlimited │
│ Files: 1,234 │
└─────────────────────────────────────────┘
- Visual browser — Lihat semua files dan folders
- Upload drag-and-drop — Upload file dengan mudah
- Preview — Lihat gambar dan documents
- Download — Download files langsung
URL Management
File: uploads/users/user-123-avatar.jpg
Public URL:
https://helipod-uploads.r2.dev/uploads/users/user-123-avatar.jpg
Signed URL (expiring):
https://helipod-uploads.r2.dev/uploads/users/user-123-avatar.jpg?X-Amz-...
- Public URLs — Untuk files yang public
- Signed URLs — Untuk files yang perlu auth
- Custom domains — Domain sendiri untuk URLs
Usage Analytics
Di Helipod dashboard, kamu bisa lihat:
- Storage usage — Total storage terpakai
- Bandwidth — Total bandwidth terpakai
- File count — Jumlah files
- Cost estimate — Estimasi cost bulanan
Use Cases
1. User Avatar Upload
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
const s3 = new S3Client({
endpoint: process.env.S3_ENDPOINT,
region: 'auto',
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY,
secretAccessKey: process.env.S3_SECRET_KEY,
},
});
async function uploadAvatar(userId, file) {
const key = `users/${userId}/avatar-${Date.now()}.jpg`;
await s3.send(new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: key,
Body: file.buffer,
ContentType: file.mimetype,
}));
return `https://${process.env.S3_BUCKET}.r2.dev/${key}`;
}
2. Document Storage
async function uploadDocument(userId, document) {
const key = `documents/${userId}/${document.name}`;
await s3.send(new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: key,
Body: document.buffer,
ContentType: document.mimetype,
Metadata: {
'user-id': userId,
'upload-date': new Date().toISOString(),
},
}));
return { key, url: `https://${process.env.S3_BUCKET}.r2.dev/${key}` };
}
3. Backup Storage
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
async function backupDatabase() {
// Dump database
await execAsync('pg_dump mydb > backup.sql');
// Upload ke S3
const key = `backups/db-${Date.now()}.sql`;
const backup = fs.readFileSync('backup.sql');
await s3.send(new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: key,
Body: backup,
}));
console.log(`Backup uploaded: ${key}`);
}
4. Static Asset Hosting
// Serve static assets dari S3
const assets = {
logo: 'https://helipod-uploads.r2.dev/assets/logo.png',
favicon: 'https://helipod-uploads.r2.dev/assets/favicon.ico',
css: 'https://helipod-uploads.r2.dev/assets/styles.css',
};
Best Practices
1. Organize Files dengan Folders
bucket/
├── users/
│ └── {user-id}/
│ ├── avatar.jpg
│ └── profile/
├── documents/
│ └── {user-id}/
│ └── {document-id}.pdf
├── uploads/
│ └── {date}/
│ └── {filename}
└── backups/
└── {date}/
└── backup.tar.gz
2. Gunakan Content-Type yang Benar
// Set content-type untuk setiap file
const contentTypes = {
'.jpg': 'image/jpeg',
'.png': 'image/png',
'.pdf': 'application/pdf',
'.mp4': 'video/mp4',
};
await s3.send(new PutObjectCommand({
Bucket: process.env.S3_BUCKET,
Key: key,
Body: file.buffer,
ContentType: contentTypes[ext] || 'application/octet-stream',
}));
3. Implementasi CDN
// Cloudflare R2 sudah include CDN
// URL langsung cepat dari edge locations
const fileUrl = `https://${bucket}.r2.dev/${key}`;
4. Set Lifecycle Rules
Di Cloudflare R2:
- Files di /temp/ → Auto-delete setelah 7 hari
- Files di /backups/ → Keep selamanya
- Files di /uploads/ → Keep selamanya
FAQ
Berapa biaya S3-compatible storage?
Cloudflare R2 (Recommended):
- Storage: $0.015/GB/bulan
- Bandwidth: GRATIS
- Free tier: 10GB
AWS S3:
- Storage: $0.023/GB/bulan
- Bandwidth: $0.09/GB
- Free tier: 5GB/12 bulan
Bagaimana cara migrasi dari provider lain?
Kamu bisa menggunakan tools seperti rclone atau aws s3 sync untuk migrasi:
# Migrasi dari S3 ke R2
rclone sync s3:old-bucket s3:new-bucket \
--s3-endpoint=https://xxx.r2.cloudflarestorage.com
Apakah ada batasan file size?
Bergantung pada provider:
- Cloudflare R2: Max 5TB per object
- AWS S3: Max 5TB per object
Bagaimana keamanan files?
- Gunakan signed URLs untuk files privat
- Set bucket policies untuk akses
- Enable versioning untuk backup
- Gunakan encryption untuk data sensitif
Checklist Setup
- Pilih provider (R2/S3/DO Spaces)
- Buat bucket
- Buat access keys
- Connect ke Helipod
- Test upload
- Setup folder structure
- Implementasi CDN
- Monitor usage
Kesimpulan
Object storage dengan S3-compatible + Helipod adalah solusi untuk file storage yang scalable, reliable, dan cost-effective. Kamu bisa:
- ✅ Upload files dari dashboard
- ✅ Generate public/signed URLs
- ✅ Gunakan CDN built-in
- ✅ Bayar sesuai pemakaian
- ✅ Scale tanpa batas
Butuh bantuan setup? Hubungi [email protected]
Baca juga: