diff --git a/docker_backups.py b/docker_backups.py index 4373f25..2f15b12 100755 --- a/docker_backups.py +++ b/docker_backups.py @@ -4,6 +4,14 @@ import datetime import os import shutil now = datetime.datetime.now() +import argparse +parser = argparse.ArgumentParser(description="Portainer helper - use env vars or pass credentials.") +parser.add_argument("--influx", "-i", action="store_true", help="Select influx") +parser.add_argument("--backup", "-b", action="store_true", help="Select backup mode") +args = parser.parse_args() + + + PASSWORD= "l4c1j4yd33Du5lo" DATETIME = now.strftime("%Y%m%d%H%M%S") os.chdir("/share/docker_data/__backups/") @@ -15,72 +23,76 @@ for f in allfiles: shutil.move(f"/share/docker_data/gitlab/data/backups/{f}", "/share/docker_data/__backups/") -print("Backup nextcloud") -cmnd = 'docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --on' -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"docker exec nextcloud-db-1 sh -c 'exec mysqldump --single-transaction -h localhost -u nextcloud -p{PASSWORD} nextcloud' > /share/docker_data/__backups/nextcloudDB_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = "docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --off" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} nextcloudDB_{DATETIME}.sql.zip nextcloudDB_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -os.remove(f"nextcloudDB_{DATETIME}.sql") -print("Backup Bookstack") -cmnd = f"docker exec bookstack-db-1 sh -c 'exec mysqldump --single-transaction -h localhost -u bookstack -p{PASSWORD} bookstackapp' > /share/docker_data/__backups/bookstack_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} bookstack_{DATETIME}.sql.zip bookstack_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -os.remove(f"bookstack_{DATETIME}.sql") +if args.backup and args.nextcloud: + print("Backup nextcloud") + cmnd = 'docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --on' + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"docker exec nextcloud-db-1 sh -c 'exec mysqldump --single-transaction -h localhost -u nextcloud -p{PASSWORD} nextcloud' > /share/docker_data/__backups/nextcloudDB_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = "docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --off" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"zip -P {PASSWORD} nextcloudDB_{DATETIME}.sql.zip nextcloudDB_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + os.remove(f"nextcloudDB_{DATETIME}.sql") +if args.backup and args.bookstack: + print("Backup Bookstack") + cmnd = f"docker exec bookstack-db-1 sh -c 'exec mysqldump --single-transaction -h localhost -u bookstack -p{PASSWORD} bookstackapp' > /share/docker_data/__backups/bookstack_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"zip -P {PASSWORD} bookstack_{DATETIME}.sql.zip bookstack_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + os.remove(f"bookstack_{DATETIME}.sql") +if args.backup and args.kestra: + print("Backup Kestra") + cmnd = f"docker exec kestra-postgres-1 sh -c 'pg_dump -h localhost -p 5432 -U kestra -d kestra' > /share/docker_data/__backups/kestra_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"zip -P {PASSWORD} kestra_{DATETIME}.sql.zip kestra_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + os.remove(f"kestra_{DATETIME}.sql") +if args.backup and args.authentik: + print("Backup Authentik") + cmnd = f"docker exec authentik-postgresql-1 sh -c 'pg_dump -h localhost -p 5432 -U authentik -d authentik' > /share/docker_data/__backups/authentik_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"zip -P {PASSWORD} authentik_{DATETIME}.sql.zip authentik_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + os.remove(f"authentik_{DATETIME}.sql") +if args.backup and args.zabbix: + print("Backup Zabbix") + cmnd = f"docker exec zabbix-server-db-server-1 sh -c 'pg_dump -h localhost -p 5432 -U zabbix -d zabbix' > /share/docker_data/__backups/zabbix_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"zip -P {PASSWORD} zabbix_{DATETIME}.sql.zip zabbix_{DATETIME}.sql" + status, output = subprocess.getstatusoutput(cmnd) + os.remove(f"zabbix_{DATETIME}.sql") +if args.backup and args.influx: + print("Backup Influx") + cmnd = f"docker exec home-assistant-influxdb-1 influx backup /backup" + status, output = subprocess.getstatusoutput(cmnd) + cmnd = f"docker cp influxdb:/backup /tmp/backup_{DATETIME}" + status, output = subprocess.getstatusoutput(cmnd) + print(output) + cmnd = f"zip -P {PASSWORD} influxdb_{DATETIME}.zip /tmp/backup_{DATETIME}" + status, output = subprocess.getstatusoutput(cmnd) + print(output) +if args.backup and args.portainer: + print("Backup portainer") + headers = { + 'Content-Type': 'application/json; charset=utf-8', + 'x-api-key':'ptr_gfwpbP4AUDhZ4uoPmSfNUGqZq+gescoele8reP/l/GU=', + } -print("Backup Kestra") -cmnd = f"docker exec kestra-postgres-1 sh -c 'pg_dump -h localhost -p 5432 -U kestra -d kestra' > /share/docker_data/__backups/kestra_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} kestra_{DATETIME}.sql.zip kestra_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -os.remove(f"kestra_{DATETIME}.sql") + json_data = { + 'password': PASSWORD, + } -print("Backup Authentik") -cmnd = f"docker exec authentik-postgresql-1 sh -c 'pg_dump -h localhost -p 5432 -U authentik -d authentik' > /share/docker_data/__backups/authentik_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} authentik_{DATETIME}.sql.zip authentik_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -os.remove(f"authentik_{DATETIME}.sql") + response = requests.post('https://portainer.sectorq.eu/api/backup', headers=headers, json=json_data, verify=True) -print("Backup Zabbix") -cmnd = f"docker exec zabbix-server-db-server-1 sh -c 'pg_dump -h localhost -p 5432 -U zabbix -d zabbix' > /share/docker_data/__backups/zabbix_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} zabbix_{DATETIME}.sql.zip zabbix_{DATETIME}.sql" -status, output = subprocess.getstatusoutput(cmnd) -os.remove(f"zabbix_{DATETIME}.sql") + # Note: json_data will not be serialized by requests + # exactly as it was in the original request. + #data = '{ "password": "" }' + #response = requests.post('https://portainer.sectorq.eu/api/backup', headers=headers, data=data, verify=False) -print("Backup Influx") -cmnd = f"docker exec home-assistant-influxdb-1 influx backup /backup" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"docker cp influxdb:/backup /tmp/backup" -status, output = subprocess.getstatusoutput(cmnd) -cmnd = f"zip -P {PASSWORD} influxdb_{DATETIME}.zip /tmp/backup" -status, output = subprocess.getstatusoutput(cmnd) - -print("Backup portainer") -headers = { - 'Content-Type': 'application/json; charset=utf-8', - 'x-api-key':'ptr_gfwpbP4AUDhZ4uoPmSfNUGqZq+gescoele8reP/l/GU=', -} - -json_data = { - 'password': PASSWORD, -} - -response = requests.post('https://portainer.sectorq.eu/api/backup', headers=headers, json=json_data, verify=True) - -# Note: json_data will not be serialized by requests -# exactly as it was in the original request. -#data = '{ "password": "" }' -#response = requests.post('https://portainer.sectorq.eu/api/backup', headers=headers, data=data, verify=False) - -with open(f'/share/docker_data/__backups/portainer_snapshot_{DATETIME}.tar.gz', 'wb') as f: - f.write(response.content) + with open(f'/share/docker_data/__backups/portainer_snapshot_{DATETIME}.tar.gz', 'wb') as f: + f.write(response.content) os.chdir("/share/docker_data/__backups/") print("Remove Old Files") cmnd = f" find ./ -maxdepth 1 -type f -mtime +15 -exec rm -f {{}} \\;"