backups: в нотификацию попадают все забекапленные приложения
- список строится по backup-targets, а не только по успешным скриптам дампа, поэтому приложения с бекапом одних данных (calibre, goatcounter, tududi, tuwunel) больше не теряются - отсутствие backup.sh при наличии backup-targets — штатный случай, теперь это info, а warning остался только когда бекапить нечего вообще
This commit is contained in:
@@ -438,7 +438,7 @@ class BackupManager:
|
|||||||
):
|
):
|
||||||
self.errors: List[str] = []
|
self.errors: List[str] = []
|
||||||
self.warnings: List[str] = []
|
self.warnings: List[str] = []
|
||||||
self.successful_backups: List[str] = []
|
self.backed_up_apps: List[str] = []
|
||||||
self.config = config
|
self.config = config
|
||||||
self.storages = storages
|
self.storages = storages
|
||||||
self.notifiers = notifiers
|
self.notifiers = notifiers
|
||||||
@@ -468,17 +468,33 @@ class BackupManager:
|
|||||||
for app in applications:
|
for app in applications:
|
||||||
app_dir = str(app.path)
|
app_dir = str(app.path)
|
||||||
username = app.owner
|
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_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 = (
|
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)
|
logger.warning(warning_msg)
|
||||||
self.warnings.append(warning_msg)
|
self.warnings.append(warning_msg)
|
||||||
continue
|
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:
|
else:
|
||||||
logger.info("Backup phase not active, skipping per-app archive scripts")
|
logger.info("Backup phase not active, skipping per-app archive scripts")
|
||||||
self.archive_duration = time.monotonic() - archive_start
|
self.archive_duration = time.monotonic() - archive_start
|
||||||
@@ -567,7 +583,6 @@ class BackupManager:
|
|||||||
|
|
||||||
if result.returncode == 0:
|
if result.returncode == 0:
|
||||||
logger.info(f"Backup script for {username} completed successfully")
|
logger.info(f"Backup script for {username} completed successfully")
|
||||||
self.successful_backups.append(username)
|
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
error_msg = f"Backup script {script_path} failed with return code {result.returncode}"
|
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:
|
if success and not self.errors:
|
||||||
title = f"{host}: бекап успешно завершен"
|
title = f"{host}: бекап успешно завершен"
|
||||||
message = f"<p><b>{host}</b>: бекап успешно завершен!</p>"
|
message = f"<p><b>{host}</b>: бекап успешно завершен!</p>"
|
||||||
if self.successful_backups:
|
if self.backed_up_apps:
|
||||||
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
|
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
|
||||||
message += f"<p>Успешные бекапы:</p><ul>{items}</ul>"
|
message += f"<p>Успешные бекапы:</p><ul>{items}</ul>"
|
||||||
else:
|
else:
|
||||||
title = f"{host}: бекап завершен с ошибками ({len(self.errors)})"
|
title = f"{host}: бекап завершен с ошибками ({len(self.errors)})"
|
||||||
message = f"<p><b>{host}</b>: бекап завершен с ошибками!</p>"
|
message = f"<p><b>{host}</b>: бекап завершен с ошибками!</p>"
|
||||||
|
|
||||||
if self.successful_backups:
|
if self.backed_up_apps:
|
||||||
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
|
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
|
||||||
message += f"<p>✅ Успешные бекапы:</p><ul>{items}</ul>"
|
message += f"<p>✅ Успешные бекапы:</p><ul>{items}</ul>"
|
||||||
|
|
||||||
if self.warnings:
|
if self.warnings:
|
||||||
|
|||||||
Reference in New Issue
Block a user