Найти в Дзене

return True

return True else: self.logger.error(f"Physical backup failed for {container_name}: {result.stderr}") return False except Exception as e: self.logger.error(f"Error executing physical backup for {container_name}: {e}") return False def execute_logical_backup(self, container_name, network): """Выполнение логического бэкапа""" try: cmd = [ '/opt/backup-manager/scripts/logical-backup.sh', container_name, network ] result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode == 0: self.logger.info(f"Logical backup successful for {container_name}") return True else: self.logger.error(f"Logical backup failed for {container_name}: {result.stderr}") return False except Exception as e: self.logger.error(f"Error executing logical backup for {container_name}: {e}") return False def run_scheduled_backup(self, backup_type='all'): """Запуск запланированного бэкапа""" containers = self.discover_postgres_containers() results = { 'timestamp': datetime.now().isoformat(), 'total_c

return True

else:

self.logger.error(f"Physical backup failed for {container_name}: {result.stderr}")

return False

except Exception as e:

self.logger.error(f"Error executing physical backup for {container_name}: {e}")

return False

def execute_logical_backup(self, container_name, network):

"""Выполнение логического бэкапа"""

try:

cmd = [

'/opt/backup-manager/scripts/logical-backup.sh',

container_name,

network

]

result = subprocess.run(cmd, capture_output=True, text=True)

if result.returncode == 0:

self.logger.info(f"Logical backup successful for {container_name}")

return True

else:

self.logger.error(f"Logical backup failed for {container_name}: {result.stderr}")

return False

except Exception as e:

self.logger.error(f"Error executing logical backup for {container_name}: {e}")

return False

def run_scheduled_backup(self, backup_type='all'):

"""Запуск запланированного бэкапа"""

containers = self.discover_postgres_containers()

results = {

'timestamp': datetime.now().isoformat(),

'total_containers': len(containers),

'successful': 0,

'failed': 0,

'details': []

}

for container in containers:

container_name = f"{container['name']}.{container['network']}"

try:

if backup_type in ['all', 'physical']:

physical_success = self.execute_physical_backup(

container['name'], container['network']

)

if backup_type in ['all', 'logical']:

logical_success = self.execute_logical_backup(

container['name'], container['network']

)

success = physical_success and logical_success

if success:

results['successful'] += 1

else:

results['failed'] += 1

results['details'].append({

'container': container_name,

'physical_backup': physical_success,

'logical_backup': logical_success,

'success': success

})

except Exception as e:

self.logger.error(f"Backup failed for {container_name}: {e}")

results['failed'] += 1

results['details'].append({

'container': container_name,

'error': str(e),

'success': False

})

self.save_backup_report(results)

return results

def save_backup_report(self, results):

"""Сохранение отчета о бэкапе"""

report_file = f"/opt/backup-manager/logs/backup_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"

with open(report_file, 'w') as f:

json.dump(results, f, indent=2)

if name == 'main':

manager = BackupManager()

# Для простоты - запуск по расписанию через cron внутри контейнера

# или можно запускать по HTTP запросу от n8n

import sys

backup_type = sys.argv[1] if len(sys.argv) > 1 else 'all'

manager.run_scheduled_backup(backup_type)

3. Обновленные скрипты бэкапа

scripts/physical-backup.sh

bash

#!/bin/bash

CONTAINER_NAME=$1

NETWORK=$2

TIMESTAMP=$(date +%Y%m%d_%H%M%S)

BACKUP_DIR="/backup/${CONTAINER_NAME}/physical/${TIMESTAMP}"

LOG_FILE="/opt/backup-manager/logs/${CONTAINER_NAME}_physical_${TIMESTAMP}.log"