2025-12-11 22:17:44 +00:00

154 lines
3.3 KiB
Plaintext

"""
Backup system configuration schema.
Supports Restic, BorgBackup, Tar, Rsync with retention policies and scheduling.
"""
schema TypesBackup:
BackendType: "restic" | "borg" | "tar" | "rsync" | "cpio"
RepositoryType: "local" | "s3" | "sftp" | "rest" | "b2"
schema RetentionPolicy:
"""Backup retention policy"""
# Keep daily backups for N days
daily_days: int = 7
# Keep weekly backups for N weeks
weekly_weeks: int = 4
# Keep monthly backups for N months
monthly_months: int = 12
# Keep yearly backups for N years
yearly_years: int = 5
check:
daily_days > 0, "daily_days must be positive"
weekly_weeks > 0, "weekly_weeks must be positive"
monthly_months > 0, "monthly_months must be positive"
yearly_years > 0, "yearly_years must be positive"
schema Repository:
"""Backup repository configuration"""
type: TypesBackup.RepositoryType
# Local filesystem
path?: str
# S3 bucket
bucket?: str
prefix?: str = ""
# SFTP server
host?: str
sftp_path?: str
# REST API endpoint
url?: str
check:
(type == "local" and path != None) or \
(type == "s3" and bucket != None) or \
(type == "sftp" and host != None and sftp_path != None) or \
(type == "rest" and url != None) or \
(type == "b2" and bucket != None), \
"Repository configuration mismatch with type"
schema BackupJob:
"""Backup job configuration"""
# Job name
name: str
# Backend to use
backend: TypesBackup.BackendType = "restic"
# Repository configuration
repository: Repository
# Paths to backup
paths: [str]
# Retention policy
retention: RetentionPolicy = {
daily_days = 7
weekly_weeks = 4
monthly_months = 12
yearly_years = 5
}
# Pre-backup hook
pre_backup_hook?: str
# Post-backup hook
post_backup_hook?: str
# Exclude patterns
exclude_patterns?: [str]
# Compression level (0-9)
compression: int = 3
check:
len(name) > 0, "name must not be empty"
len(paths) > 0, "paths must not be empty"
compression >= 0 and compression <= 9, "compression must be 0-9"
schema BackupSchedule:
"""Backup scheduling configuration"""
# Schedule name
name: str
# Job to schedule
job: BackupJob
# Cron expression
cron: str
# Enabled
enabled: bool = True
# Maximum concurrent backups
max_concurrent: int = 1
check:
len(name) > 0, "name must not be empty"
len(cron) > 0, "cron must not be empty"
max_concurrent > 0, "max_concurrent must be positive"
schema BackupConfig:
"""Global backup configuration"""
# Default backend
default_backend: TypesBackup.BackendType = "restic"
# Default repository
default_repository: Repository
# Jobs to configure
jobs: [BackupJob]
# Schedules
schedules: [BackupSchedule] = []
# Enable backup verification
verify_after_backup: bool = True
check:
len(jobs) >= 0, "jobs must be a valid list"
# Global backup configuration
backup_config: BackupConfig = {
default_backend = "restic"
default_repository = {
type = "local"
path = "./backups"
}
jobs = []
schedules = []
verify_after_backup = True
}