Files
backend_v2/configs/config.yml
toom1996 1de1ec46a6 update
2026-10-18 17:42:10 +08:00

149 lines
9.4 KiB
YAML
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.

# ============================================================
# Fashion API 配置文件(唯一配置源,但敏感项一律留空)
#
# 加载优先级:环境变量 > 本文件 > config.local.yml(本机私有)> 交互提示(仅本地 TTY)
# - 本地开发:终端启动时会交互式提示填写缺失的必填/推荐密钥,并自动写入 config.local.yml
# - 容器部署:保持本文件为默认值,用环境变量(见 .env.example)覆盖敏感项
#
# ⚠️ 重要:JWT_SECRET / DB_PASSWORD / INGEST_SECRET / S4_AK / S4_SK 等敏感值
# 严禁写入本文件(会被提交进版本库)。本文件已将它们留空,请从环境变量或
# 本地交互提示获取。S4 的旧 AK/SK 曾误提交,已轮换并清空,请勿再填回明文。
#
# 配置文件路径可通过 -config 启动参数或 CONFIG_PATH 环境变量指定,
# 默认按 ./configs/config.yml → ./config.yml 顺序查找。
# ============================================================
server:
# 监听端口。前端 test 项目的 PUBLIC_API_BASE 指向 http://localhost:8090,
# 且 src/lib/api.ts 在 DEV 模式下硬编码回落到 8090,因此默认必须是 8090。
port: 8090 # env: SERVER_PORT
# gin 运行模式:debug(开发,输出彩色路由日志)| release(生产)| test
mode: debug # env: GIN_MODE
# 优雅关闭的最长等待时间(秒)
shutdown_timeout: 60
database:
host: 127.0.0.1 # env: DB_HOST
port: 5432 # env: DB_PORT
user: fashion # env: DB_USER
# ⚠️ 留空:生产经 DB_PASSWORD(兼容 DB_PASS)注入,或本地启动时交互填写
password: "" # env: DB_PASSWORD(兼容 DB_PASS)
# 本地开发库名 fashion;对应 scripts/pgvector 的 Docker PostgreSQL 容器
name: fashion # env: DB_NAME
# GORM 日志级别:silent | error | warn | info
log_level: warn
# 连接池
max_idle_conns: 10
max_open_conns: 100
conn_max_lifetime: 3600 # 秒
conn_max_idle_time: 60 # 秒,空闲连接回收时间,防止池子持有被服务端回收的死连接导致 invalid connection
jwt:
# ⚠️ 留空:生产经 JWT_SECRET 注入随机长字符串,或本地启动时交互填写
secret: "" # env: JWT_SECRET
# token 有效期(小时),168 = 7 天,与原项目一致
expire_hours: 168
upload:
# 图片存储目录。接口返回的封面/图片为相对路径(如 /uploads/xxx.jpg),
# 前端通过 toAbs() 拼接为绝对地址,因此必须对外提供静态文件服务。
dir: ./uploads # env: UPLOAD_DIR
# 静态文件访问前缀,需与数据库中存储的图片路径前缀一致
url_prefix: /uploads
cors:
# 允许的来源:生产必须收窄为具体域名列表(不要用 "*",否则任意站点可跨域调用)。
# 也可用环境变量 CORS_ALLOW_ORIGINS=https://a.com,https://b.com 在容器里覆盖本值。
allow_origins:
- "https://xisoa.com"
- "https://www.xisoa.com"
allow_methods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allow_headers:
- Content-Type
- Authorization
- X-Requested-With
- X-Sign
- X-Sign-Ts
- X-Sign-Nonce
- X-Locale
max_age: 86400 # 预检请求缓存秒数
# 公开接口「前端 JS 签名」:给 /runway-looks(列表)与 /brands 两个批量接口加请求签名校验,
# 识别「请求大概率由前端 JS 构造」、抬高 casual 爬虫的批量抓取成本。
# 安全定位:这是「提高成本」而非「加密」——密钥必须出现在前端 bundle,对浏览器可见;
# 有决心的爬虫可反编译 JS 复刻签名。与按 IP 限流配合才有效。
# - enabled: false 时不拦截(默认,灰度安全);true 时要求每个请求带 X-Sign 签名。
# - secret 必须与前端的 CLIENT_SIGN_SECRET 完全一致;生产经环境变量 CLIENT_SIGN_SECRET 注入随机长串。
client_sign:
enabled: false # env: CLIENT_SIGN_ENABLED(容器部署用环境变量开)
secret: "" # env: CLIENT_SIGN_SECRET
ttl_seconds: 30 # 签名时间戳容忍窗口(秒),防重放;env: CLIENT_SIGN_TTL
# 按客户端 IP 的速率限制(令牌桶),作为防刷兜底(与 client_sign 配合)。
# 默认关闭;生产建议开启(RATE_LIMIT_ENABLED=true),按单 IP 限制总量。
rate_limit:
enabled: false # env: RATE_LIMIT_ENABLED
rps: 20 # env: RATE_LIMIT_RPS(每秒平均允许请求数)
burst: 40 # env: RATE_LIMIT_BURST(突发容量)
# 爬虫入库管线:暴露 :8092 /admin/internal/ingest 接收爬虫 HMAC 签名上报。
# 设计:服务端到服务端(非前端 JS),密钥绝不下发前端、只存爬虫配置与 INGEST_SECRET,安全高。
# - secret 必须与爬虫端 config.yml 的 ingest.secret 完全一致;env INGEST_SECRET 注入随机长串(生产)。
# - 建表不再由服务启动自动完成:表结构随全库由 cmd/dbtool 导出的 SQL 维护(dbtool dump → psql -f)。
# - 启用后 worker 随主进程拉起(cmd/server 内 goroutine),异步下载图、补 season_code、写正式表。
ingest:
# ⚠️ 留空:生产经 INGEST_SECRET 注入,或本地启动时交互填写
secret: "" # env: INGEST_SECRET(须与爬虫 config.yml 的 ingest.secret 一致)
ttl_seconds: 300 # 签名时间戳容忍窗口(秒,±5min),防重放;env: INGEST_TTL
# 本机下载代理(仅本地开发用,不提交):worker 下载图片(如 assets.vogue.com)经此代理访问源站。
# 支持 http:// 或 socks5://,例如 socks5://127.0.0.1:51831 或 http://127.0.0.1:58591。
# 留空直连;环境变量 INGEST_DOWNLOAD_PROXY 可覆盖本值(二者均只作用于「下载」,不影响 S4 上传与数据库)。
# 实际值建议写 configs/config.local.yml(已被 .gitignore 忽略),避免进入共享配置。
download_proxy: "" # env: INGEST_DOWNLOAD_PROXY
# 缤纷云 S4 对象存储(S3 兼容,爬虫入库图片上传目标)
# - enabled: true 时,worker 把下载的走秀/街拍图直传 S4 bucket,库里只存 key(base_url 渲染时拼)
# - bucket:存储桶名(须为「公开桶」,图片经 CoreIX 公开样式对外提供)
# - endpoint:S3 接入点,默认 https://s3.bitiful.net;region 任意(如 cn-east-1)
# - base_url:对外访问域名;留空自动推导 https://<bucket>.s3.bitiful.net(务必与 endpoint 同 host)
# - ak/sk:缤纷云子账户 AccessKey/SecretKey(须有 PutObject/DeleteObject/GetObject 权限)
# - style_display:全量展示图 CoreIX 样式名(VIP 与免费用户同质量)。须在控制台建一个公开样式 high,
# 或填查询串(如 w=1080&q=80&fmt=webp)免建样式。代码含 "=" 即走查询串模式。
# ⚠️ ak/sk 已留空(旧密钥曾误提交,已轮换)。生产经 S4_AK / S4_SK 注入,或本地启动时交互填写。
# 环境变量覆盖:S4_AK / S4_SK / S4_BUCKET / S4_ENDPOINT / S4_BASE_URL / S4_STYLE_DISPLAY / S4_STYLE_THUMB
# (旧 QINIU_* 仅 QINIU_STYLE_NORMAL 作 style_display 的兼容回退;S4_* 优先)
s4:
enabled: true
ak: "" # env: S4_AK(必填,启用 S4 时)
sk: "" # env: S4_SK(必填,启用 S4 时)
bucket: "toomstudio" # 你的缤纷云 S4 桶名
endpoint: "https://s3.bitiful.net"
region: "cn-east-1"
base_url: "" # 留空自动推导 https://toomstudio.s3.bitiful.net
style_display: "high" # 高清公开样式名(须在缤纷云控制台建 public 样式 high);或填查询串 w=1080&q=80&fmt=webp
style_thumb: "thumb" # 列表缩略图公开样式名(控制台建 public 样式 thumb);仅用于列表/卡片等小尺寸场景,详情页与大图仍用 style_display。留空则回落 style_display
# 视觉服务(FashionSigLIP):入库时把每张图编码成 768 维归一化向量写入 image_embeddings,
# 后台图集页据此提示「疑似同款」(仅提示,不做任何自动去重)。
# - 服务为独立进程(D:\project\fashion-siglip),仅监听回环地址。
# - enabled=false(默认)时完全跳过 embed 调用;服务不可用/超时/维度不符一律降级为「不写向量」,
# 绝不阻断入库。连续失败达 fail_threshold 次后熔断冷却 5 分钟。
# - dim 须与模型一致(Marqo/marqo-fashionSigLIP 实测 768 维)。
# - similar_threshold 为「疑似同款」余弦相似度阈值,已用真实 runway 数据实测校准:
# 排除同图集后,「不同图」的跨图集最佳相似度上限约 0.90,而「同一张照片」的重复落在 1.0000,
# 故取空隙中点 0.93(0.68 时实测 100% 的图都会挂提示,纯噪音)。
# 环境变量覆盖:VISION_ENABLED / VISION_ENDPOINT / VISION_TIMEOUT / VISION_DIM /
# VISION_SIMILAR_THRESHOLD / VISION_FAIL_THRESHOLD
vision:
enabled: false # env: VISION_ENABLED
endpoint: "http://127.0.0.1:8900" # env: VISION_ENDPOINT
timeout_seconds: 5 # env: VISION_TIMEOUT
dim: 768 # env: VISION_DIM
similar_threshold: 0.93 # env: VISION_SIMILAR_THRESHOLD
fail_threshold: 3 # env: VISION_FAIL_THRESHOLD