100 lines
3.8 KiB
Go
100 lines
3.8 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
type BackupMethod string
|
|
|
|
const (
|
|
MethodRsync BackupMethod = "rsync"
|
|
MethodRestic BackupMethod = "restic"
|
|
MethodExternal BackupMethod = "external"
|
|
)
|
|
|
|
type BackupTarget struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Method BackupMethod `json:"method"`
|
|
Remote string `json:"remote"` // destination: rsync target path (e.g. "user@host:/path") or restic repository string (e.g. "/mnt/backup/repo", "s3:s3.amazonaws.com/bucket/path", "sftp:user@host:/path")
|
|
Params map[string]string `json:"params,omitempty"`
|
|
Schedule string `json:"schedule,omitempty"` // cron expression (5-field, standard). Empty = manual-only.
|
|
LastRun *time.Time `json:"last_run,omitempty"`
|
|
NextRun *time.Time `json:"next_run,omitempty"`
|
|
}
|
|
|
|
type BackupExecution struct {
|
|
ID string `json:"id"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Success bool `json:"success"`
|
|
Duration int64 `json:"duration_seconds"`
|
|
Message string `json:"message"`
|
|
TargetID string `json:"target_id,omitempty"`
|
|
}
|
|
|
|
type BackupConfig struct {
|
|
SourcePath string `json:"source_path,omitempty"`
|
|
Targets []BackupTarget `json:"targets"`
|
|
NextRun *time.Time `json:"next_run,omitempty"` // aggregate: earliest NextRun across Targets
|
|
LastRun *time.Time `json:"last_run,omitempty"` // aggregate: latest LastRun across Targets
|
|
History []BackupExecution `json:"history"`
|
|
}
|
|
|
|
type UpdateRecord struct {
|
|
ID string `json:"id"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Success bool `json:"success"`
|
|
Packages []string `json:"packages,omitempty"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type NodeInfo struct {
|
|
Hostname string `json:"hostname"`
|
|
Description string `json:"description,omitempty"`
|
|
UpdateHistory []UpdateRecord `json:"update_history"`
|
|
Backup BackupConfig `json:"backup"`
|
|
ResticPassword string `json:"restic_password,omitempty"` // repository password used to encrypt/decrypt all restic backup targets on this node
|
|
}
|
|
|
|
type RemoteNode struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
URL string `json:"url"`
|
|
Status string `json:"status"`
|
|
Description string `json:"description,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
LastSeen *time.Time `json:"last_seen,omitempty"`
|
|
}
|
|
|
|
type Service struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
ComposeFile string `json:"compose_file"`
|
|
ComposeType string `json:"compose_type,omitempty"`
|
|
BackupFolder string `json:"backup_folder,omitempty"`
|
|
Status string `json:"status,omitempty"` // "up", "down", "unknown"
|
|
StopOnBackup bool `json:"stop_on_backup,omitempty"`
|
|
ExternalBackupStopMinutes int `json:"external_backup_stop_minutes,omitempty"`
|
|
ExternalBackupStartMinutes int `json:"external_backup_start_minutes,omitempty"`
|
|
Backup *BackupConfig `json:"backup,omitempty"`
|
|
}
|
|
|
|
type ScanResult struct {
|
|
ScannedPaths []string `json:"scanned_paths"`
|
|
Found int `json:"found"`
|
|
Created []ServiceScanInfo `json:"created"`
|
|
Updated []ServiceScanInfo `json:"updated"`
|
|
Errors []string `json:"errors,omitempty"`
|
|
}
|
|
|
|
type ServiceScanInfo struct {
|
|
Name string `json:"name"`
|
|
ComposeFile string `json:"compose_file"`
|
|
BackupFolder string `json:"backup_folder,omitempty"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type AppConfig struct {
|
|
Node NodeInfo `json:"node"`
|
|
Nodes []RemoteNode `json:"nodes"`
|
|
Services []Service `json:"services"`
|
|
}
|