Files
windyboy 25cc967bd2 feat(acm2-76): 联调栈数据库自动初始化——基础数据/字典/信箱报文/历史索引
- postgres-init:02 建 basicdata schema 与 25 张基础数据表(表列对齐
  admin-api secondary 实体注解),03 灌双流 T2 种子(fims_* 待 Q25 不造数);
  独立 schema 避免 public 非空导致 Flyway 首次 migrate 失败
- admin-mysql-init:原样引入 admin-api 仓库 adminapi_* 建表与字典/UI 种子,
  v0.0.2 补 FLIGHT_TASK/FLIGHT_TYPE 条目;compose 强制 utf8mb4 并设 LANG,
  防 initdb 客户端落 latin1 造成中文双重编码
- es-init 一次性服务:按 admin-api mapping 建 flight_hts2(别名 flight_hts),
  副本置 0 保持单节点 green
- dev/mysql-init:CMINMSGS 5 条样例报文(SCHD/FLOP×2/REGN/ARPT),
  REGN/ARPT 标注现状预期(SKIPPED / DEAD(EXHAUSTED))
- seed-flight.sql:Flyway 建表后手动执行,8 条航班 6 场景 + 资源明细
- admin-api.yml secondary 加 currentSchema=basicdata,public
- README:初始化/种子/重建卷/验收边界说明

已用 podman compose 重建数据卷全链实测;ACM2-76 有评审与验收全记录。
2026-09-19 11:09:58 +08:00

124 lines
8.4 KiB
Markdown
Raw Permalink 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.
# 双项目 PostgreSQL 联调环境
## 范围
`compose.integration.yaml` 是独立的依赖栈,不与根目录 `compose.yaml` 合并使用;两个应用单独运行,可与中间件分机部署。
沿用开发栈的 PostgreSQL、信箱 MySQL、Valkey、Kafka 镜像,增加 admin-api 独立 MySQL 和匹配其 TransportClient 的 Elasticsearch。
所有发布端口监听全部网卡,凭据仅供测试;防火墙只放行测试客户端,禁止直接暴露公网。
| 服务 | 用途 |
| --- | --- |
| postgres | msgexchange-v2 自有业务数据库;admin-api 使用只读账号;基础数据表见 `basicdata` schema |
| mysql | 本地共享信箱模拟,复用 `deploy/dev/mysql-init`,不修改外部邮箱结构 |
| admin-mysql | admin-api Primary 数据源,首启自动建 `adminapi_*` 表与字典/UI 种子,不与共享信箱混用 |
| redis | 保留开发栈的 Valkey 服务,不改变当前应用的数据归属 |
| kafka | INTERNAL 用于容器健康检查,EXTERNAL 通告服务器地址 |
| elasticsearch | admin-api 历史查询依赖;es-init 预建空索引 `flight_hts`,写入待 US-14 交付 |
端口和测试凭据在 `compose.integration.yaml`,应用对应值在本目录配置文件。
Elasticsearch 旧版本仅用于兼容验证,Apple Silicon 需要 amd64 模拟支持;镜像配置参考 [Elastic Docker 文档](https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docker.html)。
## 在中间件服务器启动
将仓库复制到服务器,在仓库根目录执行;`TEST_SERVER_HOST` 必须是应用机器能访问的服务器 IP 或域名,不能填写 `0.0.0.0`
```sh
export TEST_SERVER_HOST=你的服务器IP
docker compose -f compose.integration.yaml config --quiet
docker compose -f compose.integration.yaml up -d
docker compose -f compose.integration.yaml ps
```
该命令创建独立项目的容器、网络和数据卷,不启动两个 Java 应用。
首次初始化时创建 PG 只读用户,为随后由 `msgx_dev` 创建的 public 表和视图授予 SELECT`02` 脚本另建测试 schema `basicdata` 并授予同权限。均不授予写入权限。
初始化脚本只对空数据卷执行,已有卷不会自动补执行或修改密码。
SELinux 环境下,初始化目录挂载通过 `Z` 设置容器专用标签;与开发栈共用的信箱目录使用 `z` 共享标签,保持只读挂载。
## 测试数据库初始化与种子数据
计划与评审记录见 Plane `ACM2-76``basicdata` 是 admin-api 联调的基础数据承载,表列对齐其实体注解,不预设 `REF_MASTER` 物理形态。
**随首次初始化自动执行**(空卷时):
- `postgres-init/02-basicdata-schema.sql`:建 schema `basicdata` 与 25 张基础数据表;表与列取自 admin-api `domain/secondary/entity``@Table`/`@Column` 注解(`C-10`)。独立 schema 而非 `public`,否则首次 Flyway migrate 因 public 非空且无 history 表失败。
- `postgres-init/03-basicdata-seed.sql``basicdata` 的双流 T2 语境种子,编码与信箱报文一致;季度计划表不造数(`Q25`)。
- `../dev/mysql-init/02-mailbox-messages.sql`:向共享信箱 `cdairport.CMINMSGS` 插 5 条样例报文(SCHD/FLOP×2/REGN/ARPT)。该目录与开发栈共用,dev 侧已有卷同样不会自动补种。
- `admin-mysql-init/v0.0.1.20190110_adminapi_ddl.sql``..._initdata.sql`:原样执行 admin-api 仓库迁移脚本,建 4 张 `adminapi_*` 表并灌字典分组/条目(含 `ROUTE_TYPE`)与 UI 默认设置,覆盖 `/dictionary/*``/settings/*`
- `admin-mysql-init/v0.0.2_adminapi_dict_extra.sql`:自造字典补充种子,补齐 `FLIGHT_TYPE`(对齐 `sys_flight_type` 的 S/N/C/F)与 `FLIGHT_TASK` 四条;服务端以 compose 强制 utf8mb4、容器设 `LANG=C.UTF-8` 防 initdb 客户端落 latin1 造成中文双重编码。
- `es-init`(compose 一次性服务):按 admin-api 仓库的 `v1.2.0_20190428_flightHstMapping.json` 建索引 `flight_hts2`(别名 `flight_hts`)并把副本置 0(单节点保持 green);索引为空,写入待 US-14,已存在则跳过。
**应用首启后手动执行**(Flyway 建完 16 张业务表之后):
```sh
psql -h 127.0.0.1 -p 15432 -U msgx_dev -d msgx -f deploy/integration/seed-flight.sql
```
`seed-flight.sql` 在事务内写入 6 个场景共 8 条航班(进港/离港/主共享对/延误/取消/过站)及资源明细,可重复执行。
**重建数据卷**(破坏性操作,仅限测试环境;初始化与种子脚本只在空卷时生效):
```sh
docker compose -f compose.integration.yaml down
docker volume rm msgx-integration_pg_data # 基础数据表与种子需重建 PG 卷
docker volume rm msgx-integration_mysql_data # 信箱报文种子另需重建 MySQL 卷
docker volume rm msgx-integration_admin_mysql_data # 字典/UI 种子另需重建 admin MySQL 卷
docker volume rm msgx-integration_es_data # flight_hts 索引另需重建 ES 卷
docker compose -f compose.integration.yaml up -d
```
开发栈要补信箱报文,同样删除其 mysql 卷后重启(卷名见 `compose.yaml`)。
本文 `docker compose` 命令对 `podman compose` 同样适用;podman 需先启动用户级 API socket`systemctl --user start podman.socket`)。
**预期行为**(现状口径,US-13 落地后需更新):应用消费信箱后,SCHD/FLOP 落 `FLIGHT_SCHD` 与明细;REGN 命中忽略清单 `SKIPPED` 并回填;ARPT 按合法但不支持处理,`FAILED(UNSUPPORTED)` 退避约 15 秒后 `DEAD(EXHAUSTED)` 再回填。admin-api 读 `basicdata``REF_MASTER` 读取契约待 `Q22`/`C-10` 定稿(参考数据的 SIS 落库本身也是 `G-REF-DATA` 缺口)。
## 运行 msgexchange-v2
在应用机器的仓库根目录,用项目要求的 JDK 执行:
```sh
export TEST_SERVER_HOST=你的服务器IP
source deploy/integration/msgexchange.env.sh
./gradlew run
```
此配置关闭内存 stub,启用真实 PG、信箱和 Flyway;只能指向本测试栈。
Flyway 只迁移自有 PG,不为 admin-api 创建业务表,也不迁移共享 MySQL。
## 运行 admin-api
前置条件:使用 Java 8admin-api 可执行 JAR 必须包含兼容该运行时的 `org.postgresql:postgresql` 驱动,单改 YAML 无法替代驱动依赖。
在 msgexchange-v2 仓库根目录执行,确保 `$PWD` 指向本仓库而非 admin-api;以下使用测试服务器上的 JAR 路径,其他机器按实际位置替换:
```sh
export TEST_SERVER_HOST=你的服务器IP
java -jar /home/fengzhiqiang/project/airport/chengdu/admin-api/target/admin-api-1.2.1-SNAPSHOT.jar \
--spring.profiles.active=localtest \
--spring.config.location="file:$PWD/deploy/integration/admin-api.yml" \
--logging.config="file:$PWD/deploy/integration/logback.xml"
```
独立 profile 避免加载内置 dev/test/pro 地址,关闭 Eureka 和自动建表,日志只输出控制台。
两个 JPA 数据源不能全局强设 PG 方言;启动日志需确认 Primary 为 MySQL、Secondary 为 PostgreSQL。
Secondary URL 带 `currentSchema=basicdata,public``/basicdata/*` 解析到 `basicdata` 的基础数据表。
sys-api 不在本栈,依赖它的操作日志开关接口不可用,不以假响应掩盖缺失依赖。
## 数据准备与验收边界
本栈提供数据库连接环境,不等于完整业务联调环境。首启已自动覆盖:字典与 UI 设置(admin-mysql 种子)、历史索引 `flight_hts`(空,返回空列表而非 500)、基础数据表与种子(`basicdata`)。
剩余边界:季度计划 `fims_*` 只建空表不造数(供数方待 `Q25`),查询返回空;历史数据写入待 US-14 交付。
`basicdata` 只对齐 admin-api `domain/secondary/entity` 的表列,不预设 `REF_MASTER` 物理形态(`Q22` 未定稿)。
`G-REF-DATA` 标记的静态数据处理缺口不由 Compose 解决。
验收顺序:服务健康 → 应用驱动和方言 → 确认的表结构及数据 → 基础数据查询 → 季度计划日期与经停关联 → 接口返回对比。
PG 只读账号可以查询 public 内部表与 `basicdata` 测试表(权限范围,不代表 admin-api 已接入 `REF_MASTER`;见上一节)。
## 停止与排查
```sh
docker compose -f compose.integration.yaml logs --tail=100
docker compose -f compose.integration.yaml down
```
停止命令保留数据卷;不要追加 `-v`,该选项会删除测试数据。
Elasticsearch 启动失败先检查镜像架构、内存及日志中的内核限制提示,不自动修改服务器内核参数。