Files
insar-management-system-v2/docs/DEPLOYMENT.md
T

307 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署与运行说明
本文档描述当前有效的部署模型,不再沿用旧版“ENVI 单核 + 结果扫描目录”叙述。
## 1. 当前部署模型
当前项目默认部署在 Windows 主机上,核心组件如下:
- Web 后端:FastAPI
- 后台执行:独立 Worker
- 数据库:PostgreSQL + PostGIS
- 前端:React,通常由 Nginx 或 Vite Dev Server 提供
- D-InSAR 引擎:
- `sarscape`,运行在 Windows + IDL/ENVI
- `isce2`,运行在 WSL2 共享运行时
- 时序 InSAR
- 当前前端名称为“时序 InSAR”
- 当前默认接入为 SBAS 流程
- Gamma / PyINT
- 运行时接口已预留
- Gamma 本体采用固定安装目录,Python 胶水共享 WSL 环境
## 2. 结果目录
当前结果目录已经收口到统一发布根目录。
推荐配置:
```env
RESULT_PUBLISH_ROOT=D:\production_results
DINSAR_PRODUCT_DIR=D:\production_results\dinsar
TIMESERIES_PRODUCT_DIR=D:\production_results\timeseries
RESULT_QUARANTINE_ROOT=D:\production_results\_quarantine
```
当前目录语义:
- `RESULT_PUBLISH_ROOT`
统一结果发布根目录。
- `DINSAR_PRODUCT_DIR`
D-InSAR 产物发布根目录。
- `TIMESERIES_PRODUCT_DIR`
时序 InSAR 产物发布根目录。
- `RESULT_QUARANTINE_ROOT`
异常产物、待人工处理产物的隔离目录。
典型结构示意:
```text
D:\production_results
├─ dinsar
│ └─ <product_key>
│ └─ runs
│ └─ run_<timestamp>_<engine>_<profile>_<seq>_<suffix>
├─ timeseries
│ └─ <stack_key>
│ └─ runs
│ └─ run_<timestamp>_<engine>_<profile>_<seq>_<suffix>
└─ _quarantine
```
说明:
- 历史上的 `backend\result_products` 文件夹不再作为当前文件系统事实来源。
- 数据库中的 `result_products` 表仍然保留,是 catalog 的核心登记表,不要把表名和旧目录混淆。
## 3. 当前推荐环境变量分组
最小必配项见根目录 [`.env.example`](../.env.example)。
### 3.1 数据库与认证
```env
DATABASE_URL=postgresql+asyncpg://postgres:password@localhost:5432/insar_management
INIT_ADMIN_USERNAME=admin
INIT_ADMIN_PASSWORD=change_me
DB_SCHEMA_RESET_ON_MISMATCH=false
DB_SCHEMA_RESET_CONFIRM=false
```
### 3.2 服务启动
```env
PORT=18000
BACKEND_BIND_HOST=127.0.0.1
PYTHON_PATH=C:\ProgramData\anaconda3\envs\InSAR\python.exe
NGINX_PATH=C:\nginx\nginx.exe
NGINX_HEALTH_URL=http://127.0.0.1/
```
### 3.3 源数据与轨道目录
```env
UNPACK_SOURCE_DIRS=D:\Archives
INSAR_STORAGE_DIRS=D:\LuTan1_Image_Pool
MONITOR_RADAR_DIRS=D:\LuTan1_Image_Pool
MONITOR_DINSAR_DIRS=D:\DInSARResult
MONITOR_ORBIT_DIR=D:\LT1_data_lsarorbit
ORBIT_POOL_ENVI=D:\orbit_pools\envi
ORBIT_POOL_ISCE2=D:\orbit_pools\isce2
ORBIT_POOL_LANDSAR=
```
### 3.4 ENVI / SARscape
```env
IDL_EXECUTABLE=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idl.exe
IDL_WORKBENCH_PATH=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idlde.exe
IDL_DINSAR_DEM_BASE_FILE=D:\SRTM30m\SRTMDEM_RSP_SARscape
IDL_WORKER_RUNTIME_DIR=D:\Code\Insar_management_system_v2\backend\runtime\idl_worker
ENVI_TASK_TIMEOUT_SECONDS=21600
```
### 3.5 WSL 共享运行时
当前推荐采用“一套共享 distro + 一套共享 conda 环境”模式。
```env
WSL_DISTRO=Ubuntu-24.04
WSL_SHARED_CONDA_ENV=insar_wsl_v1
WSL_SHARED_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
WSL_BROKER_JOB_ROOT=D:\Code\Insar_management_system_v2\backend\runtime\wsl_jobs
ISCE2_RUNTIME_ID=isce2_runtime_v1
PYINT_RUNTIME_ID=gamma_pyint_runtime_v1
```
当前 registry 内的运行时定义:
- `isce2_runtime_v1`
使用共享 pythonrunner 为 `deploy/wsl/runners/isce2_runner.py`
- `gamma_pyint_runtime_v1`
使用共享 pythonrunner 为 `deploy/wsl/runners/gamma_pyint_runner.py`
Gamma 固定环境脚本为 `deploy/wsl/profiles/gamma_env.sh`
### 3.6 ISCE2 / 时序 InSAR
```env
ISCE2_ENABLED=true
ISCE2_WSL_DISTRO=Ubuntu-24.04
ISCE2_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
TIMESERIES_ENABLED=true
TIMESERIES_ENV_NAME=insar_wsl_v1
TIMESERIES_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
```
说明:
- 目前现场共享运行时已经对齐到 `insar_wsl_v1`
- 当前时序入口默认接入 SBAS 工作流,因此时序链路仍然依赖 ISCE2 / MintPy 实验脚本集合。
### 3.7 Gamma / PyINT
```env
PYINT_ENABLED=true
PYINT_WSL_DISTRO=Ubuntu-24.04
PYINT_WSL_PYTHON=/home/administrator/miniconda3/envs/insar_wsl_v1/bin/python
PYINT_GAMMA_ENV_SCRIPT=D:\Code\Insar_management_system_v2\deploy\wsl\profiles\gamma_env.sh
```
说明:
- `PYINT_GAMMA_ENV_SCRIPT` 当前仍可配置,但新模型推荐以固定 profile 为准。
- Gamma 二进制不建议塞进 conda;应保持固定安装位置,再由 profile 注入 `PATH`
## 4. 启动顺序
推荐使用一键脚本:
```powershell
start_system.bat
```
若分开启动:
```powershell
python run_backend.py
python run_worker.py
```
说明:
- Worker 不启动,生产任务、扫描任务、解包任务都不会真正执行。
- 当前系统默认 manual-only 扫描模式,不会自动开启周期调度。
## 5. 启动时自维护链路
后端 `lifespan` 会执行以下步骤:
1. `ensure_database_ready(...)`
2. `database.init_db()`
3. `root_registry_service.sync_from_settings()`
4. `manifest_inventory_service.sync_manifest_roots()`
5. `result_catalog_service.bootstrap_catalog_on_startup_clean()`
6. `psinsar_catalog_service.bootstrap_catalog_on_startup_clean()`
7. `pairing_state_service.bootstrap_pairing_cache_state()`
8. `get_health_status(include_external=False)`
这套链路要求:
- `.env` 中的根目录配置要真实可访问。
- `backend/migrations/001``006` 必须保持幂等。
- 启动自维护默认是保守模式,不会在 schema 不匹配时自动破坏性重建。
## 6. 数据库自维护边界
当前实现位于 `backend/app/db_maintenance.py`,能力边界如下:
- 支持:
- 自动创建 `postgis` 扩展
- 自动创建缺失表
- 自动补齐缺失列
- 自动执行 `001``006` 号 SQL 文件
- 自动引导管理员账号与灾害点初始化
- 不支持:
- 列改名
- 列类型调整
- 可空性收紧
- 索引 / 约束漂移修复
- 删除旧字段或旧表
如需破坏性重建,必须同时显式开启:
```env
DB_SCHEMA_RESET_ON_MISMATCH=true
DB_SCHEMA_RESET_CONFIRM=true
```
生产环境不建议开启。
## 7. 运维自检应看到什么
当前健康检查不仅检查数据库,还会检查系统是否与当前设计一致。
关键项目包括:
- `database`
- `dinsar_result_catalog`
- `timeseries_result_catalog`
- `dinsar_bridge`
- `source_roots`
- `product_packages`
- `wsl_runtime`
- `pairing_system`
其中:
- `product_packages`
用于核查 `result_products` 是否全部具备 canonical package manifest、发布目录、运行时信息。
- `wsl_runtime`
用于核查共享 distro、共享 conda 环境、runner 文件、Gamma profile 是否齐全。
## 8. 解包限流
LT1 解包已经从全局页面锁中剥离,并支持单次任务限流。
当前建议配置:
```env
UNPACK_MAX_FILES_PER_RUN=100
UNPACK_MAX_RUNTIME_MINUTES=360
```
含义:
- 每次解包任务最多处理 100 个压缩包
- 单次解包任务最长运行 6 小时
前端会基于这两个默认值预填单次任务参数弹窗。
## 9. 地图底图服务
地图底图切片不是由本项目直接提供,通常依赖外部 tile server。
当前接入方式:
```env
VITE_TILE_SERVER_URL=http://127.0.0.1:8910
VITE_TILE_SERVER_TOKEN=change_me
```
现场如果使用 `D:\Code\tile-server`,需要确保该项目处于运行状态,否则前端会出现底图切片请求失败。
## 10. 当前推荐校验动作
部署或改动后,至少检查以下三项:
1. 打开前端并确认地图、生产管理和运维自检可正常进入。
2. 访问 `GET /api/health`,确认 database / catalog / product_packages / wsl_runtime 为 `ok`
3. 触发一次实际生产任务,确认结果能发布到 `DINSAR_PRODUCT_DIR``TIMESERIES_PRODUCT_DIR`,并被 catalog 收录。
## 11. 相关文档
- [../README.md](../README.md)
- [CURRENT_STATUS_20260425.md](CURRENT_STATUS_20260425.md)
- [DATABASE_SELF_MAINTENANCE_AUDIT_20260425.md](DATABASE_SELF_MAINTENANCE_AUDIT_20260425.md)
- [PRODUCTION_RESULTS_MULTI_ENGINE_DESIGN_20260423.md](PRODUCTION_RESULTS_MULTI_ENGINE_DESIGN_20260423.md)
- [WSL_RUNTIME_REFACTOR_DESIGN_20260422.md](WSL_RUNTIME_REFACTOR_DESIGN_20260422.md)