Implemented SQL dumps for backup everything

This commit is contained in:
Kevin Veen-Birkenbach 2023-12-27 21:26:11 +01:00
parent 15d7406b7e
commit 9a5b544e0b

View File

@ -30,6 +30,8 @@ IMAGES_NO_BACKUP_REQUIRED = [
'memcached' 'memcached'
] ]
DATABASES = pandas.read_csv(os.path.join(dirname, "databases.csv"), sep=";")
class BackupException(Exception): class BackupException(Exception):
"""Generic exception for backup errors.""" """Generic exception for backup errors."""
pass pass
@ -58,13 +60,13 @@ def get_instance(container):
print(f"Extracted instance name: {instance_name}") print(f"Extracted instance name: {instance_name}")
return instance_name return instance_name
def backup_database(container, databases, volume_dir, db_type): def backup_database(container, volume_dir, db_type):
"""Backup database (MariaDB or PostgreSQL) if applicable.""" """Backup database (MariaDB or PostgreSQL) if applicable."""
print(f"Starting database backup for {container} using {db_type}...") print(f"Starting database backup for {container} using {db_type}...")
instance_name = get_instance(container) instance_name = get_instance(container)
# Filter the DataFrame for the given instance_name # Filter the DataFrame for the given instance_name
database_entries = databases.loc[databases['instance'] == instance_name] database_entries = DATABASES.loc[DATABASES['instance'] == instance_name]
# Check if there are more than one entries # Check if there are more than one entries
if len(database_entries) > 1: if len(database_entries) > 1:
@ -186,7 +188,21 @@ def backup_with_containers_paused(volume_name, volume_dir, versions_dir, contain
backup_volume(volume_name, volume_dir, versions_dir) backup_volume(volume_name, volume_dir, versions_dir)
start_containers(containers) start_containers(containers)
def default_backup_routine_for_volume(volume_name, containers, databases, version_dir, versions_dir): def backup_mariadb_or_postgres(container, volume_dir):
# Execute MariaDB procedure
if has_image(container, 'mariadb'):
backup_database(container, volume_dir, 'mariadb')
return True
# Execute Postgres procedure
if has_image(container, 'postgres'):
backup_database(container, volume_dir, 'postgres')
return True
return False
def default_backup_routine_for_volume(volume_name, containers, version_dir, versions_dir):
"""Perform backup routine for a given volume.""" """Perform backup routine for a given volume."""
volume_dir="" volume_dir=""
for container in containers: for container in containers:
@ -199,14 +215,8 @@ def default_backup_routine_for_volume(volume_name, containers, databases, versio
# Directory which contains files and sqls # Directory which contains files and sqls
volume_dir = create_volume_directory(version_dir, volume_name) volume_dir = create_volume_directory(version_dir, volume_name)
# Execute MariaDB procedure # Execute Database backup and exit if successfull
if has_image(container, 'mariadb'): if backup_mariadb_or_postgres(container, volume_dir):
backup_database(container, databases, volume_dir, 'mariadb')
return
# Execute Postgres procedure
if has_image(container, 'postgres'):
backup_database(container, databases, volume_dir, 'postgres')
return return
# Execute backup if image is not ignored # Execute backup if image is not ignored
@ -215,16 +225,20 @@ def default_backup_routine_for_volume(volume_name, containers, databases, versio
if is_container_stop_required(containers): if is_container_stop_required(containers):
backup_with_containers_paused(volume_name, volume_dir, versions_dir, containers) backup_with_containers_paused(volume_name, volume_dir, versions_dir, containers)
def force_file_backup_routine_for_volume(volume_name, containers, version_dir, versions_dir): def backup_everything(volume_name, containers, version_dir, versions_dir):
"""Perform file backup routine for a given volume.""" """Perform file backup routine for a given volume."""
volume_dir=create_volume_directory(version_dir, volume_name) volume_dir=create_volume_directory(version_dir, volume_name)
# Execute sql dumps
for container in containers:
backup_mariadb_or_postgres(container, volume_dir)
# Execute file backups
backup_volume(volume_name, volume_dir, versions_dir) backup_volume(volume_name, volume_dir, versions_dir)
backup_with_containers_paused(volume_name, volume_dir, versions_dir, containers) backup_with_containers_paused(volume_name, volume_dir, versions_dir, containers)
def main(): def main():
parser = argparse.ArgumentParser(description='Backup Docker volumes.') parser = argparse.ArgumentParser(description='Backup Docker volumes.')
parser.add_argument('--force-file-backup', action='store_true', parser.add_argument('--backup-everything', action='store_true',
help='Force file backup for all volumes, ignoring whitelists and database checks.') help='Force file backup for all volumes and additional execute database dumps')
args = parser.parse_args() args = parser.parse_args()
print('Start backup routine...') print('Start backup routine...')
dirname = os.path.dirname(__file__) dirname = os.path.dirname(__file__)
@ -236,7 +250,6 @@ def main():
version_dir = create_version_directory(versions_dir, backup_time) version_dir = create_version_directory(versions_dir, backup_time)
print('Start volume backups...') print('Start volume backups...')
databases = pandas.read_csv(os.path.join(dirname, "databases.csv"), sep=";")
volume_names = execute_shell_command("docker volume ls --format '{{.Name}}'") volume_names = execute_shell_command("docker volume ls --format '{{.Name}}'")
for volume_name in volume_names: for volume_name in volume_names:
@ -246,9 +259,9 @@ def main():
print('Skipped due to no running containers using this volume.') print('Skipped due to no running containers using this volume.')
continue continue
if args.force_file_backup: if args.force_file_backup:
force_file_backup_routine_for_volume(volume_name, containers, version_dir, versions_dir) backup_everything(volume_name, containers, version_dir, versions_dir)
else: else:
default_backup_routine_for_volume(volume_name, containers, databases, version_dir, versions_dir) default_backup_routine_for_volume(volume_name, containers, version_dir, versions_dir)
print('Finished volume backups.') print('Finished volume backups.')