Files
xiaotutongxue/backend/xt-server/src/main/resources/application.yml
T
lovife b9373d6ebd fix(config): 本地私有配置改用 profile 机制(spring.config.import 优先级不够)
起因:用户把七牛 AK/SK 填进了 application-dev.yml(**会提交的文件**)。
已把密钥挪到 jar 外的 backend/application-local.yml(gitignore),
并把 dev 文件还原成空占位符 —— 确认过待提交差异里没有密钥。

⚠️ 排查中发现一个**沉默的坑**:一开始用
  spring.config.import: optional:file:./application-local.yml
加载本地密钥,结果**启动正常、日志不报错、但配的 provider 完全没生效**
(还是本地磁盘)。三步定位:
  ① 确认 YAML 合法(结构/编码/缩进都对)→ 不是文件问题
  ② 换 --spring.config.additional-location=file:./... → **生效了**
     → 文件与内容没问题,问题在 import 这条路
  ③ 把 import 改成**非可选 + 指向不存在的文件** → 启动失败并报
     "Config data resource ... does not exist"
     → 证明 import **确实被处理了**,是**优先级**问题

根因:spring.config.import 导入的文件排在 **profile 文件之后(优先级更低)**,
于是 application-dev.yml 里的 storage.provider 把导入文件里的 provider: qiniu
盖掉了 —— 而这一切没有任何报错。

修法:改用标准机制 —— 文件恢复成 profile 名 application-local.yml,
application.yml 里加 spring.profiles.include: local。
profile 文件后加载、优先级更高。启动日志现在打印
  The following 2 profiles are active: "local", "dev"
那个坑已写进 application.yml 的注释里,免得后人再踩。

教训:**"配置了但没生效、且不报错"是最难查的一类问题。**
判断某个配置机制到底有没有被执行,有个通用办法:
**把它改成一个必然会失败的值** —— 如果照样跑起来,说明它根本没被处理。

⛔ 仍阻塞:用户填的 AK/SK **验证无效**(七牛 401 bad token)。
两个互相独立的签名实现都失败,所以不是代码问题:
  ① 七牛官方 SDK 的 Auth.uploadToken(自检走的就是它)
  ② 手写的管理 API 签名(GET https://rs.qiniu.com/buckets)
线索:AK 40 字符正常、**SK 41 字符**(七牛的 AK/SK 都是 40 字符的 URL 安全 base64);
但逐字符试"去掉首/尾字符"三种组合都被拒 → 不是收尾多一个字符。
需要用户到七牛控制台 → 密钥管理重新完整复制一对。

为不阻塞本地开发,application-local.yml 里 provider 先留 local(密钥保留着,
换成有效的之后去掉一行注释即可)。回归:e2e-m3-file 29/29、m3-submit 31/31。
2026-09-29 14:38:37 +08:00

122 lines
4.0 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.
# ═══════════════════════════════════════════════════════════
# 数据信息填报系统 · 主配置
# 环境差异全部放 application-{dev,test,prod}.yml
# ⚠️ 生产密钥一律走环境变量,不写在这里
# ═══════════════════════════════════════════════════════════
server:
port: 8080
# 上传接口是长连接,超时要放宽(学生可能从聊天记录选一个 40MB 的文件)
tomcat:
connection-timeout: 60s
max-swallow-size: 100MB
compression:
enabled: true
mime-types: application/json,text/html,text/css,application/javascript
min-response-size: 2048
spring:
application:
name: xt-server
profiles:
active: dev
# 额外挂一个 local 配置(backend/application-local.yml,**不提交**)。
# 用它放云存储密钥这类不该进仓库的东西;文件不存在时是空操作,不影响任何环境。
#
# ⚠️ 为什么不用 spring.config.import —— 试过,**优先级不够**:
# 导入的文件排在 profile 文件之后(优先级更低),于是
# application-dev.yml 里的 provider 会把它盖掉,表现是
# "文件明明配了 qiniu,启动后却还是本地磁盘",而且不会有任何报错。
# profile 文件是后加载的,优先级更高,行为符合直觉。
include: local
lifecycle:
# 优雅停机:等在途请求处理完,避免上传/导出被打断
timeout-per-shutdown-phase: 30s
jackson:
time-zone: Asia/Shanghai
default-property-inclusion: always
deserialization:
fail-on-unknown-properties: false
servlet:
multipart:
max-file-size: 50MB
max-request-size: 60MB
datasource:
driver-class-name: org.postgresql.Driver
hikari:
pool-name: xt-hikari
minimum-idle: 5
maximum-pool-size: 20
connection-timeout: 10000
idle-timeout: 600000
max-lifetime: 1700000
# 慢 SQL 从应用侧也记一份,方便和 PG 的 log_min_duration_statement 对照
leak-detection-threshold: 20000
data:
redis:
timeout: 3s
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 2
max-wait: 3s
flyway:
enabled: true
locations: classpath:db/migration
# 迁移文件一旦发布就不许改,改了校验会失败——这是保护,不是障碍
validate-on-migrate: true
baseline-on-migrate: false
table: flyway_schema_history
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
# 生产环境关掉 SQL 日志,dev 单独开
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
banner: false
db-config:
# 软删除字段名,客户明确要求就叫 deleted
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
id-type: auto
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: when-authorized
health:
redis:
enabled: true
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /doc.html
tags-sorter: alpha
operations-sorter: alpha
# ── 本项目业务配置 ────────────────────────────
fill:
# JWT 见《03-接口设计》§1.2:PC 8 小时 / 小程序 7 天
jwt:
issuer: tianbaotong-fill
pc-expire-seconds: 28800
mp-expire-seconds: 604800
# 密钥与 RSA/AES 密钥在 application-{env}.yml 或环境变量中提供
security:
# 登录失败锁定:5 次锁 15 分钟(§1.6)
login-max-fail: 5
login-lock-minutes: 15
# 连续失败几次后要求图形验证码
captcha-after-fails: 2
upload:
# 单文件上限 50MB(PRD §10.1)
max-file-size-mb: 50