from __future__ import annotations import argparse, shutil, subprocess, tarfile, time from pathlib import Path import sys ROOT=Path(__file__).resolve().parents[1] sys.path.insert(0,str(ROOT)) from sourcehub.config import Settings parser=argparse.ArgumentParser() parser.add_argument("--out",default="backups") args=parser.parse_args() settings=Settings.from_env() out=Path(args.out);out.mkdir(parents=True,exist_ok=True) stamp=time.strftime("%Y%m%d-%H%M%S") if settings.database_kind=="sqlite": db=Path(settings.database_url.replace("sqlite:///","",1)) shutil.copy2(db,out/f"sourcehub-{stamp}.db") elif settings.database_kind=="postgresql": target=out/f"sourcehub-{stamp}.dump" subprocess.run(["pg_dump","--format=custom","--file",str(target),settings.database_url],check=True) else: raise SystemExit("지원하지 않는 DB backend") if settings.storage_backend=="local": tar_path=out/f"sourcehub-storage-{stamp}.tar.gz" with tarfile.open(tar_path,"w:gz") as tar: tar.add(settings.local_storage_dir,arcname="storage") print(tar_path) else: print("MinIO object backup은 bucket versioning/replication 또는 mc mirror 정책으로 운영하세요.") print("backup complete",stamp)