# 备份与恢复(Ubuntu 服务器) 本文档面向 **VPS / Ubuntu**,项目统一放在 **`/opt/crypto_monitor`**,数据备份统一放在 **`/root/backups`**。 | 类型 | 内容 | 存放位置 | 频率 | |------|------|----------|------| | **数据库 + 复盘图片** | `crypto.db`、`static/images` | `/root/backups/<实例名>/YYYY-MM-DD/` | 每天北京时间 **0:00**(cron) | | **`.env` 配置** | API、密码、风控参数等 | 项目目录 `.env.backup.日期`;可选集中拷到 `/root/backups/env/` | **升级 / 改配置前**手动执行 | > `.env` **不会**被自动备份脚本包含(含密钥,请单独备份)。 > 三个常用实例:`crypto_monitor_binance`、`crypto_monitor_gate`、`crypto_monitor_gate_bot`。 --- ## 一、首次安装:三个实例自动备份 + 试跑 整段复制到 SSH 终端执行(需 **root** 或对该目录有写权限): ```bash 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/${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.db`、`static_images.tar.gz`、`manifest.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` 改成目录名后整段执行: ```bash INSTANCE=crypto_monitor_binance cd "/opt/crypto_monitor/${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 点,立刻各备份一次: ```bash for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do echo ">>> ${dir}" bash "/opt/crypto_monitor/${dir}/scripts/backup_data.sh" done ls -la /root/backups/*/*/ ``` --- ## 四、检查定时任务与备份是否正常 ```bash 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 三个实例一次性备份到各自项目目录 ```bash 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/${dir}/.env" dst="/opt/crypto_monitor/${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/`(推荐) ```bash 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/${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 从项目目录内的备份恢复 把 `INSTANCE` 和 `DATE` 改成实际值(`DATE` 为备份当天的 `YYYYMMDD`): ```bash INSTANCE=crypto_monitor_binance DATE=20260517 cd "/opt/crypto_monitor/${INSTANCE}" cp -a ".env.backup.${DATE}" .env echo "restored .env from .env.backup.${DATE}" ``` ### 6.2 从 `/root/backups/env/` 恢复 ```bash INSTANCE=crypto_monitor_binance DATE=20260517 cp -a "/root/backups/env/${INSTANCE}.env.${DATE}" "/opt/crypto_monitor/${INSTANCE}/.env" echo "restored from /root/backups/env/${INSTANCE}.env.${DATE}" ``` 恢复后重启对应 PM2 进程,例如: ```bash pm2 restart crypto-monitor-binance pm2 restart crypto-monitor-gate pm2 restart crypto-monitor-gate-bot ``` (进程名以你 `pm2 list` 为准。) --- ## 七、数据库 + 复盘图片恢复 从自动备份目录恢复。先停服务再覆盖,避免 SQLite 写入冲突。 把 `INSTANCE`、`DATE`(文件夹名 `YYYY-MM-DD`)改成实际值: ```bash INSTANCE=crypto_monitor_binance DATE=2026-05-17 BK="/root/backups/${INSTANCE}/${DATE}" PROJ="/opt/crypto_monitor/${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 将 `INSTANCE`、`pm2` 名称改为对应实例即可。 --- ## 八、升级代码推荐顺序(含备份) ```bash 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/${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 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`(不会自动合并)。 --- ## 九、备份目录结构说明 ```text /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_ROOT`、`BACKUP_RETENTION_DAYS`、`BACKUP_INSTANCE`(见各目录 `.env.example` 注释)。 --- ## 十、卸载自动备份定时任务 仅删除三个实例的 backup 行(保留其它 cron): ```bash for dir in crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate_bot; do SCRIPT="/opt/crypto_monitor/${dir}/scripts/backup_data.sh" crontab -l 2>/dev/null | grep -vF "$SCRIPT" | crontab - done crontab -l ``` --- ## 十一、相关文档 | 文档 | 说明 | |------|------| | [README.md](./README.md) | 仓库总览 | | [crypto_monitor_binance/部署文档.md](./crypto_monitor_binance/部署文档.md) | Binance 部署与备份细节 | | [crypto_monitor_gate/部署文档.md](./crypto_monitor_gate/部署文档.md) | Gate 部署 | | [crypto_monitor_gate_bot/部署文档.md](./crypto_monitor_gate_bot/部署文档.md) | Gate Bot 部署 |