为什么:用户下午要部署,但全仓没有任何部署产物;且生产漏配密钥会静默使用代码里的 dev 默认值,
属上线阻塞项(04-部署架构 / 12-上线检查清单)。
- 配置外置(三件):DB_URL、JWT 双密钥(**发现 app-secret 此前没外置,一直用 dev 默认值**)、
MEDIA_SIGNATURE_SECRET、MEDIA_SIGNATURE_REQUIRED、CORS_ALLOWED_ORIGINS、MEDIA_ROOT_DIR
- 新增三份 application-prod.yml:签名强制开启、CORS 收紧、媒资指向挂载点、日志级别
- 新增 ProdSecretGuard(@Profile("prod")):密钥缺失/仍是 dev 默认值/不足 32 位、签名未开、
DB_URL 或 CORS 为空 → 一次列全并终止启动(exit 1)
- 新增 /healthz 轻量健康端点:查明 /actuator/health 的"超时"是旧 jar 未重启所致,项目本就
没有 actuator 依赖,故不引新依赖;同时把 /healthz 加进安全白名单
- Docker 化:多阶段 Dockerfile(非 root、tini、依赖层缓存、ffmpeg 只给 worker)、.dockerignore、
自包含 docker-compose.yml(含 PostgreSQL 18 + Redis + 命名卷 + 按序初始化 sql + healthcheck)
- tools/smoke.sh(失败非 0 退出)+ DEPLOY.md(Compose 主线 / 裸 jar 兜底 / 回滚 / 故障速查)
- 实测:mvn test 83 条全过;两入口 package 通过;prod 缺密钥退出码 1 且报错明确、配齐后正常启动;
冒烟脚本全 PASS;本机无 Docker,镜像与 compose 未经构建验证(已在回执如实标注)
53 lines
1.6 KiB
YAML
53 lines
1.6 KiB
YAML
# Author: fruit.com.cn
|
||
#
|
||
# 转码 worker 独立进程:只做队列消费,不对外提供接口。
|
||
# 端口用 0(随机)——本进程不需要被访问,也不会跟 8080/8081 抢端口。
|
||
server:
|
||
port: 0
|
||
|
||
spring:
|
||
application:
|
||
name: fruitshorts-transcode-worker
|
||
autoconfigure:
|
||
exclude: org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
|
||
datasource:
|
||
driver-class-name: org.postgresql.Driver
|
||
# 与两个入口同一个库(worker 消费 transcode_task)
|
||
url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/fruitshorts}
|
||
username: ${DB_USER:fruitshorts}
|
||
password: ${DB_PASSWORD:fruitshorts}
|
||
|
||
mybatis-plus:
|
||
configuration:
|
||
map-underscore-to-camel-case: true
|
||
global-config:
|
||
banner: false
|
||
db-config:
|
||
# 与两个入口保持一致:主键由应用侧雪花生成(S0),否则 worker 插入 media_rendition 会没有 id
|
||
id-type: assign_id
|
||
logic-delete-field: deleted
|
||
logic-delete-value: 1
|
||
logic-not-delete-value: 0
|
||
sequence:
|
||
# 单机固定值;多实例部署前改成按实例分配
|
||
worker-id: 2
|
||
datacenter-id: 1
|
||
|
||
fruitshorts:
|
||
media:
|
||
# 必须与 app-api/admin-api 指向同一个存储根,worker 才找得到上传后的源文件
|
||
root-dir: ${MEDIA_ROOT_DIR:./data/uploads}
|
||
public-prefix: /files
|
||
transcode:
|
||
# 只有本进程打开转码(§8.5 隔离要求)
|
||
worker-enabled: true
|
||
poll-delay-ms: 3000
|
||
ffmpeg-path: ${FFMPEG_PATH:ffmpeg}
|
||
ffprobe-path: ${FFPROBE_PATH:ffprobe}
|
||
segment-seconds: 6
|
||
poster-second: 1
|
||
|
||
logging:
|
||
level:
|
||
com.fruitshorts: info
|