Files
TZERO78 1d044b2220 feat: Alerting Overhaul — pre-flight check, verbose failures, missed-backup detection (Plan 0025)
- KopiaCommandError: replaces bare RuntimeError in _run(), carries returncode + stderr_tail (UTF-8 safe)
- is_connected(force_refresh=True): bypasses 60s cache for pre-flight check; negative result also cached
- BackendUnreachableError: new exception in backends/base.py (subclass of ConnectionError)
- Pre-flight backend check in backup_unit() before container teardown; containers NOT stopped on failure
- BackupErrorDetail dataclass in types.py; BackupMetadata.error_details persisted in JSON (backward-compat)
- Verbose failure notifications: phase, exit code, stderr tail in fenced code block (Markdown-injection-safe)
- Markdown body_format for all Apprise sends; services without Markdown degrade gracefully
- send_connectivity_alert() and send_missed_backup_alert() added to NotificationManager
- MissedBackupChecker: time-based overdue detection using MetadataReader; per-unit threshold overrides
- Post-run missed-backup check after every backup_unit(); alert suppression via missed_state.json
- Doctor section 8 "Backup Freshness": age per unit, OVERDUE units highlighted
- Config: notifications.verbose, notifications.preflight_check, alerting.missed_backup.*
- Config templates and examples updated; migration guide in INSTALLATION.md

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-23 11:51:15 +00:00

68 lines
1.5 KiB
JSON

{
"version": "3.0",
"kopia": {
"kopia_params": "filesystem --path /backup/kopia-repository",
"password": "CHANGE_ME_use_kopi-docka_new-config_wizard",
"password_file": null,
"compression": "zstd",
"encryption": "AES256-GCM-HMAC-SHA256",
"cache_directory": "/var/cache/kopi-docka"
},
"backup": {
"base_path": "/backup/kopi-docka",
"parallel_workers": "auto",
"stop_timeout": 30,
"start_timeout": 60,
"task_timeout": 0,
"update_recovery_bundle": true,
"recovery_bundle_path": "/backup/recovery",
"recovery_bundle_retention": 3,
"exclude_patterns": [
"*.log",
"*.tmp",
"cache/*"
],
"hooks": {
"pre_backup": "/opt/hooks/pre-backup.sh",
"post_backup": "/opt/hooks/post-backup.sh",
"pre_restore": null,
"post_restore": null
}
},
"docker": {
"socket": "/var/run/docker.sock",
"compose_timeout": 300
},
"retention": {
"latest": 10,
"hourly": 0,
"daily": 7,
"weekly": 4,
"monthly": 12,
"annual": 3
},
"logging": {
"level": "INFO",
"file": "/var/log/kopi-docka.log",
"max_size_mb": 100,
"backup_count": 5
},
"notifications": {
"enabled": false,
"service": null,
"url": null,
"secret_file": null,
"on_success": true,
"on_failure": true,
"verbose": true,
"preflight_check": true
},
"alerting": {
"missed_backup": {
"enabled": true,
"max_age_hours": 26,
"per_unit": {}
}
}
}