总览
| 类型 | 文件 / 来源 |
|---|---|
| 后端主服务 | apps/pf-service/config.json |
| 合成微服务 | apps/pf-compose-service/config.json |
| 人脸服务 | apps/pf-face-service/config.json(+ 环境变量覆盖) |
| ORM / 迁移 | apps/pf-service/drizzle.config.ts |
| 编辑器 / 用户端 | apps/pf-{editor,app}/quasar.config.ts(+ .env) |
| 管理后台 | apps/pf-manage/.env* + vite.config.ts |
| 开发网关 | tools/caddy/Caddyfile(PF_GATEWAY_PORT,默认 9800) |
| 部署 | deploy/docker-compose.yml · aliyun-nginx.conf · frpc.toml · 各 deploy/<svc>/config.json |
| 代码风格 | 根 oxlint.config.ts(oxfmt + oxlint) |
| 规范流程 | openspec/config.yaml |
pf-service 主配置
apps/pf-service/config.json(开发默认值):
1 | { |
关键点:
db.url是单条postgres://DSN(不再有 host/port/user 分字段,也没有dialect键——dialect 在 drizzle.config.ts)。composeService指向合成微服务;faceService.publicBaseUrl用于把相对图片路径补成绝对 MinIO 地址。s3.publicUrl = /storage决定预签名 URL 改写成同源代理前缀。server.jobs.composition.enabled=false可停合成 Job(纯 API 进程组应设 false)。- ⚠️
jwtSecret与 S3/Redis 凭据在此明文,属开发默认值,生产用配置注入/secret 覆盖。
合成微服务配置
apps/pf-compose-service/config.json:
1 | { |
CONFIG_PATH / PF_COMPOSE_SERVICE_PORT 可覆盖;puppeteer.renderUrl 可选。
人脸服务配置
apps/pf-face-service/config.json(算法超参全部外置):
1 | { |
配置搜索顺序:$CONFIG_PATH → ./config.json → apps/pf-face-service/config.json → ../pf-face-service/config.json → 内建默认。
环境变量覆盖(优先级最高):HOST/FACE_HOST、PORT/FACE_SERVICE_PORT、FACE_MODEL_PATH、FACE_DETECT_TIMEOUT_MS、FACE_MAX_DETECT_SIZE、FACE_MIN_SCORE、FACE_MAX_FACES、FACE_NMS_IOU_THRESHOLD、FACE_INTRA_OP_THREADS、FACE_INTER_OP_THREADS、FACE_INFERENCE_CONCURRENCY、RUST_LOG。(生产 Docker 内 PORT=3011。)
Drizzle 配置
apps/pf-service/drizzle.config.ts:schema: "./src/db/schema.ts"、out: "./drizzle"、dialect: "postgresql"、dbCredentials.url = process.env.DATABASE_URL ?? "postgres://postgres:postgres@localhost:5432/printing-factory"(注意读的是 DATABASE_URL 环境变量,与 config.json 分离)。
1 | bun db:generate # 生成迁移 SQL |
imgproxy / 边缘缓存
生产的图片管道由 imgproxy 容器 + Nginx 缓存配置(deploy/aliyun-nginx.conf)承担,关键项:IMGPROXY_ENFORCE_WEBP、IMGPROXY_QUALITY=80、IMGPROXY_MAX_SRC_RESOLUTION=50、缓存区 pf_img_cache(10g)/pf_raw_cache(20g) 30 天。前端通过 resolveOssAssetUrl(url, width) 拼 ?w= 触发。详见 部署。
前端构建配置
- pf-editor / pf-app(Quasar):
quasar.config.ts,开发端口 8100 / 8000,base/editor/、/app/;后端地址通过.env.development/.env.production注入。 - pf-manage(Vite + Naive UI):
vite.config.ts+uno.config.ts,开发端口 9527、preview 9725,base/manage/;dev走--mode test;.env里VITE_BASE_URL=/manage/、VITE_SERVICE_BASE_URL=...。
端口约定
| 服务 | 开发端口 | 生产 Docker | 用途 |
|---|---|---|---|
| Caddy 网关 | 9800 | — | 本地统一入口 |
| pf-app | 8000 | 静态 | 用户端 H5(base /app/) |
| pf-editor | 8100 | 静态 | 编辑器(base /editor/) |
| pf-manage | 9527 | 静态 | 管理后台(base /manage/) |
| pf-service | 3000 | 3001 | 后端 API |
| pf-compose-service | 3030 | 3031→3030 | 合成 |
| pf-face-service | 3010 | 3011 | 人脸检测 |
| imgproxy | — | 3020→8080 | 缩略图 |
| PostgreSQL | 5432 | 宿主 | 数据库 |
| Redis | 6379 | 宿主 | 缓存 |
| MinIO | 1280 (API) | 宿主 | 对象存储(经 /storage 代理) |
代码风格与规范
- 根
oxlint.config.ts;bun lint=oxfmt && oxlint --fix;bun typecheck=bun run --filter "*" typecheck。 - 命名:Vue PascalCase / TS camelCase / 文件夹 kebab-case / 常量 UPPER_SNAKE_CASE / 数据库 snake_case。
- TS strict,禁
any(用unknown+ 类型守卫)。 - OpenSpec(
openspec/config.yaml,CLI 1.13.0):schema: spec-driven,产物用中文简体、结构化标题与 SHALL/MUST 关键字保留英文。openspec/specs/存能力规范,changes/存变更提案。详见 路线图。
业务硬约束
由校验逻辑(非配置)约束,调整改路由层/Job 常量:单图大小、图片格式白名单、DPI 门槛、单次批量合成模板数上限、文件保留期。合成并发上限 3 在 pf-service(MAX_COMPOSITION_CONCURRENCY)与合成服务(puppeteer.workers)双重生效。