diff --git a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx index cbc363dcd..acfd241ff 100644 --- a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx +++ b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx @@ -200,9 +200,7 @@ export const ShowBilling = () => { { await updateInvoiceNotifications({ enabled: checked, diff --git a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx index ab2d13720..9f837d550 100644 --- a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx @@ -73,9 +73,13 @@ export const WelcomeSubscription = () => { setIsOpen(open); if (!open) { const { success, ...rest } = router.query; - router.replace({ pathname: router.pathname, query: rest }, undefined, { - shallow: true, - }); + router.replace( + { pathname: router.pathname, query: rest }, + undefined, + { + shallow: true, + }, + ); } }} > diff --git a/apps/dokploy/server/api/routers/stripe.ts b/apps/dokploy/server/api/routers/stripe.ts index cf9adf37b..29f5df10a 100644 --- a/apps/dokploy/server/api/routers/stripe.ts +++ b/apps/dokploy/server/api/routers/stripe.ts @@ -205,7 +205,10 @@ export const stripeRouter = createTRPCRouter({ mode: "subscription", line_items: items, ...(stripeCustomerId - ? { customer: stripeCustomerId, customer_update: { name: "auto", address: "auto" } } + ? { + customer: stripeCustomerId, + customer_update: { name: "auto", address: "auto" }, + } : { customer_email: owner.email }), metadata: { adminId: owner.id, diff --git a/apps/dokploy/server/utils/stripe-notifications.ts b/apps/dokploy/server/utils/stripe-notifications.ts index 7dc1847f6..39fab53e2 100644 --- a/apps/dokploy/server/utils/stripe-notifications.ts +++ b/apps/dokploy/server/utils/stripe-notifications.ts @@ -32,10 +32,7 @@ export const sendInvoiceEmail = async ( if (!invoice.hosted_invoice_url) return; try { - const amountFormatted = formatAmount( - invoice.amount_paid, - invoice.currency, - ); + const amountFormatted = formatAmount(invoice.amount_paid, invoice.currency); const htmlContent = await renderAsync( InvoiceNotificationEmail({ @@ -85,10 +82,7 @@ export const sendPaymentFailedEmail = async ( if (!invoice.hosted_invoice_url) return; try { - const amountFormatted = formatAmount( - invoice.amount_due, - invoice.currency, - ); + const amountFormatted = formatAmount(invoice.amount_due, invoice.currency); const htmlContent = await renderAsync( PaymentFailedEmail({ diff --git a/apps/schedules/src/index.ts b/apps/schedules/src/index.ts index 283b49fb1..0f811de6f 100644 --- a/apps/schedules/src/index.ts +++ b/apps/schedules/src/index.ts @@ -33,7 +33,7 @@ app.use(async (c, next) => { app.post("/create-backup", zValidator("json", jobQueueSchema), async (c) => { const data = c.req.valid("json"); - scheduleJob(data); + await scheduleJob(data); logger.info({ data }, `[${data.type}] created successfully`); return c.json({ message: `[${data.type}] created successfully` }); }); @@ -70,7 +70,7 @@ app.post("/update-backup", zValidator("json", jobQueueSchema), async (c) => { } logger.info({ result }, "Job removed"); } - scheduleJob(data); + await scheduleJob(data); logger.info("Backup updated successfully"); return c.json({ message: "Backup updated successfully" }); @@ -103,8 +103,8 @@ process.on("uncaughtException", (err) => { logger.error(err, "Uncaught exception"); }); -process.on("unhandledRejection", (reason, promise) => { - logger.error({ promise, reason }, "Unhandled Rejection at: Promise"); +process.on("unhandledRejection", (reason, _promise) => { + logger.error(reason instanceof Error ? reason : { reason: String(reason) }, "Unhandled Rejection at: Promise"); }); const port = Number.parseInt(process.env.PORT || "3000"); diff --git a/apps/schedules/src/queue.ts b/apps/schedules/src/queue.ts index f20088814..7b0c48315 100644 --- a/apps/schedules/src/queue.ts +++ b/apps/schedules/src/queue.ts @@ -21,28 +21,28 @@ export const cleanQueue = async () => { } }; -export const scheduleJob = (job: QueueJob) => { +export const scheduleJob = async (job: QueueJob) => { if (job.type === "backup") { - jobQueue.add(job.backupId, job, { + await jobQueue.add(job.backupId, job, { repeat: { pattern: job.cronSchedule, }, }); } else if (job.type === "server") { - jobQueue.add(`${job.serverId}-cleanup`, job, { + await jobQueue.add(`${job.serverId}-cleanup`, job, { repeat: { pattern: job.cronSchedule, }, }); } else if (job.type === "schedule") { - jobQueue.add(job.scheduleId, job, { + await jobQueue.add(job.scheduleId, job, { repeat: { pattern: job.cronSchedule, tz: job.timezone || "UTC", }, }); } else if (job.type === "volume-backup") { - jobQueue.add(job.volumeBackupId, job, { + await jobQueue.add(job.volumeBackupId, job, { repeat: { pattern: job.cronSchedule, }, diff --git a/apps/schedules/src/utils.ts b/apps/schedules/src/utils.ts index d7d2d8eed..dc22c2d4b 100644 --- a/apps/schedules/src/utils.ts +++ b/apps/schedules/src/utils.ts @@ -135,11 +135,15 @@ export const initializeJobs = async () => { for (const server of servers) { const { serverId } = server; - scheduleJob({ - serverId, - type: "server", - cronSchedule: CLEANUP_CRON_JOB, - }); + try { + await scheduleJob({ + serverId, + type: "server", + cronSchedule: CLEANUP_CRON_JOB, + }); + } catch (error) { + logger.error(error, `Failed to schedule cleanup job for server ${serverId}`); + } } logger.info({ Quantity: servers.length }, "Active Servers Initialized"); @@ -157,11 +161,15 @@ export const initializeJobs = async () => { }); for (const backup of backupsResult) { - scheduleJob({ - backupId: backup.backupId, - type: "backup", - cronSchedule: backup.schedule, - }); + try { + await scheduleJob({ + backupId: backup.backupId, + type: "backup", + cronSchedule: backup.schedule, + }); + } catch (error) { + logger.error(error, `Failed to schedule backup ${backup.backupId}`); + } } logger.info({ Quantity: backupsResult.length }, "Backups Initialized"); @@ -197,11 +205,15 @@ export const initializeJobs = async () => { ); for (const schedule of filteredSchedulesBasedOnServerStatus) { - scheduleJob({ - scheduleId: schedule.scheduleId, - type: "schedule", - cronSchedule: schedule.cronExpression, - }); + try { + await scheduleJob({ + scheduleId: schedule.scheduleId, + type: "schedule", + cronSchedule: schedule.cronExpression, + }); + } catch (error) { + logger.error(error, `Failed to schedule ${schedule.scheduleId}`); + } } logger.info( { Quantity: filteredSchedulesBasedOnServerStatus.length }, @@ -236,11 +248,15 @@ export const initializeJobs = async () => { ); for (const volumeBackup of filteredVolumeBackupsBasedOnServerStatus) { - scheduleJob({ - volumeBackupId: volumeBackup.volumeBackupId, - type: "volume-backup", - cronSchedule: volumeBackup.cronExpression, - }); + try { + await scheduleJob({ + volumeBackupId: volumeBackup.volumeBackupId, + type: "volume-backup", + cronSchedule: volumeBackup.cronExpression, + }); + } catch (error) { + logger.error(error, `Failed to schedule volume backup ${volumeBackup.volumeBackupId}`); + } } logger.info(