cosmo/backend/scripts/UPGRADE_GUIDE.md

178 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 生产环境数据库升级指南
## 概述
此升级脚本包含以下变更:
1.`celestial_bodies` 表增加 `short_name` 字段
2. 完整导入 `menus``role_menus`
3. 清空 `celestial_events` 表(将由定时任务重新生成)
4. 完整导入 `scheduled_jobs`
5. 导入/更新 `system_settings`
6. 保留 `user_follows` 表的现有数据
## 升级前准备
### 1. 备份数据库
```bash
# 在生产服务器上执行
pg_dump -U postgres -d cosmo_db > backup_$(date +%Y%m%d_%H%M%S).sql
```
### 2. 测试升级脚本(推荐)
```bash
# 在测试环境先运行
psql -U postgres -d cosmo_db_test < upgrade_production.sql
```
## 执行升级
### 方式1直接执行SQL文件
```bash
psql -U postgres -d cosmo_db < upgrade_production.sql
```
### 方式2通过Docker容器执行
```bash
docker cp upgrade_production.sql <container_name>:/tmp/
docker exec -it <container_name> psql -U postgres -d cosmo_db -f /tmp/upgrade_production.sql
```
### 方式3交互式执行推荐便于观察
```bash
psql -U postgres -d cosmo_db
\i upgrade_production.sql
```
## 升级后验证
脚本会自动输出验证信息,检查以下内容:
1. **celestial_bodies.short_name 字段**:应该存在
2. **menus 数量**:应该是 14 条
3. **role_menus 数量**:应该是 16 条
4. **scheduled_jobs 数量**:应该是 2 条
5. **system_settings 数量**:应该至少 3 条
### 手动验证命令
```sql
-- 检查 short_name 字段
\d celestial_bodies
-- 检查菜单数据
SELECT id, name, title, path FROM menus ORDER BY parent_id NULLS FIRST, sort_order;
-- 检查角色菜单关联
SELECT r.name as role, m.title as menu
FROM role_menus rm
JOIN roles r ON rm.role_id = r.id
JOIN menus m ON rm.menu_id = m.id
ORDER BY r.name, m.sort_order;
-- 检查定时任务
SELECT id, name, is_active, predefined_function FROM scheduled_jobs;
-- 检查系统设置
SELECT key, value, value_type FROM system_settings;
```
## 升级详情
### 1. celestial_bodies 表升级
- 增加 `short_name VARCHAR(50)` 字段
- 如果字段已存在,则跳过
### 2. menus 和 role_menus 导入
- **重要**:会清空现有菜单数据
- 导入 14 条菜单记录
- 导入 16 条角色-菜单关联记录
- 管理员可访问所有菜单
- 普通用户只能访问:个人资料、我的天体
### 3. celestial_events 清空
- 清空所有现有天体事件
- 数据会由定时任务 `calculate_planetary_events` 自动重新生成
### 4. scheduled_jobs 导入
导入2个定时任务
- **每日更新天体位置数据**(已禁用)
- Cron: `0 2 * * *`每天凌晨2点
- 可通过后台管理界面手动执行
- **获取主要天体事件**(已启用)
- Cron: `0 3 1 * *`每月1日凌晨3点
- 自动计算未来一年的天文事件
### 5. system_settings 导入
导入3个系统设置
- `view_mode`: solar默认视图模式
- `nasa_api_timeout`: 120NASA API超时时间
- `auto_download_positions`: False自动下载位置数据开关
使用 `ON CONFLICT` 策略,如果键已存在则更新值。
### 6. user_follows 保留
- **不会修改此表**
- 保留所有用户关注数据
## 回滚方案
如果升级失败,使用备份恢复:
```bash
# 方式1完整恢复
psql -U postgres -d cosmo_db < backup_YYYYMMDD_HHMMSS.sql
# 方式2选择性回滚
# 如果只是某些表有问题,可以只恢复特定表
pg_restore -U postgres -d cosmo_db -t menus -t role_menus backup.dump
```
## 注意事项
1. **事务安全**:整个脚本在一个事务中执行,失败会自动回滚
2. **外键约束**menus 表有自引用外键,脚本已处理
3. **数据清空**menus、role_menus、celestial_events、scheduled_jobs 会被清空
4. **用户数据**user_follows 不会被修改
5. **定时任务**:位置数据下载任务默认禁用,需要手动执行或启用
## 升级后操作
1. **重启应用服务**
```bash
# 重启后端服务
systemctl restart cosmo-backend
# 或 docker restart cosmo-backend
```
2. **手动执行位置数据下载**(如需要)
- 登录后台管理系统
- 进入"定时任务设置"
- 找到"每日更新天体位置数据"
- 点击"立即执行"
3. **验证前端功能**
- 登录系统
- 检查菜单是否正确显示
- 测试个人资料页面
- 测试我的天体页面
## 常见问题
### Q: 升级过程中断怎么办?
A: 由于使用了事务,中断会自动回滚。使用备份重新开始。
### Q: 如何只导入某个表?
A: 从脚本中复制对应表的部分,单独执行。
### Q: 线上已有自定义菜单怎么办?
A: 脚本会清空菜单,请在升级前导出自定义菜单,升级后手动添加。
### Q: 定时任务什么时候开始执行?
A: 天体事件任务会在下个月1日凌晨3点执行。位置数据任务需手动启用或执行。
## 联系支持
如遇问题,请检查:
1. 数据库日志
2. 应用程序日志
3. 脚本执行输出