总览

类型 文件 / 来源
后端主服务 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"server": {
"port": 3000,
"workerId": 1,
"jobs": { "composition": { "enabled": true, "intervalMs": 10000 } }
},
"auth": { "jwtSecret": "1sazaw123" }, // 可被 JWT_SECRET 覆盖
"logging": { "dir": "./logs", "level": "info", "maxSize": "20m", "maxFiles": "14d" },
"composeService": { "baseUrl": "http://localhost:3030", "timeoutMs": 60000 },
"db": { "url": "postgres://postgres:postgres@localhost:5432/printing-factory" },
"redis": { "host": "127.0.0.1", "port": 6379, "username": "default", "password": "redis", "db": 0 },
"s3": { "accessKeyId": "minio", "secretAccessKey": "passwdminio", "bucket": "pf-bucket",
"endpoint": "http://localhost:1280", "publicUrl": "/storage" },
"faceService": { "baseUrl": "http://localhost:3010", "timeoutMs": 8000,
"publicBaseUrl": "http://localhost:1280/pf-bucket" }
}

关键点:

  • 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
2
3
4
5
6
7
{
"server": { "port": 3030, "workerId": 1 },
"logging": { "dir": "./logs", "level": "info", "maxSize": "20m", "maxFiles": "14d" },
"puppeteer":{ "workers": 3, "maxUsesPerWorker": 100, "renderTimeoutMs": 30000 },
"s3": { "accessKeyId": "minio", "secretAccessKey": "passwdminio", "bucket": "pf-bucket",
"endpoint": "http://localhost:1280", "publicUrl": "/storage" }
}

CONFIG_PATH / PF_COMPOSE_SERVICE_PORT 可覆盖;puppeteer.renderUrl 可选。

人脸服务配置

apps/pf-face-service/config.json(算法超参全部外置):

1
2
3
4
5
6
{
"server": { "host": "0.0.0.0", "port": 3010, "timeoutMs": 30000, "inferenceConcurrency": 4 },
"model": { "path": "models/scrfd_500m_bnkps.onnx", "intraOpThreads": 2, "interOpThreads": 1 },
"detection": { "maxDetectSize": 640, "minScore": 0.35, "maxFaces": 10, "nmsIouThreshold": 0.4 },
"logging": { "level": "info,pf_face_service=debug" }
}

配置搜索顺序:$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
2
3
4
bun db:generate    # 生成迁移 SQL
bun db:push # 同步 schema(dev)
bun db:migrate # 执行迁移
bun db:studio # GUI

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)双重生效。

下一步

  • 想看怎么把这些参数生效在生产 → 部署
  • 想看常见配置坑 → FAQ

站内搜索

没有找到内容!