8fbf44472d
CI / backend-test (push) Successful in 7m22s
- GET/POST /api/v1/pets、GET/PATCH /api/v1/pets/{petId}、GET /api/v1/breeds
(species 过滤);创建者自动写入 pet_owners primary owner(同事务)
- PetAccessService 统一权限闸口(READ/WRITE/MANAGE 三档 × owner/caregiver/
viewer 三角色,ADR-015):无关系一律 404/40401 防枚举,可见越权 403/40300;
每请求实时查库无缓存,撤销关系即时生效;T2-04~07 复用同一入口
- PATCH version 乐观锁(40902);部分更新语义;status 白名单排除 deleted,
软删除不可经 PATCH 绕过 ck_pets_deleted
- ck_pets_breed 互斥 + 字典品种存在/物种匹配应用层先行校验(40000);
芯片号唯一冲突新错误码 40903 MICROCHIP_EXISTS
- pet 模块接入 RS256 bearer 鉴权(与 user 同一公钥约定),compose 挂载公钥
- 测试基建:test classpath 引入 patbond-user + Flyway,Testcontainers 上跑
完整 V1..V4 迁移链;三角色以测试数据直写 pet_owners 构造(T2-10)
- 集成测试覆盖六类路径 23 例;全套 118 测试全绿(基线 95)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
87 lines
3.6 KiB
YAML
87 lines
3.6 KiB
YAML
# Patbond MVP 编排(ADR-007):应用容器无状态,PostgreSQL 数据落 volume。
|
||
# 使用步骤见 Readme.md「Docker Compose」一节:
|
||
# 1) ./deploy/init-secrets.sh 生成 RS256 密钥对与 .env(均不入库)
|
||
# 2) JAVA_HOME=... ./mvnw -DskipTests package
|
||
# 3) docker compose up -d --build
|
||
#
|
||
# 配置来源:容器内挂载各服务的 application.yml.sample 作为配置文件,
|
||
# 其中的 ${PATBOND_*} 占位由下方 environment 注入 —— 与本机运行同一套约定。
|
||
name: patbond
|
||
|
||
services:
|
||
postgres:
|
||
image: postgres:18
|
||
environment:
|
||
POSTGRES_DB: ${PATBOND_DB_NAME:-patbond}
|
||
POSTGRES_USER: ${PATBOND_DB_USER:-patbond}
|
||
POSTGRES_PASSWORD: ${PATBOND_DB_PASSWORD:?先运行 deploy/init-secrets.sh 生成 .env}
|
||
volumes:
|
||
# postgres:18 官方镜像的挂载点是 /var/lib/postgresql(含版本子目录)
|
||
- pgdata:/var/lib/postgresql
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${PATBOND_DB_USER:-patbond} -d ${PATBOND_DB_NAME:-patbond}"]
|
||
interval: 2s
|
||
timeout: 3s
|
||
retries: 30
|
||
# 数据库不对宿主机发布端口;调试需要时可临时加 ports: ["15432:5432"]
|
||
|
||
user:
|
||
build: ./patbond-user
|
||
environment:
|
||
SPRING_CONFIG_LOCATION: file:/config/application.yml
|
||
PATBOND_DB_URL: jdbc:postgresql://postgres:5432/${PATBOND_DB_NAME:-patbond}
|
||
PATBOND_DB_USER: ${PATBOND_DB_USER:-patbond}
|
||
PATBOND_DB_PASSWORD: ${PATBOND_DB_PASSWORD:?先运行 deploy/init-secrets.sh 生成 .env}
|
||
PATBOND_INTERNAL_TOKEN: ${PATBOND_INTERNAL_TOKEN:?先运行 deploy/init-secrets.sh 生成 .env}
|
||
PATBOND_JWT_PUBLIC_KEY: /run/patbond/keys/jwt-public.pem
|
||
volumes:
|
||
- ./patbond-user/src/main/resources/application.yml.sample:/config/application.yml:ro
|
||
- ./deploy/keys:/run/patbond/keys:ro
|
||
# MVP 直连暴露 8082 供客户端访问 /api/v1/me;/internal/** 已有服务间鉴权,
|
||
# 规模化阶段应由网关统一入口并停止直接暴露本端口。
|
||
ports:
|
||
- "${PATBOND_USER_PORT:-8082}:8082"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
|
||
auth:
|
||
build: ./patbond-auth
|
||
environment:
|
||
SPRING_CONFIG_LOCATION: file:/config/application.yml
|
||
PATBOND_USER_SERVICE_URL: http://user:8082
|
||
PATBOND_INTERNAL_TOKEN: ${PATBOND_INTERNAL_TOKEN:?先运行 deploy/init-secrets.sh 生成 .env}
|
||
PATBOND_JWT_PRIVATE_KEY: /run/patbond/keys/jwt-private.pem
|
||
volumes:
|
||
- ./patbond-auth/src/main/resources/application.yml.sample:/config/application.yml:ro
|
||
- ./deploy/keys:/run/patbond/keys:ro
|
||
ports:
|
||
- "${PATBOND_AUTH_PORT:-8081}:8081"
|
||
depends_on:
|
||
- user
|
||
|
||
# M2(ADR-009):宠物健康档案服务。第二波起提供 /api/v1/pets、/api/v1/breeds
|
||
# 业务端点(RS256 校验,与 user 同一公钥)。与 user 共库;Flyway 迁移链由
|
||
# user 服务统一执行,故依赖 user 先起,保证 pet_health schema 已就绪。
|
||
pet:
|
||
build: ./patbond-pet
|
||
environment:
|
||
SPRING_CONFIG_LOCATION: file:/config/application.yml
|
||
PATBOND_DB_URL: jdbc:postgresql://postgres:5432/${PATBOND_DB_NAME:-patbond}
|
||
PATBOND_DB_USER: ${PATBOND_DB_USER:-patbond}
|
||
PATBOND_DB_PASSWORD: ${PATBOND_DB_PASSWORD:?先运行 deploy/init-secrets.sh 生成 .env}
|
||
PATBOND_JWT_PUBLIC_KEY: /run/patbond/keys/jwt-public.pem
|
||
volumes:
|
||
- ./patbond-pet/src/main/resources/application.yml.sample:/config/application.yml:ro
|
||
- ./deploy/keys:/run/patbond/keys:ro
|
||
ports:
|
||
- "${PATBOND_PET_PORT:-8083}:8083"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
user:
|
||
condition: service_started
|
||
|
||
volumes:
|
||
pgdata:
|