Panduan Migrasi Praktis

Migrasi dari Cloudinary ke Cloudizero

Cara memindahkan aset media Anda dari Cloudinary ke penyimpanan Zero-Egress Cloudizero tanpa downtime dan memotong biaya bandwidth hingga 85%.

1. Mengapa Tim Beralih dari Cloudinary?

Cloudinary (Legacy)

Biaya berbasis kredit transformasi yang rumit, kuota bandwidth ketat, dan dashboard teknis yang membingungkan bagi tim non-engineer.

Cloudizero (Zero-Egress)

100% bebas biaya bandwidth egress selamanya, upload presigned langsung, dan antarmuka sefamiliar Google Drive untuk tim konten.

2. Skrip Migrasi Otomatis (Batch Stream)

Skrip Node.js/TypeScript berikut mengambil stream langsung dari URL Cloudinary dan mengunggahnya ke Cloudizero melalui @cloudizero/sdk tanpa membebani disk lokal:

scripts/migrate-from-cloudinary.ts
// scripts/migrate-from-cloudinary.ts
import { Cloudizero } from "@cloudizero/sdk";

const cz = new Cloudizero({
  apiKey: process.env.CLOUDIZERO_API_KEY!,
});

interface CloudinaryAsset {
  publicId: string;
  url: string;
  fileName: string;
  mimeType: string;
  folder?: string;
}

/**
 * Streams assets directly from Cloudinary URLs into Cloudizero Zero-Egress Storage
 * without saving heavy files to your local disk.
 */
export async function migrateAssetToCloudizero(asset: CloudinaryAsset) {
  console.log(`Fetching ${asset.fileName} from Cloudinary...`);
  
  // 1. Fetch binary stream from Cloudinary
  const response = await fetch(asset.url);
  if (!response.ok) throw new Error(`Failed to fetch ${asset.url}`);
  const buffer = Buffer.from(await response.arrayBuffer());

  // 2. Upload directly to Cloudizero Project & Folder
  const uploaded = await cz.storage.upload({
    file: buffer,
    fileName: asset.fileName,
    mimeType: asset.mimeType,
    projectId: process.env.CLOUDIZERO_PROJECT_ID!,
  });

  console.log(`✅ Migrated! Cloudizero CDN: ${uploaded.url} ($0.00 egress)`);
  return uploaded;
}

3. Memperbarui Tautan di Frontend

Gantikan URL Cloudinary dengan domain CDN resmi Cloudizero:

lib/media.ts
// lib/media.ts
/**
 * Simple helper to transition from Cloudinary URL pattern to Cloudizero Global CDN
 */
export function getOptimizedMediaUrl(pathOrUrl: string): string {
  if (pathOrUrl.startsWith("https://res.cloudinary.com/")) {
    const filename = pathOrUrl.split("/").pop();
    return `https://cdn.cloudizero.com/demo/${filename}`;
  }
  return pathOrUrl;
}