Compare commits
	
		
			11 Commits
		
	
	
		
			1.0.0+2.0.
			...
			feature/do
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2a7e564a24 | |||
| 5f381f395d | |||
| e0ee16426b | |||
| 92845c4142 | |||
| d0d0f29c79 | |||
| 88168de90e | |||
| 71c88d0428 | |||
| 15b2d656bb | |||
| 46522a2e9a | |||
| 30e88a972a | |||
| 64e09a6472 | 
| @ -10,7 +10,7 @@ Automatically take backups from all volumes of running Docker Swarm services and | ||||
|  | ||||
| * **Category**: Utilities | ||||
| * **Status**: 0, work-in-progress | ||||
| * **Image**: [`git.coopcloud.tech/coop-cloud/backup-bot-two`](https://git.coopcloud.tech/coop-cloud/-/packages/container/backup-bot-two), 4, upstream | ||||
| * **Image**: [`thecoopcloud/backup-bot-two`](https://hub.docker.com/r/thecoopcloud/backup-bot-two), 4, upstream | ||||
| * **Healthcheck**: No | ||||
| * **Backups**: N/A | ||||
| * **Email**: N/A | ||||
|  | ||||
							
								
								
									
										23
									
								
								backupbot.py
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								backupbot.py
									
									
									
									
									
								
							| @ -42,7 +42,7 @@ sys.excepthook = handle_exception | ||||
| @click.option('-l', '--log', 'loglevel') | ||||
| @click.option('-m', '--machine-logs', 'machine_logs', is_flag=True) | ||||
| @click.option('service', '--host', '-h', envvar='SERVICE') | ||||
| @click.option('repository', '--repo', '-r', envvar='RESTIC_REPOSITORY') | ||||
| @click.option('repository', '--repo', '-r', envvar='RESTIC_REPOSITORY', required=True) | ||||
| def cli(loglevel, service, repository, machine_logs): | ||||
|     global SERVICE | ||||
|     if service: | ||||
| @ -54,25 +54,21 @@ def cli(loglevel, service, repository, machine_logs): | ||||
|         if not isinstance(numeric_level, int): | ||||
|             raise ValueError('Invalid log level: %s' % loglevel) | ||||
|         logger.setLevel(numeric_level) | ||||
|     logHandler = logging.StreamHandler() | ||||
|     if machine_logs: | ||||
|         logHandler = logging.StreamHandler() | ||||
|         formatter = jsonlogger.JsonFormatter( | ||||
|             "%(levelname)s %(filename)s %(lineno)s %(process)d %(message)s", rename_fields={"levelname": "message_type"}) | ||||
|         logHandler.setFormatter(formatter) | ||||
|     logger.addHandler(logHandler) | ||||
|         logger.addHandler(logHandler) | ||||
|  | ||||
|     export_secrets() | ||||
|     init_repo() | ||||
|  | ||||
|  | ||||
| def init_repo(): | ||||
|     if repo:= os.environ.get('RESTIC_REPOSITORY_FILE'): | ||||
|         # RESTIC_REPOSITORY_FILE and RESTIC_REPOSITORY are mutually exclusive | ||||
|         del os.environ['RESTIC_REPOSITORY'] | ||||
|     else: | ||||
|         repo = os.environ['RESTIC_REPOSITORY'] | ||||
|         restic.repository = repo | ||||
|     repo = os.environ['RESTIC_REPOSITORY'] | ||||
|     logger.debug(f"set restic repository location: {repo}") | ||||
|     restic.repository = repo | ||||
|     restic.password_file = '/var/run/secrets/restic_password' | ||||
|     try: | ||||
|         restic.cat.config() | ||||
| @ -108,7 +104,7 @@ def create(retries): | ||||
| def get_backup_cmds(): | ||||
|     client = docker.from_env() | ||||
|     container_by_service = { | ||||
|         c.labels.get('com.docker.swarm.service.name'): c for c in client.containers.list()} | ||||
|         c.labels['com.docker.swarm.service.name']: c for c in client.containers.list()} | ||||
|     backup_paths = set() | ||||
|     backup_apps = set() | ||||
|     pre_commands = {} | ||||
| @ -143,14 +139,14 @@ def copy_secrets(apps): | ||||
|     os.mkdir(SECRET_PATH) | ||||
|     client = docker.from_env() | ||||
|     container_by_service = { | ||||
|         c.labels.get('com.docker.swarm.service.name'): c for c in client.containers.list()} | ||||
|         c.labels['com.docker.swarm.service.name']: c for c in client.containers.list()} | ||||
|     services = client.services.list() | ||||
|     for s in services: | ||||
|         app_name = s.attrs['Spec']['Labels']['com.docker.stack.namespace'] | ||||
|         if (app_name in apps and | ||||
|                 (app_secs := s.attrs['Spec']['TaskTemplate']['ContainerSpec'].get('Secrets'))): | ||||
|             if not container_by_service.get(s.name): | ||||
|                 logger.warning( | ||||
|                 logger.error( | ||||
|                     f"Container {s.name} is not running, secrets can not be copied.") | ||||
|                 continue | ||||
|             container_id = container_by_service[s.name].id | ||||
| @ -161,7 +157,6 @@ def copy_secrets(apps): | ||||
|                         f"For the secret {sec['SecretName']} the file {src} does not exist for {s.name}") | ||||
|                     continue | ||||
|                 dst = SECRET_PATH + sec['SecretName'] | ||||
|                 logger.debug("Copy Secret {sec['SecretName']}") | ||||
|                 copyfile(src, dst) | ||||
|  | ||||
|  | ||||
| @ -189,8 +184,6 @@ def run_commands(commands): | ||||
| def backup_volumes(backup_paths, apps, retries, dry_run=False): | ||||
|     while True: | ||||
|         try: | ||||
|             logger.info("Start volume backup") | ||||
|             logger.debug(backup_paths) | ||||
|             result = restic.backup(backup_paths, dry_run=dry_run, tags=apps) | ||||
|             logger.summary("backup finished", extra=result) | ||||
|             return | ||||
|  | ||||
| @ -16,7 +16,7 @@ services: | ||||
|       - restic_password | ||||
|     deploy: | ||||
|       labels: | ||||
|         - coop-cloud.${STACK_NAME}.version=1.0.0+2.0.0-beta | ||||
|         - coop-cloud.${STACK_NAME}.version=0.1.0+latest | ||||
|         - coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-300} | ||||
|         - coop-cloud.backupbot.enabled=true | ||||
|     #entrypoint: ['tail', '-f','/dev/null'] | ||||
|  | ||||
| @ -1 +0,0 @@ | ||||
| This is the first beta release of the new backup-bot-two rewrite in python. Be aware when updating, it can break. Please read the readme and update your config according to it. | ||||
		Reference in New Issue
	
	Block a user