import { useState } from "react"; import { startMigration, getProgress } from "../api"; export default function PostgreSQLS3Migrator() { const [srcHost, setSrcHost] = useState(""); const [srcUser, setSrcUser] = useState(""); const [srcPass, setSrcPass] = useState(""); const [dbName, setDbName] = useState(""); const [destBucket, setDestBucket] = useState(""); const [awsAccess, setAwsAccess] = useState(""); const [awsSecret, setAwsSecret] = useState(""); const [progress, setProgress] = useState({ percent: 0, message: "Waiting to start..." }); const handleMigration = async () => { const payload = { DB_HOST: srcHost, DB_USER: srcUser, DB_PASS: srcPass, DB_NAME: dbName, DEST_BUCKET: destBucket, DEST_ENDPOINT: "https://s3.amazonaws.com", DEST_ACCESS: awsAccess, DEST_SECRET: awsSecret }; try { const data = await startMigration("psql_s3", payload); if (data.success) { pollProgress(); } else { alert("Migration failed: " + (data.error || "Unknown error")); } } catch (error) { console.error("Error starting migration:", error); alert("Connection error: " + error.message); } }; const pollProgress = async () => { try { const data = await getProgress("psql_s3"); setProgress(data); if (data.status === "error") { alert("Migration error: " + (data.message || "Unknown error")); } else if (data.percent < 100 && data.status !== "completed") { setTimeout(pollProgress, 2000); } } catch (error) { console.error("Error polling progress:", error); setTimeout(pollProgress, 2000); } }; return (

PostgreSQL → S3 Migration

Export PostgreSQL database to a compressed file in S3.

{/* PostgreSQL Database */}

PostgreSQL Database

setSrcHost(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setSrcUser(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setSrcPass(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setDbName(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* S3 Target */}

S3 Target

setDestBucket(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setAwsAccess(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setAwsSecret(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Migration Button */}
{/* Progress */}

Progress

          {JSON.stringify(progress, null, 2)}
        
); }