62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
from .base import BaseCommand
|
|
from restic_compose_backup import backup_runner, alerts
|
|
|
|
|
|
class Command(BaseCommand):
|
|
"""Backup a directory"""
|
|
name = "backup"
|
|
|
|
def run(self):
|
|
"""Run the backup command"""
|
|
containers = self.get_containers()
|
|
|
|
if containers.backup_process_running:
|
|
alerts.send(
|
|
subject="Backup process container already running",
|
|
body=(
|
|
"A backup process container is already running. \n"
|
|
f"Id: {containers.backup_process_container.id}\n"
|
|
f"Name: {containers.backup_process_container.name}\n"
|
|
),
|
|
alert_type='ERROR',
|
|
)
|
|
raise RuntimeError("Backup process already running")
|
|
|
|
# Map all volumes from the backup container into the backup process container
|
|
volumes = containers.this_container.volumes
|
|
|
|
# Map volumes from other containers we are backing up
|
|
mounts = containers.generate_backup_mounts('/volumes')
|
|
volumes.update(mounts)
|
|
|
|
self.logger.debug('Starting backup container with image %s', containers.this_container.image)
|
|
try:
|
|
result = backup_runner.run(
|
|
image=containers.this_container.image,
|
|
command='restic-compose-backup start_backup_process',
|
|
volumes=volumes,
|
|
environment=containers.this_container.environment,
|
|
source_container_id=containers.this_container.id,
|
|
labels={
|
|
containers.backup_process_label: 'True',
|
|
"com.docker.compose.project": containers.project_name,
|
|
},
|
|
)
|
|
except Exception as ex:
|
|
self.logger.exception(ex)
|
|
alerts.send(
|
|
subject="Exception during backup",
|
|
body=str(ex),
|
|
alert_type='ERROR',
|
|
)
|
|
return
|
|
|
|
self.logger.info('Backup container exit code: %s', result)
|
|
|
|
# Alert the user if something went wrong
|
|
if result != 0:
|
|
alerts.send(
|
|
subject="Backup process exited with non-zero code",
|
|
body=open('backup.log').read(),
|
|
alert_type='ERROR',
|
|
)
|