File size: 4,726 Bytes
b69a3ea
9ed6b0b
b69a3ea
 
 
 
 
9ed6b0b
b69a3ea
 
9ed6b0b
b69a3ea
9ed6b0b
b69a3ea
9ed6b0b
b69a3ea
 
9ed6b0b
 
 
 
 
 
b69a3ea
9ed6b0b
 
 
b69a3ea
9ed6b0b
 
b69a3ea
 
 
 
 
 
 
 
 
9ed6b0b
b69a3ea
 
9ed6b0b
 
b69a3ea
9ed6b0b
b69a3ea
 
 
 
 
 
 
 
 
 
 
 
 
9ed6b0b
b69a3ea
 
 
9ed6b0b
 
 
 
 
b69a3ea
9ed6b0b
b69a3ea
9ed6b0b
b69a3ea
9ed6b0b
 
 
 
 
 
 
 
b69a3ea
 
 
 
 
 
 
 
9ed6b0b
 
 
 
b69a3ea
9ed6b0b
 
b69a3ea
9ed6b0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b69a3ea
 
9ed6b0b
b69a3ea
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# ─────────────────────────────────────────────────────────────
# πŸ“ PATH: sync.py (root HF Space repo)
# ─────────────────────────────────────────────────────────────

import os
import sys
import tarfile
import time
from huggingface_hub import HfApi, hf_hub_download

api     = HfApi()
repo_id = os.getenv("HF_DATASET")
token   = os.getenv("HF_TOKEN")

FILENAME         = "latest_backup.tar.gz"
BROWSER_FILENAME = "browser_backup.tar.gz"

# Folder/file yang di-SKIP dari backup utama
# - openclaw.json  β†’ auto-create setiap startup, tidak perlu backup
# - browsers       β†’ punya backup terpisah (BROWSER_FILENAME)
SKIP_NAMES = {"openclaw.json", "browsers"}


def restore():
    if not repo_id or not token:
        print("Skip Restore: HF_DATASET atau HF_TOKEN belum di-set.")
        return

    # ── Restore 1: sessions & memory ──────────────────────────
    try:
        print(f"Downloading {FILENAME} from {repo_id}...")
        path = hf_hub_download(
            repo_id=repo_id,
            filename=FILENAME,
            repo_type="dataset",
            token=token
        )
        with tarfile.open(path, "r:gz") as tar:
            tar.extractall(path="/root/.openclaw/")
        print(f"Success: Restored from {FILENAME}")

    except Exception as e:
        print(f"Restore Note: {e}")
        print("  β†’ Fresh install, normal untuk deploy pertama.")

    # ── Restore 2: browser binary ──────────────────────────────
    try:
        print(f"Downloading {BROWSER_FILENAME} from {repo_id}...")
        browser_path = hf_hub_download(
            repo_id=repo_id,
            filename=BROWSER_FILENAME,
            repo_type="dataset",
            token=token
        )
        with tarfile.open(browser_path, "r:gz") as tar:
            tar.extractall(path="/root/.openclaw/")
        print(f"Success: Restored browser from {BROWSER_FILENAME}")

    except Exception as e:
        print(f"Restore Note (browser): {e} β€” akan install fresh jika dibutuhkan.")


def backup():
    if not repo_id or not token:
        print("Skip Backup: HF_DATASET atau HF_TOKEN belum di-set.")
        return

    # ── Backup 1: semua file/folder kecuali yang di SKIP_NAMES ─
    try:
        base_dir = "/root/.openclaw"

        print(f"Creating {FILENAME} (semua kecuali: {SKIP_NAMES})...")
        with tarfile.open(FILENAME, "w:gz") as tar:
            for item in os.listdir(base_dir):
                if item in SKIP_NAMES:
                    print(f"  - Skip: {item}")
                    continue
                full_path = os.path.join(base_dir, item)
                arcname   = item  # path relatif di dalam tar = relatif ke /root/.openclaw/
                tar.add(full_path, arcname=arcname)
                print(f"  + Added: {full_path}")

        api.upload_file(
            path_or_fileobj=FILENAME,
            path_in_repo=FILENAME,
            repo_id=repo_id,
            repo_type="dataset",
            token=token
        )
        print(f"Backup Success β€” {time.strftime('%Y-%m-%d %H:%M:%S')}")

    except Exception as e:
        print(f"Backup Error: {e}")

    # ── Backup 2: browser binary (upload sekali saja, ~150MB) ──
    try:
        browsers_dir = "/root/.openclaw/browsers"
        if not os.path.exists(browsers_dir):
            return

        # Cek apakah sudah ada di dataset
        try:
            hf_hub_download(
                repo_id=repo_id,
                filename=BROWSER_FILENAME,
                repo_type="dataset",
                token=token
            )
            print("Browser backup sudah ada di dataset β€” skip upload.")
        except Exception:
            # Belum ada β†’ upload sekarang
            print("Uploading browser backup (first time, ~150MB)...")
            with tarfile.open(BROWSER_FILENAME, "w:gz") as tar:
                tar.add(browsers_dir, arcname="browsers")
            api.upload_file(
                path_or_fileobj=BROWSER_FILENAME,
                path_in_repo=BROWSER_FILENAME,
                repo_id=repo_id,
                repo_type="dataset",
                token=token
            )
            print("Browser backup uploaded.")

    except Exception as e:
        print(f"Backup Error (browser): {e}")


if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "backup":
        backup()
    else:
        restore()