# ============================================================ # Fashion API 配置文件(唯一配置源) # # 加载优先级:环境变量 > 本文件 > 代码内置默认值 # - 本地开发:直接改本文件即可,无需任何环境变量 # - 容器部署:保持本文件为默认值,用环境变量覆盖敏感项(见每项 env 注释) # # 配置文件路径可通过 -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: 10 database: host: 127.0.0.1 # env: DB_HOST port: 5432 # env: DB_PORT user: fashion # env: DB_USER password: fashion_dev_2026 # 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: # 生产环境务必用环境变量覆盖为随机长字符串 secret: dev-secret-change-me-fashion-2026 # env: JWT_SECRET # token 有效期(小时),168 = 7 天,与原项目一致 expire_hours: 168 upload: # 图片存储目录。接口返回的封面/图片为相对路径(如 /uploads/xxx.jpg), # 前端通过 toAbs() 拼接为绝对地址,因此必须对外提供静态文件服务。 dir: ./uploads # env: UPLOAD_DIR # 静态文件访问前缀,需与数据库中存储的图片路径前缀一致 url_prefix: /uploads cors: # 允许的来源,"*" 表示全部(与原项目行为一致) allow_origins: - "*" allow_methods: - GET - POST - PUT - DELETE - OPTIONS allow_headers: - Content-Type - Authorization - X-Requested-With - X-Sign - X-Sign-Ts - X-Sign-Nonce 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 # 爬虫入库管线:暴露 :8092 /admin/internal/ingest 接收爬虫 HMAC 签名上报。 # 设计:服务端到服务端(非前端 JS),密钥绝不下发前端、只存爬虫配置与 INGEST_SECRET,安全高。 # - secret 必须与爬虫端 config.yml 的 ingest.secret 完全一致;env INGEST_SECRET 注入随机长串(生产)。 # - 建表由 GORM AutoMigrate 自动完成(ingest_jobs / ingest_nonces 等),无需手工 SQL 迁移。 # - 启用后 worker 随主进程拉起(cmd/server 内 goroutine),异步下载图、补 season_code、写正式表。 ingest: secret: "dev-ingest-secret-2026" # env: INGEST_SECRET(须与爬虫 config.yml 的 ingest.secret 一致) ttl_seconds: 300 # 签名时间戳容忍窗口(秒,±5min),防重放;env: INGEST_TTL # 缤纷云 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://.s3.bitiful.net(务必与 endpoint 同 host) # - ak/sk:缤纷云子账户 AccessKey/SecretKey(须有 PutObject/DeleteObject/GetObject 权限) # - style_display:全量展示图 CoreIX 样式名(VIP 与免费用户同质量)。须在控制台建一个公开样式 high, # 或填查询串(如 w=1080&q=80&fmt=webp)免建样式。代码含 "=" 即走查询串模式。 # 环境变量覆盖:S4_AK / S4_SK / S4_BUCKET / S4_ENDPOINT / S4_BASE_URL / S4_STYLE_DISPLAY / S4_STYLE_THUMB / S4_LOCAL_BASE # (旧 QINIU_* 仅 QINIU_STYLE_NORMAL 作 style_display 的兼容回退;S4_* 优先) s4: enabled: true ak: "ur2YaIFZvySmjTIgGT1fxhAW" sk: "JUlfcQ4HNgO5eIzj9u7qaeQomqssvtI" 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