Skip to content

Cannot run cronjobs with next app router #1187

@rindev0901

Description

@rindev0901

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;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions