mirror of
https://gitlab.sectorq.eu/jaydee/omv_backup.git
synced 2025-12-14 10:04:52 +01:00
116 lines
6.2 KiB
Python
Executable File
116 lines
6.2 KiB
Python
Executable File
import subprocess
|
|
import requests
|
|
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("--gitlab", "-g", action="store_true", help="Select influx")
|
|
parser.add_argument("--immich", "-m", action="store_true", help="Select immich")
|
|
parser.add_argument("--nextcloud", "-n", action="store_true", help="Select influx")
|
|
parser.add_argument("--zabbix", "-z", action="store_true", help="Select influx")
|
|
parser.add_argument("--bookstack", "-s", action="store_true", help="Select influx")
|
|
parser.add_argument("--influx", "-i", action="store_true", help="Select influx")
|
|
parser.add_argument("--kestra", "-k", action="store_true", help="Select influx")
|
|
parser.add_argument("--authentik", "-a", action="store_true", help="Select influx")
|
|
parser.add_argument("--portainer", "-p", action="store_true", help="Select influx")
|
|
parser.add_argument("--backup", "-b", action="store_true", help="Select backup mode")
|
|
parser.add_argument("--all", "-A", 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/")
|
|
|
|
if args.backup and (args.gitlab or args.all):
|
|
print("Backup gitlab")
|
|
cmnd = 'docker exec -t gitlab gitlab-backup create SKIP=artifacts,repositories,registry,uploads,builds,pages,lfs,packages,terraform_state'
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
allfiles = os.listdir("/share/docker_data/gitlab/data/backups/")
|
|
for f in allfiles:
|
|
shutil.move(f"/share/docker_data/gitlab/data/backups/{f}", "/share/docker_data/__backups/")
|
|
|
|
|
|
|
|
if args.backup and (args.nextcloud or args.all):
|
|
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 -e -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 or args.all):
|
|
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 -e -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.immich or args.all):
|
|
print("Backup Immich")
|
|
cmnd = f"docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres > /share/docker_data/__backups/immich_{DATETIME}.sql"
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
cmnd = f"zip -e -P {PASSWORD} immich_{DATETIME}.sql.zip immich_{DATETIME}.sql"
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
os.remove(f"bookstack_{DATETIME}.sql")
|
|
|
|
if args.backup and (args.kestra or args.all):
|
|
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 -e -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 or args.all):
|
|
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 -e -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 or args.all):
|
|
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 -e -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 or args.all):
|
|
print("Backup Influx")
|
|
cmnd = f"docker exec home-assistant-influxdb-1 influx backup /backup"
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
cmnd = f"docker cp home-assistant-influxdb-1:/backup /tmp/backup_{DATETIME}"
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
cmnd = f"zip -e -r -P {PASSWORD} influxdb_{DATETIME}.zip /tmp/backup_{DATETIME}"
|
|
status, output = subprocess.getstatusoutput(cmnd)
|
|
if args.backup and (args.portainer or args.all):
|
|
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)
|
|
os.chdir("/share/docker_data/__backups/")
|
|
print("Remove Old Files")
|
|
cmnd = f" find ./ -maxdepth 1 -type f -mtime +15 -exec rm -f {{}} \\;"
|
|
status, output = subprocess.getstatusoutput(cmnd) |