fix(stop): always update status to warning when stop is executed (#202)

* fix(stop): always update status to warning when stop is executed

* fix: automatically put in_progress backups to warning during startup
This commit is contained in:
Nico 2025-12-21 14:25:45 +01:00 committed by GitHub
parent 492aa4178d
commit 8cdd06ec49
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 33 additions and 18 deletions

View file

@ -181,7 +181,8 @@ export const ScheduleSummary = (props: Props) => {
<div className="md:col-span-2 lg:col-span-4">
<p className="text-xs uppercase text-muted-foreground">Warning Details</p>
<p className="font-mono text-sm text-yellow-600 whitespace-pre-wrap break-all">
Last backup completed with warnings. Check your container logs for more details.
{schedule.lastBackupError ??
"Last backup completed with warnings. Check your container logs for more details."}
</p>
</div>
)}

View file

@ -431,23 +431,25 @@ const stopBackup = async (scheduleId: number) => {
throw new NotFoundError("Backup schedule not found");
}
const abortController = runningBackups.get(scheduleId);
if (!abortController) {
throw new ConflictError("No backup is currently running for this schedule");
try {
const abortController = runningBackups.get(scheduleId);
if (!abortController) {
throw new ConflictError("No backup is currently running for this schedule");
}
logger.info(`Stopping backup for schedule ${scheduleId}`);
abortController.abort();
} finally {
await db
.update(backupSchedulesTable)
.set({
lastBackupStatus: "warning",
lastBackupError: "Backup was stopped by user",
updatedAt: Date.now(),
})
.where(eq(backupSchedulesTable.id, scheduleId));
}
logger.info(`Stopping backup for schedule ${scheduleId}`);
abortController.abort();
await db
.update(backupSchedulesTable)
.set({
lastBackupStatus: "warning",
lastBackupError: "Backup was stopped by user",
updatedAt: Date.now(),
})
.where(eq(backupSchedulesTable.id, scheduleId));
};
const runForget = async (scheduleId: number, repositoryId?: string) => {

View file

@ -1,7 +1,7 @@
import { Scheduler } from "../../core/scheduler";
import { and, eq, or } from "drizzle-orm";
import { db } from "../../db/db";
import { volumesTable } from "../../db/schema";
import { backupSchedulesTable, volumesTable } from "../../db/schema";
import { logger } from "../../utils/logger";
import { restic } from "../../utils/restic";
import { volumeService } from "../volumes/volume.service";
@ -63,6 +63,18 @@ export const startup = async () => {
});
}
await db
.update(backupSchedulesTable)
.set({
lastBackupStatus: "warning",
lastBackupError: "Zerobyte was restarted during the last scheduled backup",
updatedAt: Date.now(),
})
.where(eq(backupSchedulesTable.lastBackupStatus, "in_progress"))
.catch((err) => {
logger.error(`Failed to update stuck backup schedules on startup: ${err.message}`);
});
Scheduler.build(CleanupDanglingMountsJob).schedule("0 * * * *");
Scheduler.build(VolumeHealthCheckJob).schedule("*/30 * * * *");
Scheduler.build(RepositoryHealthCheckJob).schedule("50 12 * * *");