File size: 2,480 Bytes
398ee84
 
 
febf61a
398ee84
 
 
 
 
 
 
4c3b9c0
398ee84
2ebc237
 
febf61a
9506a5d
febf61a
9506a5d
febf61a
9506a5d
 
4c3b9c0
9506a5d
4c3b9c0
 
 
 
 
 
9506a5d
 
4c3b9c0
9506a5d
 
2ebc237
e5c2d36
4c3b9c0
9506a5d
febf61a
 
 
9506a5d
 
 
 
 
febf61a
9506a5d
 
 
 
 
febf61a
9506a5d
 
 
 
 
398ee84
9506a5d
 
 
 
febf61a
9506a5d
 
398ee84
 
 
 
 
 
 
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
#!/bin/bash

if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then
    echo "Starting without backup - missing HF_TOKEN or DATASET_ID"
    exec uvicorn app.main:app --host 0.0.0.0 --port 7860
    exit 0
fi

export HUGGING_FACE_HUB_TOKEN=$HF_TOKEN

restore_latest() {
    echo "正在检查是否有可用备份..."
    python3 -c "
from huggingface_hub import HfApi
import os

api = HfApi()
files = api.list_repo_files('${DATASET_ID}', repo_type='dataset')
backup_files = sorted([f for f in files if f.startswith('backup_') and f.endswith('.tar.gz')])

if backup_files:
    latest = backup_files[-1]
    print(f'发现备份文件: {latest}, 正在下载...')
    api.hf_hub_download(repo_id='${DATASET_ID}', filename=latest, repo_type='dataset', local_dir='/tmp')
    # 解压文件并禁止恢复原始权限和所有者,避免容器内权限错误
    result = os.system(f'tar --no-same-owner --no-same-permissions -xzf /tmp/{latest} -C /app')
    if result == 0:
        print(f'成功从 {latest} 恢复备份数据')
    else:
        print(f'解压备份文件 {latest} 时出现问题,请检查相关日志')
    os.remove(f'/tmp/{latest}')
else:
    print('未找到备份文件,已跳过数据恢复步骤')
"
}



sync_data() {
    echo "Waiting ${SYNC_INTERVAL:-7200} seconds before first backup..."
    sleep ${SYNC_INTERVAL:-7200}

    while true; do
        echo "Starting backup at $(date)"
        cd /app
        timestamp=$(date +%Y%m%d_%H%M%S)
        backup_file="backup_${timestamp}.tar.gz"

        if [ -d "app" ] && [ "$(ls -A app 2>/dev/null)" ]; then
            tar -czf "/tmp/${backup_file}" app/
            python3 -c "
from huggingface_hub import HfApi
api = HfApi()
api.upload_file('/tmp/${backup_file}', '${backup_file}', '${DATASET_ID}', repo_type='dataset')
print('Backup uploaded successfully')
backup_files = sorted([f for f in api.list_repo_files('${DATASET_ID}', repo_type='dataset') if f.startswith('backup_')])
for old_backup in backup_files[:-50]:
    api.delete_file(path_in_repo=old_backup, repo_id='${DATASET_ID}', repo_type='dataset')
    print(f'Deleted old backup: {old_backup}')
"
            rm -f "/tmp/${backup_file}"
        else
            echo "No data to backup"
        fi
        echo "Next backup in ${SYNC_INTERVAL:-7200} seconds..."
        sleep ${SYNC_INTERVAL:-7200}
    done
}

(
    restore_latest
    sync_data &
    exec uvicorn app.main:app --host 0.0.0.0 --port 7860
) 2>&1 | tee -a /app/data/backup.log