feat: migrate runtime to postgresql
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# PostgreSQL 切换与 SQLite 历史数据迁移
|
||||
|
||||
这份说明对应当前主线版本:应用正式运行数据库已经切换为 PostgreSQL,SQLite 仅用于一次性历史数据导入。
|
||||
|
||||
## 1. 迁移前准备
|
||||
|
||||
1. 备份旧的 SQLite 文件和 `records/` 目录。
|
||||
2. 停止当前 API 写入流量,避免迁移过程中旧库继续变化。
|
||||
3. 准备好新的 PostgreSQL 容器:
|
||||
|
||||
```bash
|
||||
docker compose up -d postgres
|
||||
```
|
||||
|
||||
4. 确认 PostgreSQL 已就绪:
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
## 2. 运行一次性迁移
|
||||
|
||||
迁移命令会:
|
||||
|
||||
- 对 PostgreSQL 执行 EF Core migrations
|
||||
- 检查目标库必须为空
|
||||
- 只读打开旧 SQLite
|
||||
- 按既定顺序导入所有业务数据
|
||||
|
||||
Docker Compose 部署建议直接这样跑:
|
||||
|
||||
```bash
|
||||
docker compose run --rm api --migrate-sqlite /app/data/live-recorder.db
|
||||
```
|
||||
|
||||
如果你是在宿主机本地直接运行 .NET,则可以使用:
|
||||
|
||||
```bash
|
||||
dotnet run --project src/LiveRecorder.WebApi -- --migrate-sqlite /app/data/live-recorder.db
|
||||
```
|
||||
|
||||
Windows 本地示例:
|
||||
|
||||
```powershell
|
||||
dotnet run --project src\LiveRecorder.WebApi -- --migrate-sqlite "C:\path\to\live-recorder.db"
|
||||
```
|
||||
|
||||
迁移完成后,控制台会输出每张表的 `source -> target` 行数校验结果。
|
||||
|
||||
## 3. 正式切流
|
||||
|
||||
1. 启动完整服务:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
2. 验证这些接口和流程:
|
||||
- 登录
|
||||
- `/api/live-rooms`
|
||||
- `/api/record-sessions`
|
||||
- `/api/logs`
|
||||
- 自动开录
|
||||
- 系统日志持续写入
|
||||
|
||||
## 4. Docker 默认环境变量
|
||||
|
||||
当前 `docker-compose.yml` 默认使用:
|
||||
|
||||
- `POSTGRES_DB=live_recorder`
|
||||
- `POSTGRES_USER=live_recorder`
|
||||
- `POSTGRES_PASSWORD=change_me`
|
||||
|
||||
正式部署前请至少覆盖 `POSTGRES_PASSWORD`。
|
||||
|
||||
## 5. 回滚方案
|
||||
|
||||
如果切换后需要回滚:
|
||||
|
||||
1. 停止新版本 API。
|
||||
2. 保留 PostgreSQL 数据卷,不做破坏性清理。
|
||||
3. 用迁移前备份的 SQLite 文件恢复旧版本应用。
|
||||
4. 检查 `records/` 目录没有被误覆盖后,再重新开放流量。
|
||||
|
||||
## 6. 注意事项
|
||||
|
||||
- 迁移命令默认拒绝导入到非空 PostgreSQL 数据库。
|
||||
- SQLite 不再作为正式运行主库,只保留历史迁移用途。
|
||||
- `/app/data` 目录在 Docker 方案里仍会挂载,主要用于迁移阶段存放旧 SQLite 备份。
|
||||
Reference in New Issue
Block a user