#!/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