quirrel icon indicating copy to clipboard operation
quirrel copied to clipboard

Cannot run cronjobs with next app router

Open rindev0901 opened this issue 7 months ago • 0 comments

Cannot run cronjobs with next app router

Image
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;

rindev0901 avatar Jul 15 '25 04:07 rindev0901