diff --git a/.gitignore b/.gitignore index d686ae120..e33b1579d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,8 @@ docker # fly.io fly.toml +lnbits-backup.zip + # Ignore extensions (post installable extension PR) extensions/ upgrades/ diff --git a/lnbits/core/templates/admin/index.html b/lnbits/core/templates/admin/index.html index 96e04fe61..4ddca6c0e 100644 --- a/lnbits/core/templates/admin/index.html +++ b/lnbits/core/templates/admin/index.html @@ -47,11 +47,11 @@ Add funds to a wallet. - + > FileResponse: + last_filename = "lnbits-backup" + filename = f"lnbits-backup-{int(time.time())}.zip" + db_url = settings.lnbits_database_url + pg_backup_filename = f"{settings.lnbits_data_folder}/lnbits-database.dmp" + is_pg = db_url and db_url.startswith("postgres://") + + if is_pg: + p = urlparse(db_url) + command = ( + f"pg_dump --host={p.hostname} " + f'--dbname={p.path.replace("/", "")} ' + f"--username={p.username} " + f"--no-password " + f"--format=c " + f"--file={pg_backup_filename}" + ) + proc = Popen( + command, shell=True, env={**os.environ, "PGPASSWORD": p.password or ""} + ) + proc.wait() + + make_archive(last_filename, "zip", settings.lnbits_data_folder) + + # cleanup pg_dump file + if is_pg: + proc = Popen(f"rm {pg_backup_filename}", shell=True) + proc.wait() + + return FileResponse( + path=f"{last_filename}.zip", filename=filename, media_type="application/zip" + )