Spaces:
zym1
/
Running

File size: 3,811 Bytes
437ef8f
 
 
 
d74c57a
437ef8f
 
 
d74c57a
 
 
 
 
 
 
 
 
 
 
 
 
 
437ef8f
 
 
 
 
 
d74c57a
 
437ef8f
 
 
 
 
 
d74c57a
 
437ef8f
d74c57a
 
437ef8f
 
d74c57a
 
 
 
437ef8f
d74c57a
437ef8f
d74c57a
437ef8f
d74c57a
437ef8f
 
 
 
 
 
d74c57a
 
 
 
437ef8f
 
 
 
 
 
d74c57a
437ef8f
d74c57a
 
437ef8f
 
d74c57a
437ef8f
 
 
 
 
 
d74c57a
437ef8f
d74c57a
437ef8f
 
 
 
d74c57a
 
 
437ef8f
 
d74c57a
437ef8f
 
 
d74c57a
 
 
 
 
437ef8f
 
d74c57a
437ef8f
d74c57a
 
437ef8f
d74c57a
437ef8f
 
d74c57a
437ef8f
 
d74c57a
437ef8f
d74c57a
437ef8f
d74c57a
437ef8f
 
d74c57a
437ef8f
 
 
 
 
d74c57a
 
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
#!/bin/bash

# 检查环境变量
if [[ -z "$HF_TOKEN" ]] || [[ -z "$DATASET_ID" ]]; then
    echo "未启用备份功能 - 缺少HF_TOKEN或DATASET_ID环境变量"
    exit 0
fi

# 创建临时目录
TEMP_DIR="/tmp/sillytavern_backup"
mkdir -p $TEMP_DIR

# 安装python和huggingface_hub
if ! command -v python3 &> /dev/null; then
    echo "正在安装Python..."
    apk add --no-cache python3 py3-pip
fi

if ! python3 -c "import huggingface_hub" &> /dev/null; then
    echo "正在安装huggingface_hub..."
    pip3 install --no-cache-dir huggingface_hub
fi

# 上传备份
upload_backup() {
import sys
import os
def manage_backups(api, repo_id, max_files=10):
    files = api.list_repo_files(repo_id=repo_id, repo_type='dataset')
    backup_files = [f for f in files if f.startswith('sillytavern_backup_') and f.endswith('.tar.gz')]
    backup_files.sort()
    
    if len(backup_files) >= max_files:
        files_to_delete = backup_files[:(len(backup_files) - max_files + 1)]
        for file_to_delete in files_to_delete:
            try:
                api.delete_file(path_in_repo=file_to_delete, repo_id=repo_id, repo_type='dataset')
                print(f'已删除旧备份: {file_to_delete}')
            except Exception as e:
                print(f'删除 {file_to_delete} 时出错: {str(e)}')
api = HfApi(token='$token')
try:
    api.upload_file(
        path_or_fileobj='$file_path',
        path_in_repo='$file_name',
        repo_id='$repo_id',
        repo_type='dataset'
    )
    print(f'成功上传 $file_name')
    
    manage_backups(api, '$repo_id')
except Exception as e:
    print(f'上传文件时出错: {str(e)}')
"
}

download_latest_backup() {
    token="$HF_TOKEN"
    repo_id="$DATASET_ID"
    data_dir="/home/node/app/data"
    
    # 确保数据目录存在
    mkdir -p $data_dir

    python3 -c "
from huggingface_hub import HfApi
import os
import tarfile
import tempfile
api = HfApi(token='$token')
try:
    files = api.list_repo_files(repo_id='$repo_id', repo_type='dataset')
    backup_files = [f for f in files if f.startswith('sillytavern_backup_') and f.endswith('.tar.gz')]
    
    if not backup_files:
        print('未找到备份文件')
        sys.exit()
        
    latest_backup = sorted(backup_files)[-1]
    
    with tempfile.TemporaryDirectory() as temp_dir:
        filepath = api.hf_hub_download(
            repo_id='$repo_id',
            filename=latest_backup,
            repo_type='dataset',
            local_dir=temp_dir
        )
        
        if filepath and os.path.exists(filepath):
            with tarfile.open(filepath, 'r:gz') as tar:
                tar.extractall('$data_dir')
            print(f'成功从 {latest_backup} 恢复备份')
        
except Exception as e:
    print(f'下载备份时出错: {str(e)}')
"
}

# 首次启动时下载最新备份
echo "正在从HuggingFace下载最新备份..."
download_latest_backup

# 同步函数
sync_data() {
    while true; do
        echo "开始同步进程,时间: $(date)"
        
        data_dir="/home/node/app/data"
        if [ -d "$data_dir" ]; then
            timestamp=$(date +%Y%m%d_%H%M%S)
            backup_file="sillytavern_backup_${timestamp}.tar.gz"
            
            # 压缩数据目录
            tar -czf "${TEMP_DIR}/${backup_file}" -C "$data_dir" .
            
            echo "正在上传备份到HuggingFace..."
            upload_backup "${TEMP_DIR}/${backup_file}" "${backup_file}"
            
            rm -f "${TEMP_DIR}/${backup_file}"
        else
            echo "数据目录尚不存在,等待下次同步..."
        fi
        
        SYNC_INTERVAL=${SYNC_INTERVAL:-3600}
        echo "下次同步将在 ${SYNC_INTERVAL} 秒后进行..."
        sleep $SYNC_INTERVAL
    done
}

# 启动同步进程
sync_data