Compare commits

...

8 Commits

Author SHA1 Message Date
829525fdaf build 2025-11-18 22:22:49 +01:00
477070ec37 build 2025-11-18 22:11:43 +01:00
e94e7e7272 build 2025-11-18 22:09:37 +01:00
d156d5450b build 2025-11-18 22:07:50 +01:00
fb8ea90428 build 2025-11-18 22:05:18 +01:00
2f58d525fd build 2025-11-18 22:00:41 +01:00
354b16da49 added v3 2025-11-18 21:58:36 +01:00
ac262cc98a added v3 2025-11-18 21:37:35 +01:00
2 changed files with 95 additions and 63 deletions

View File

@@ -4,9 +4,27 @@ import datetime
import os import os
import shutil import shutil
now = datetime.datetime.now() 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("--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" PASSWORD= "l4c1j4yd33Du5lo"
DATETIME = now.strftime("%Y%m%d%H%M%S") DATETIME = now.strftime("%Y%m%d%H%M%S")
os.chdir("/share/docker_data/__backups/") os.chdir("/share/docker_data/__backups/")
if args.backup and (args.gitlab or args.all):
print("Backup gitlab") print("Backup gitlab")
cmnd = 'docker exec -t gitlab gitlab-backup create SKIP=artifacts,repositories,registry,uploads,builds,pages,lfs,packages,terraform_state' cmnd = 'docker exec -t gitlab gitlab-backup create SKIP=artifacts,repositories,registry,uploads,builds,pages,lfs,packages,terraform_state'
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
@@ -15,6 +33,8 @@ for f in allfiles:
shutil.move(f"/share/docker_data/gitlab/data/backups/{f}", "/share/docker_data/__backups/") 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") print("Backup nextcloud")
cmnd = 'docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --on' cmnd = 'docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --on'
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
@@ -22,39 +42,49 @@ cmnd = f"docker exec nextcloud-db-1 sh -c 'exec mysqldump --single-transaction -
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
cmnd = "docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --off" cmnd = "docker exec --user www-data nextcloud-app-1 php occ maintenance:mode --off"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
cmnd = f"zip -P {PASSWORD} nextcloudDB_{DATETIME}.sql.zip nextcloudDB_{DATETIME}.sql" cmnd = f"zip -e -P {PASSWORD} nextcloudDB_{DATETIME}.sql.zip nextcloudDB_{DATETIME}.sql"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
os.remove(f"nextcloudDB_{DATETIME}.sql") os.remove(f"nextcloudDB_{DATETIME}.sql")
if args.backup and (args.bookstack or args.all):
print("Backup 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" 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) status, output = subprocess.getstatusoutput(cmnd)
cmnd = f"zip -P {PASSWORD} bookstack_{DATETIME}.sql.zip bookstack_{DATETIME}.sql" cmnd = f"zip -e -P {PASSWORD} bookstack_{DATETIME}.sql.zip bookstack_{DATETIME}.sql"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
os.remove(f"bookstack_{DATETIME}.sql") os.remove(f"bookstack_{DATETIME}.sql")
if args.backup and (args.kestra or args.all):
print("Backup 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" 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) status, output = subprocess.getstatusoutput(cmnd)
cmnd = f"zip -P {PASSWORD} kestra_{DATETIME}.sql.zip kestra_{DATETIME}.sql" cmnd = f"zip -e -P {PASSWORD} kestra_{DATETIME}.sql.zip kestra_{DATETIME}.sql"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
os.remove(f"kestra_{DATETIME}.sql") os.remove(f"kestra_{DATETIME}.sql")
if args.backup and (args.authentik or args.all):
print("Backup 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" 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) status, output = subprocess.getstatusoutput(cmnd)
cmnd = f"zip -P {PASSWORD} authentik_{DATETIME}.sql.zip authentik_{DATETIME}.sql" cmnd = f"zip -e -P {PASSWORD} authentik_{DATETIME}.sql.zip authentik_{DATETIME}.sql"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
os.remove(f"authentik_{DATETIME}.sql") os.remove(f"authentik_{DATETIME}.sql")
if args.backup and (args.zabbix or args.all):
print("Backup 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" 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) status, output = subprocess.getstatusoutput(cmnd)
cmnd = f"zip -P {PASSWORD} zabbix_{DATETIME}.sql.zip zabbix_{DATETIME}.sql" cmnd = f"zip -e -P {PASSWORD} zabbix_{DATETIME}.sql.zip zabbix_{DATETIME}.sql"
status, output = subprocess.getstatusoutput(cmnd) status, output = subprocess.getstatusoutput(cmnd)
os.remove(f"zabbix_{DATETIME}.sql") 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)
print(output)
cmnd = f"docker cp home-assistant-influxdb-1:/backup /tmp/backup_{DATETIME}"
status, output = subprocess.getstatusoutput(cmnd)
print(output)
cmnd = f"zip -e -r -P {PASSWORD} influxdb_{DATETIME}.zip /tmp/backup_{DATETIME}"
status, output = subprocess.getstatusoutput(cmnd)
print(output)
if args.backup and (args.portainer or args.all):
print("Backup portainer") print("Backup portainer")
headers = { headers = {
'Content-Type': 'application/json; charset=utf-8', 'Content-Type': 'application/json; charset=utf-8',
@@ -64,7 +94,6 @@ headers = {
json_data = { json_data = {
'password': PASSWORD, 'password': PASSWORD,
} }
response = requests.post('https://portainer.sectorq.eu/api/backup', headers=headers, json=json_data, verify=True) 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 # Note: json_data will not be serialized by requests

View File

@@ -578,8 +578,11 @@ def backup_job(pl):
break break
apps.remove(line[0]) apps.remove(line[0])
sub_finished.append(line[0]) sub_finished.append(line[0])
msg = {"mode":_MODE, "status":"started","bak_name":"complete","host":host,"cur_job":b,"sub":line[0],"start_time":STARTTIME,"end_time":"in progress","progress":str(round(progress)) + "%","finished":",".join(finished),"sub_finished":",".join(sub_finished)} # msg = {"mode":_MODE, "status":"started","bak_name":"complete","host":host,"cur_job":b,"sub":line[0],"start_time":STARTTIME,"end_time":"in progress","progress":str(round(progress)) + "%","finished":",".join(finished),"sub_finished":",".join(sub_finished)}
msg = {"mode":_MODE, "status":"started","bak_name":"complete","host":host,"cur_job":b,"sub":line[0],"start_time":STARTTIME,"end_time":"in progress","progress":str(round(progress)) + "%","finished":",".join(finished)}
logging.info(f"Sending message with topic {topic} {json.dumps(msg)}") logging.info(f"Sending message with topic {topic} {json.dumps(msg)}")
if not "gitea-runner" == line[0]: if not "gitea-runner" == line[0]:
client2.publish(topic, json.dumps(msg),qos=0, retain=False) client2.publish(topic, json.dumps(msg),qos=0, retain=False)
progress = progress + step progress = progress + step