- 
                Notifications
    
You must be signed in to change notification settings  - Fork 67
 
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