backups: в нотификацию попадают все забекапленные приложения

- список строится по backup-targets, а не только по успешным скриптам дампа,
  поэтому приложения с бекапом одних данных (calibre, goatcounter, tududi,
  tuwunel) больше не теряются
- отсутствие backup.sh при наличии backup-targets — штатный случай, теперь
  это info, а warning остался только когда бекапить нечего вообще
This commit is contained in:
av
2026-08-22 11:25:06 +03:00
parent 889c8a565e
commit 321f6e7b6b
+24 -9
View File
@@ -438,7 +438,7 @@ class BackupManager:
):
self.errors: List[str] = []
self.warnings: List[str] = []
self.successful_backups: List[str] = []
self.backed_up_apps: List[str] = []
self.config = config
self.storages = storages
self.notifiers = notifiers
@@ -468,17 +468,33 @@ class BackupManager:
for app in applications:
app_dir = str(app.path)
username = app.owner
logger.info(f"Processing backup for app: {app_dir} (user {username})")
app_name = app.path.name
if app.backup_script is None:
if app.backup_targets:
# Приложение без дампа: restic забирает его данные как есть,
# отдельный шаг архивации ему не нужен.
logger.info(
f"No backup script for app: {app_dir} (user {username}), "
f"data directories go to restic as is"
)
self.backed_up_apps.append(app_name)
else:
warning_msg = (
f"No backup script found for app: {app_dir} (user {username})"
f"Nothing to back up for app: {app_dir} (user {username}): "
f"no backup script and no backup targets"
)
logger.warning(warning_msg)
self.warnings.append(warning_msg)
continue
self._run_app_backup(str(app.backup_script), app_dir, username)
logger.info(f"Processing backup for app: {app_dir} (user {username})")
if not self._run_app_backup(str(app.backup_script), app_dir, username):
continue
# Дамп сделан, но в restic он попадёт только если есть цели бекапа;
# об их отсутствии уже предупредил ApplicationFinder.
if app.backup_targets:
self.backed_up_apps.append(app_name)
else:
logger.info("Backup phase not active, skipping per-app archive scripts")
self.archive_duration = time.monotonic() - archive_start
@@ -567,7 +583,6 @@ class BackupManager:
if result.returncode == 0:
logger.info(f"Backup script for {username} completed successfully")
self.successful_backups.append(username)
return True
else:
error_msg = f"Backup script {script_path} failed with return code {result.returncode}"
@@ -597,15 +612,15 @@ class BackupManager:
if success and not self.errors:
title = f"{host}: бекап успешно завершен"
message = f"<p><b>{host}</b>: бекап успешно завершен!</p>"
if self.successful_backups:
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
if self.backed_up_apps:
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
message += f"<p>Успешные бекапы:</p><ul>{items}</ul>"
else:
title = f"{host}: бекап завершен с ошибками ({len(self.errors)})"
message = f"<p><b>{host}</b>: бекап завершен с ошибками!</p>"
if self.successful_backups:
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
if self.backed_up_apps:
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
message += f"<p>✅ Успешные бекапы:</p><ul>{items}</ul>"
if self.warnings: