Files
crypto_monitor_user/备份与恢复.md
T
2026-05-21 16:51:27 +08:00

7.7 KiB
Raw Blame History

备份与恢复(Ubuntu 服务器)

本文档面向 VPS / Ubuntu,项目统一放在 /opt/crypto_monitor_user,数据备份统一放在 /root/backups

类型 内容 存放位置 频率
数据库 + 复盘图片 crypto.dbstatic/images /root/backups/<实例名>/YYYY-MM-DD/ 每天北京时间 0:00cron
.env 配置 API、密码、风控参数等 项目目录 .env.backup.日期;可选集中拷到 /root/backups/env/ 升级 / 改配置前手动执行

.env 不会被自动备份脚本包含(含密钥,请单独备份)。
三个常用实例:crypto_monitor_binancecrypto_monitor_gatecrypto_monitor_gate_bot


一、首次安装:三个实例自动备份 + 试跑

整段复制到 SSH 终端执行(需 root 或对该目录有写权限):

apt install -y sqlite3 2>/dev/null || true

for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  cd "/opt/crypto_monitor_user/${dir}" || exit 1
  chmod +x scripts/backup_data.sh scripts/install_backup_cron.sh
  bash scripts/install_backup_cron.sh
  bash scripts/backup_data.sh
done

echo "=== crontab ==="
crontab -l
echo "=== backup dirs ==="
ls -la /root/backups/*/

成功后应有:

  • crontab -l 含一行 CRON_TZ=Asia/Shanghai + 三条 0 0 * * * .../backup_data.sh
  • /root/backups/crypto_monitor_binance/2026-05-17/(日期为当天)等目录,内含 crypto.dbstatic_images.tar.gzmanifest.txt

日志路径:

  • /var/log/crypto-monitor-backup-crypto_monitor_binance.log
  • /var/log/crypto-monitor-backup-crypto_monitor_gate.log
  • /var/log/crypto-monitor-backup-crypto_monitor_gate_bot.log

二、仅安装某一个实例的自动备份

INSTANCE 改成目录名后整段执行:

INSTANCE=crypto_monitor_binance
cd "/opt/crypto_monitor_user/${INSTANCE}"
chmod +x scripts/backup_data.sh scripts/install_backup_cron.sh
bash scripts/install_backup_cron.sh
bash scripts/backup_data.sh

INSTANCE 可选:crypto_monitor_binance | crypto_monitor_gate | crypto_monitor_gate_bot


三、手动立即备份(数据库 + 图片,三个实例)

不等到 0 点,立刻各备份一次:

for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  echo ">>> ${dir}"
  bash "/opt/crypto_monitor_user/${dir}/scripts/backup_data.sh"
done
ls -la /root/backups/*/*/

四、检查定时任务与备份是否正常

crontab -l
ls -la /root/backups/*/
du -sh /root/backups/*/
tail -n 20 /var/log/crypto-monitor-backup-crypto_monitor_binance.log
tail -n 20 /var/log/crypto-monitor-backup-crypto_monitor_gate.log
tail -n 20 /var/log/crypto-monitor-backup-crypto_monitor_gate_bot.log

五、.env 备份(升级 / git pull / 改密钥前)

5.1 三个实例一次性备份到各自项目目录

DATE=$(TZ=Asia/Shanghai date +%Y%m%d)
for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  src="/opt/crypto_monitor_user/${dir}/.env"
  dst="/opt/crypto_monitor_user/${dir}/.env.backup.${DATE}"
  if [ -f "$src" ]; then
    cp -a "$src" "$dst"
    echo "ok: $dst"
  else
    echo "skip (no .env): $src"
  fi
done

5.2 同时集中备份到 /root/backups/env/(推荐)

DATE=$(TZ=Asia/Shanghai date +%Y%m%d)
mkdir -p /root/backups/env
for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  src="/opt/crypto_monitor_user/${dir}/.env"
  if [ -f "$src" ]; then
    cp -a "$src" "/root/backups/env/${dir}.env.${DATE}"
    echo "ok: /root/backups/env/${dir}.env.${DATE}"
  fi
done
ls -la /root/backups/env/

/root/backups/env/ 含密钥,勿上传网盘、勿提交 Git。


六、.env 恢复

6.1 从项目目录内的备份恢复

INSTANCEDATE 改成实际值(DATE 为备份当天的 YYYYMMDD):

INSTANCE=crypto_monitor_binance
DATE=20260517
cd "/opt/crypto_monitor_user/${INSTANCE}"
cp -a ".env.backup.${DATE}" .env
echo "restored .env from .env.backup.${DATE}"

6.2 从 /root/backups/env/ 恢复

INSTANCE=crypto_monitor_binance
DATE=20260517
cp -a "/root/backups/env/${INSTANCE}.env.${DATE}" "/opt/crypto_monitor_user/${INSTANCE}/.env"
echo "restored from /root/backups/env/${INSTANCE}.env.${DATE}"

恢复后重启对应 PM2 进程,例如:

pm2 restart crypto-monitor-binance
pm2 restart crypto-monitor-gate
pm2 restart crypto-monitor-gate-bot

(进程名以你 pm2 list 为准。)


七、数据库 + 复盘图片恢复

从自动备份目录恢复。先停服务再覆盖,避免 SQLite 写入冲突。

INSTANCEDATE(文件夹名 YYYY-MM-DD)改成实际值:

INSTANCE=crypto_monitor_binance
DATE=2026-05-17
BK="/root/backups/${INSTANCE}/${DATE}"
PROJ="/opt/crypto_monitor_user/${INSTANCE}"

test -f "${BK}/crypto.db" || { echo "backup not found: ${BK}"; exit 1; }

pm2 stop crypto-monitor-binance 2>/dev/null || true

cp -a "${PROJ}/crypto.db" "${PROJ}/crypto.db.before_restore.$(date +%Y%m%d%H%M)" 2>/dev/null || true
cp -a "${BK}/crypto.db" "${PROJ}/crypto.db"

if [ -f "${BK}/static_images.tar.gz" ]; then
  tar -xzf "${BK}/static_images.tar.gz" -C "${PROJ}"
fi

pm2 start crypto-monitor-binance 2>/dev/null || true
echo "restored ${INSTANCE} from ${BK}"

Gate / Gate Bot 将 INSTANCEpm2 名称改为对应实例即可。


八、升级代码推荐顺序(含备份)

DATE=$(TZ=Asia/Shanghai date +%Y%m%d)
mkdir -p /root/backups/env

for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  PROJ="/opt/crypto_monitor_user/${dir}"
  [ -f "${PROJ}/.env" ] && cp -a "${PROJ}/.env" "/root/backups/env/${dir}.env.${DATE}"
  bash "${PROJ}/scripts/backup_data.sh" 2>/dev/null || true
done

cd /opt/crypto_monitor_user
git pull

for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  echo ">>> merge .env.example if needed: ${dir}"
  diff -u "${dir}/.env.example" "${dir}/.env" | head -30 || true
done

pm2 restart all

git pull 后对照各目录 .env.example,把新增变量名手动补进 .env(不会自动合并)。


九、备份目录结构说明

/root/backups/
  env/                                    # .env 集中备份(手动)
    crypto_monitor_binance.env.20260517
    crypto_monitor_gate.env.20260517
    crypto_monitor_gate_bot.env.20260517
  crypto_monitor_binance/
    2026-05-17/
      crypto.db
      static_images.tar.gz
      manifest.txt
  crypto_monitor_gate/
    2026-05-17/
      ...
  crypto_monitor_gate_bot/
    2026-05-17/
      ...
  • 保留策略:自动备份目录按日期文件夹保留 30 天,超期在下次 backup_data.sh 运行时删除。
  • 可选 .env 变量(写在各实例 .env 中):BACKUP_ROOTBACKUP_RETENTION_DAYSBACKUP_INSTANCE(见各目录 .env.example 注释)。

十、卸载自动备份定时任务

仅删除三个实例的 backup 行(保留其它 cron):

for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do
  SCRIPT="/opt/crypto_monitor_user/${dir}/scripts/backup_data.sh"
  crontab -l 2>/dev/null | grep -vF "$SCRIPT" | crontab -
done
crontab -l

十一、相关文档

文档 说明
README.md 仓库总览
crypto_monitor_binance/部署文档.md Binance 部署与备份细节
crypto_monitor_gate/部署文档.md Gate 部署
crypto_monitor_gate_bot/部署文档.md Gate Bot 部署