#!/bin/bash # 数据备份脚本 # 备份 /opt/gamer 的数据到 /opt/backup/data/YYYYMMDD/gamer # 设置变量 SOURCE_DIR="/opt/gamer" BACKUP_ROOT="/opt/backup/data" DATE=$(date +%Y%m%d) BACKUP_DIR="${BACKUP_ROOT}/${DATE}/gamer" # 创建备份目录 mkdir -p "${BACKUP_DIR}" # 备份数据库 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份数据库..." export SOURCE_DIR BACKUP_DIR node <<'NODE' const path = require('path'); const sourceDir = process.env.SOURCE_DIR; const backupDir = process.env.BACKUP_DIR; const Database = require(path.join(sourceDir, 'node_modules', 'better-sqlite3')); async function main() { const db = new Database(path.join(sourceDir, 'data.db'), { readonly: true }); try { await db.backup(path.join(backupDir, 'data.db')); } finally { db.close(); } } main().catch((err) => { console.error(err); process.exit(1); }); NODE if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库备份完成" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库备份失败" exit 1 fi # 备份 public 目录 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份 public 目录..." cp -r "${SOURCE_DIR}/public" "${BACKUP_DIR}/public" if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] public 目录备份完成" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] public 目录备份失败" exit 1 fi # 记录备份日志 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成: ${BACKUP_DIR}" # 清理7天前的旧备份(可选) find "${BACKUP_ROOT}" -type d -name "20*" -mtime +7 -exec rm -rf {} \; 2>/dev/null echo "[$(date '+%Y-%m-%d %H:%M:%S')] 旧备份清理完成"