Docker images / prepare-release (push) Successful in 9s
Docker images / backend-test (push) Successful in 2m18s
Docker images / frontend-image (push) Successful in 4m37s
Docker images / updater-image (push) Successful in 46s
Docker images / backend-image (push) Successful in 3m6s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 16s
Сохранять снимки в S3-compatible бакет, скачивать и удалять их вместе с локальными файлами. Привести /backups к DNA /servers: Frame, KPI, фильтры и реальное восстановление. Co-authored-by: Cursor <[email protected]>
82 lines
2.9 KiB
TypeScript
82 lines
2.9 KiB
TypeScript
import { z } from "zod"
|
|
|
|
export const backupFrequencySchema = z.enum(["daily", "weekly", "monthly"])
|
|
export const backupFormatSchema = z.enum(["rsc", "backup"])
|
|
export const backupStorageProviderSchema = z.enum(["local", "s3"])
|
|
export const backupObjectStorageSchema = z.enum(["local", "s3", "both"])
|
|
|
|
export const backupScheduleSettingsDtoSchema = z.object({
|
|
enabled: z.boolean(),
|
|
frequency: backupFrequencySchema,
|
|
hour: z.number().int().min(0).max(23),
|
|
minute: z.number().int().min(0).max(59),
|
|
weekDay: z.number().int().min(0).max(6),
|
|
monthDay: z.number().int().min(1).max(28),
|
|
keepCount: z.number().int().min(1).max(365),
|
|
format: backupFormatSchema,
|
|
serverIds: z.array(z.string()),
|
|
lastRunAt: z.string().nullable().optional(),
|
|
lastDurationMs: z.number().int().nullable().optional(),
|
|
lastError: z.string().nullable().optional(),
|
|
updatedAt: z.string().optional(),
|
|
})
|
|
|
|
export const putBackupScheduleSettingsSchema = z.object({
|
|
enabled: z.boolean().optional(),
|
|
frequency: backupFrequencySchema.optional(),
|
|
hour: z.number().int().min(0).max(23).optional(),
|
|
minute: z.number().int().min(0).max(59).optional(),
|
|
weekDay: z.number().int().min(0).max(6).optional(),
|
|
monthDay: z.number().int().min(1).max(28).optional(),
|
|
keepCount: z.number().int().min(1).max(365).optional(),
|
|
format: backupFormatSchema.optional(),
|
|
serverIds: z.array(z.string()).optional(),
|
|
})
|
|
|
|
export type BackupScheduleSettingsDto = z.infer<typeof backupScheduleSettingsDtoSchema>
|
|
|
|
export const backupStorageSettingsDtoSchema = z.object({
|
|
provider: backupStorageProviderSchema,
|
|
s3Endpoint: z.string(),
|
|
s3Region: z.string(),
|
|
s3Bucket: z.string(),
|
|
s3Prefix: z.string(),
|
|
s3AccessKeyId: z.string(),
|
|
secretConfigured: z.boolean(),
|
|
s3ForcePathStyle: z.boolean(),
|
|
keepLocalCopy: z.boolean(),
|
|
lastTestAt: z.string().nullable().optional(),
|
|
lastTestError: z.string().nullable().optional(),
|
|
updatedAt: z.string().optional(),
|
|
})
|
|
|
|
export const putBackupStorageSettingsSchema = z.object({
|
|
provider: backupStorageProviderSchema.optional(),
|
|
s3Endpoint: z.string().optional(),
|
|
s3Region: z.string().optional(),
|
|
s3Bucket: z.string().optional(),
|
|
s3Prefix: z.string().optional(),
|
|
s3AccessKeyId: z.string().optional(),
|
|
s3SecretAccessKey: z.string().optional(),
|
|
s3ForcePathStyle: z.boolean().optional(),
|
|
keepLocalCopy: z.boolean().optional(),
|
|
})
|
|
|
|
export const backupItemDtoSchema = z.object({
|
|
id: z.string(),
|
|
serverId: z.number().nullable(),
|
|
serverName: z.string(),
|
|
filename: z.string(),
|
|
sizeBytes: z.number(),
|
|
createdAt: z.string(),
|
|
kind: z.enum(["manual", "auto"]),
|
|
notes: z.string().optional(),
|
|
storage: backupObjectStorageSchema,
|
|
s3Key: z.string().nullable().optional(),
|
|
uploadError: z.string().nullable().optional(),
|
|
})
|
|
|
|
export type BackupStorageSettingsDto = z.infer<typeof backupStorageSettingsDtoSchema>
|
|
export type PutBackupStorageSettings = z.infer<typeof putBackupStorageSettingsSchema>
|
|
export type BackupItemDto = z.infer<typeof backupItemDtoSchema>
|