Sync from main server - 2026-05-16 00:38:48
This commit is contained in:
@@ -81,7 +81,6 @@ def r2_test_connection() -> dict:
|
||||
except Exception as e:
|
||||
return {"success": False, "message": str(e), "bucket_exists": False}
|
||||
|
||||
|
||||
def r2_ensure_bucket() -> tuple[bool, str]:
|
||||
cfg = _get_r2_config()
|
||||
bucket = cfg["bucket_name"]
|
||||
@@ -125,6 +124,35 @@ def r2_list_backups() -> list[dict]:
|
||||
except Exception:
|
||||
return []
|
||||
|
||||
def r2_enforce_retention(max_backups: int = 5) -> list[str]:
|
||||
"""Keep only the latest max_backups in R2, delete the rest. Returns list of deleted keys."""
|
||||
if not r2_is_configured():
|
||||
return []
|
||||
cfg = _get_r2_config()
|
||||
bucket = cfg["bucket_name"]
|
||||
deleted = []
|
||||
try:
|
||||
client = _get_r2_client()
|
||||
resp = client.list_objects_v2(Bucket=bucket, Prefix="backups/")
|
||||
# Only count real archives, not .sha256 files
|
||||
objects = sorted(
|
||||
[o for o in resp.get("Contents", []) if not o["Key"].endswith(".sha256")],
|
||||
key=lambda x: x["LastModified"],
|
||||
reverse=True # newest first
|
||||
)
|
||||
to_delete = objects[max_backups:] # everything beyond the 5 latest
|
||||
for obj in to_delete:
|
||||
key = obj["Key"]
|
||||
client.delete_object(Bucket=bucket, Key=key)
|
||||
# Also delete the sha256 companion if it exists
|
||||
try:
|
||||
client.delete_object(Bucket=bucket, Key=key + ".sha256")
|
||||
except Exception:
|
||||
pass
|
||||
deleted.append(key)
|
||||
except Exception as e:
|
||||
print(f"R2 retention error: {e}")
|
||||
return deleted
|
||||
|
||||
def r2_delete_backup(key: str) -> tuple[bool, str]:
|
||||
cfg = _get_r2_config()
|
||||
@@ -227,6 +255,10 @@ def r2_upload_async(local_path: str, job_id: str) -> None:
|
||||
_upload_jobs[job_id]["log"].append(
|
||||
f"Upload complete in {elapsed}s — r2://{bucket}/{object_key}"
|
||||
)
|
||||
# Enforce R2 retention — keep only 5 latest
|
||||
deleted = r2_enforce_retention(max_backups=5)
|
||||
for dk in deleted:
|
||||
_upload_jobs[job_id]["log"].append(f"🗑️ Pruned old R2 backup: {dk.replace('backups/', '')}")
|
||||
_upload_jobs[job_id]["status"] = "done"
|
||||
_upload_jobs[job_id]["progress"] = 100
|
||||
_upload_jobs[job_id]["object_key"] = object_key
|
||||
|
||||
Reference in New Issue
Block a user