-
Notifications
You must be signed in to change notification settings - Fork 66
Open
Description
Cannot run cronjobs with next app router

import { createClient } from "@/lib/supabase/server";
import { spawn } from "child_process";
import { revalidateTag } from "next/cache";
import { CronJob } from "quirrel/next";
const backupDbCronJob = CronJob(
"api/crons/backup-db",
["* * * * *", "Asia/Bangkok"], // every minute in Bangkok time
async () => {
// do something
const timestamp = new Date().getTime();
const fileName = `backup_yan-cycles_${timestamp}.sql`;
const bucket = process.env.NEXT_PUBLIC_STORAGE_BUCKET!;
const fullPath = `backups/${fileName}`;
const connectionString = process.env.NEXT_PRIVATE_DB_URL;
return new Promise(async (resolve, reject) => {
const pgDump = spawn("pg_dump", [
`--dbname=${connectionString}`,
"-F",
"p",
]);
let dumpData = "";
let errorData = "";
pgDump.stdout.on("data", (data) => {
dumpData += data.toString();
});
pgDump.stderr.on("data", (data) => {
errorData += data.toString();
});
pgDump.on("close", async (code) => {
if (code !== 0) {
console.error("Backup process failed:", errorData);
pgDump.kill(); // Đảm bảo process đóng nếu có vấn đề
return reject(new Error(`pg_dump exited with code: ${code}`));
}
try {
const supabaseAdmin = createClient({ admin: true });
const { data, error } = await supabaseAdmin.storage
.from(bucket)
.upload(fullPath, Buffer.from(dumpData), {
contentType: "application/sql",
upsert: false,
});
if (error) {
console.error("Upload failed:", error);
pgDump.kill(); // Đảm bảo process đóng nếu upload thất bại
return reject(new Error("Upload to Supabase failed"));
}
console.log("Upload backup file successful:", data);
revalidateTag(process.env.NEXT_PUBLIC_STORAGE_BUCKET!);
pgDump.kill(); // Đảm bảo đóng process sau khi thành công
resolve();
} catch (err) {
console.error("Unexpected error:", err);
pgDump.kill(); // Đảm bảo process đóng nếu có exception
reject(err);
}
});
});
}
);
export const POST = backupDbCronJob;
Metadata
Metadata
Assignees
Labels
No labels