Add PostgreSQL production backend to eliminate SQLite lock contention.

Support DATABASE_URL with connection pooling, pg_dump backups, SQLite migration script, and deploy_postgres.sh with docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-01 08:11:42 +08:00
parent 39eac983ff
commit 52aca456e9
23 changed files with 1208 additions and 150 deletions
+44 -18
View File
@@ -1,6 +1,15 @@
# 数据备份与恢复
qihuo 支持自动备份 SQLite 数据库与复盘附件,生成可在其他 Linux 服务器恢复的压缩包。
qihuo 支持自动备份数据库与复盘附件,生成可在其他 Linux 服务器恢复的压缩包。
存储后端由 `.env` 决定:
| 后端 | 备份包内主文件 | 说明 |
|------|----------------|------|
| SQLite(默认) | `futures.db` | 本地单文件库 |
| PostgreSQL | `postgres_dump.sql` | `pg_dump` 逻辑备份 |
PostgreSQL 部署与迁移见 **[POSTGRES.md](./POSTGRES.md)**。
---
@@ -8,13 +17,14 @@ qihuo 支持自动备份 SQLite 数据库与复盘附件,生成可在其他 Li
| 内容 | 说明 |
|------|------|
| `futures.db` | 主库:账号、交易记录、设置、统计缓存等 |
| `futures.db` | SQLite 主库(仅 SQLite 模式) |
| `postgres_dump.sql` | PostgreSQL 逻辑备份(仅 PostgreSQL 模式) |
| `uploads/` | 复盘截图、自动 K 线图(若存在) |
| `manifest.json` | 备份时间文件清单 |
| `manifest.json` | 备份时间、**backend** 字段、文件清单 |
| `RESTORE.md` | 包内恢复说明 |
| `restore.sh` | 一键恢复脚本 |
**不包含** `.env`(含 CTP 密码等敏感信息),请单独安全保管或在新服务器重新配置。
**不包含** `.env`(含 CTP 密码`DATABASE_URL` 等),请单独安全保管或在新服务器重新配置。
---
@@ -40,6 +50,8 @@ QIHUO_BACKUP_DIR=/data/qihuo_backup
- **保留份数**:默认保留最近 **30** 份,超出自动删除最旧文件
- **下载**:列表中点击「下载」获取压缩包
PostgreSQL 模式下需服务器已安装 `pg_dump``apt install postgresql-client` 或完整 `postgresql` 包)。
---
## 在新服务器恢复
@@ -55,6 +67,13 @@ cd /root
tar -xzf qihuo_backup_20260626_030015.tar.gz
cd qihuo_backup_20260626_030015
chmod +x restore.sh
# SQLite:直接恢复 futures.db
RESTORE_DIR=/opt/qihuo ./restore.sh
# PostgreSQL:先配置 /opt/qihuo/.env 的 DATABASE_URL,再执行
export RESTORE_DIR=/opt/qihuo
# 若 .env 在 RESTORE_DIR 下且含 DATABASE_URLrestore.sh 会自动 source
./restore.sh
```
@@ -64,28 +83,32 @@ chmod +x restore.sh
RESTORE_DIR=/opt/qihuo ./restore.sh
```
也可通过环境变量固定默认恢复目录:
```bash
QIHUO_RESTORE_DIR=/opt/qihuo
```
### 方式二:手工复制
### 方式二:手工复制(SQLite)
```bash
tar -xzf qihuo_backup_20260626_030015.tar.gz
cd qihuo_backup_20260626_030015
pm2 stop qihuo # 或停止当前进程
pm2 stop qihuo
cp futures.db /opt/qihuo/futures.db
cp -a uploads/. /opt/qihuo/uploads/ # 若有 uploads
cp -a uploads/. /opt/qihuo/uploads/
pm2 restart qihuo
```
### 方式三:手工导入(PostgreSQL
```bash
pm2 stop qihuo
export DATABASE_URL=postgresql://qihuo:密码@127.0.0.1:5432/qihuo
psql "$DATABASE_URL" -f postgres_dump.sql
cp -a uploads/. /opt/qihuo/uploads/
pm2 restart qihuo
```
### 恢复后检查清单
1. 已部署 qihuo 代码与 Python 虚拟环境(见 [DEPLOY.md](./DEPLOY.md)
2. 已配置 `.env``SECRET_KEY`、CTP 账号等)
3. 数据库文件权限正确(运行用户可读写的 `futures.db`
2. 已配置 `.env``DATABASE_URL` 或 SQLite、`SECRET_KEY`、CTP 账号等)
3. PostgreSQL:库已创建且 `DATABASE_URL` 可连接
4. 访问 Web 登录,检查交易记录、统计页是否正常
5. CTP 模式需在新环境重新连接柜台
@@ -94,8 +117,9 @@ pm2 restart qihuo
## 注意事项
- **恢复前务必停止 qihuo**,避免进程占用数据库导致覆盖不完整
- 备份使用 SQLite `backup` API,并在 WAL 模式下尝试 checkpoint,降低锁冲突风险
- 自动备份在应用后台线程执行,与 Web 服务同进程;PM2 重启不影响已生成的历史压缩包
- SQLite 备份使用 SQLite `backup` API,并在 WAL 模式下尝试 checkpoint
- PostgreSQL 备份使用 `pg_dump`,恢复使用 `psql -f`
- 自动备份在应用后台线程执行,与 Web 服务同进程
- 大体积 `uploads/` 会使压缩包变大,可按需定期清理无用截图
- 不要将含 `.env`、数据库的压缩包上传到公开网盘
@@ -107,13 +131,15 @@ pm2 restart qihuo
|------|------|
| 设置页无备份列表 | 检查 `/root/qihuo_backup` 目录权限,进程需可写 |
| 立即备份无反应 | 查看 PM2 日志;可能上一任务仍在进行 |
| PostgreSQL 备份失败 | 安装 `postgresql-client`;检查 `DATABASE_URL` |
| 下载 404 | 文件名须为系统生成的 `qihuo_backup_*.tar.gz` |
| 恢复后无法登录 | 确认 `futures.db` 已覆盖到实际运行目录 |
| 恢复后无法登录 | 确认数据已导入实际使用的库(SQLite 文件或 PG) |
| 恢复后 CTP 连不上 | 在新服务器配置正确的 `.env` CTP 参数 |
---
## 相关文档
- [POSTGRES.md](./POSTGRES.md) — PostgreSQL 一键部署、迁移、备份恢复
- [DEPLOY.md](./DEPLOY.md) — 部署与目录结构
- [FEATURES.md](./FEATURES.md) — 功能与路由一览