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 |