ci / 质量门禁 (push) Successful in 6m4s
背景:A6-BE-01..05 与 A6-INF-01,打通「提交 → 队列 → SSE 进度 → 完成/失败 → 取消 / 仅重试失败项」闭环,为 B3 / M1 的真实任务提供统一协议。 改动: - API media 模块:POST/GET /media-tasks、详情、SSE(Last-Event-ID 续推 + 15s 心跳 + 800ms 落库轮询)、取消(只影响未开始项)、仅重试失败项;Idempotency-Key 24h(异步提交 202;同 key 同 body 返回同一任务且不重复审计,不同 body 40902);范围外统一 404; - 队列骨架:BullMQ 5 九队列(5 组独立启停)、Outbox dispatcher(Redis 锁 + FOR UPDATE SKIP LOCKED + jobId 幂等 + 指数退避/死信)、worker 按 QUEUE 启停、demo 演练处理器(事务 + 行锁 + 取消/重试/幂等)、优雅退出与心跳; - 监控:GET /api/v1/health/queues、GET /api/v1/metrics(Prometheus 0.0.4)、infra/monitoring 告警规则与接入说明; - 通用:AuditInterceptor 支持幂等重放 skipAudit(默认行为不变)、AppModule 接线、.env.example 的 QUEUE 语义、bullmq 5.81.5 / worker @prisma/client / worker 覆盖率依赖。 影响面:OpenAPI 新增 6 个端点(openapi:diff 无破坏性变更);API 进程新增 outbox dispatcher 与 metrics/health 路由;worker 新增 BullMQ 消费;未改旧审计导出链路与既有接口。 回滚:回滚提交并停止 worker 新队列消费;task/outbox 新表数据不影响旧功能,可按需保留。 验证:api 单测 257、集成 92(连跑 2 次)、worker 27、shared 197;typecheck / lint / format:check / build / openapi:diff 全绿;本地真实 worker 启用 9 队列心跳,/health/queues、/metrics 实测,/media-tasks 未登录 401。
69 lines
3.2 KiB
Bash
69 lines
3.2 KiB
Bash
# 灵犀 · 环境变量示例(入库,禁止写真实密钥)
|
||
# 使用:cp .env.example .env.local(工程规范 09 ENV-09)
|
||
# 注意:本地 PostgreSQL/Redis 复用本机已有 Docker 服务(127.0.0.1:5432 / 6379);
|
||
# 对象存储为公网 RustFS,本地真实值只写入 .env.local / .env(已 gitignore)。
|
||
|
||
# ---------- 运行环境 ----------
|
||
NODE_ENV=development
|
||
LOG_LEVEL=debug
|
||
|
||
# ---------- 数据库(PostgreSQL 18) ----------
|
||
# 本地开发沿用 postgres 账号;生产 DATABASE_URL 应使用 A5 迁移创建的 NOLOGIN 角色 lingxi_app
|
||
# (审计表仅 SELECT / INSERT,append-only 由 DB 触发器兜底;其他业务表的授权见运维 Runbook)。
|
||
DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:5432/lingxi?schema=public
|
||
|
||
# ---------- Redis(7.4) ----------
|
||
REDIS_URL=redis://127.0.0.1:6379
|
||
|
||
# ---------- 对象存储(RustFS,S3 协议;A0 统一使用 lingxi-dev 桶) ----------
|
||
S3_ENDPOINT=https://oss.xinsenidea.com
|
||
S3_REGION=us-east-1
|
||
S3_BUCKET_ASSETS=lingxi-dev
|
||
S3_BUCKET_RENDERS=lingxi-dev
|
||
S3_BUCKET_TEMP=lingxi-dev
|
||
S3_ACCESS_KEY=<rustfs-access-key>
|
||
S3_SECRET_KEY=<rustfs-secret-key>
|
||
|
||
# ---------- 认证(本地 dev 值,生产由密钥管理注入;密钥至少 32 位) ----------
|
||
JWT_ACCESS_SECRET=dev-only-jwt-access-secret-change-me-32
|
||
JWT_REFRESH_SECRET=dev-only-jwt-refresh-secret-change-me-32
|
||
# access / refresh 有效期(秒):15 分钟 / 7 天
|
||
JWT_ACCESS_TTL_SECONDS=900
|
||
JWT_REFRESH_TTL_SECONDS=604800
|
||
# 登录失败阈值与锁定时长(分钟内累计失败达阈值即锁定)
|
||
AUTH_MAX_LOGIN_FAILURES=5
|
||
AUTH_LOCK_MINUTES=15
|
||
|
||
# ---------- API ----------
|
||
PORT=3000
|
||
HOST=0.0.0.0
|
||
WEB_ORIGIN=http://127.0.0.1:5173,http://localhost:5173
|
||
MAX_UPLOAD_MB=500
|
||
|
||
# ---------- Worker / 队列(BullMQ,技术架构 §2.4 / §3.7) ----------
|
||
# 队列分 5 组共 9 条(script:generate / image:matting / image:render / video:keyframe / video:shot /
|
||
# video:compose / delivery:zip / export:package / media:verify),名称与并发 / 重试 / 退避参数
|
||
# 的唯一事实源是 packages/shared 的 TASK_QUEUES,这里只决定 worker 启动哪些队列:
|
||
# all 启动全部 9 条(本地开发默认)
|
||
# 分组名,逗号分隔 script / image / video / export / verify(如 QUEUE=verify)
|
||
# 具体队列名 如 QUEUE=media:verify 或 QUEUE=image:render,media:verify
|
||
QUEUE=all
|
||
# 可选:统一覆盖全部队列的消费并发;留空 / 注释时按 TASK_QUEUES 的每队列定义
|
||
# (如 media:verify=4、script:generate=8、video:shot=12)。
|
||
# WORKER_CONCURRENCY=2
|
||
# 可选:worker 标识,默认 <hostname>-<pid>;写入心跳 lingxi:worker:heartbeat:<queue>(TTL 30s)。
|
||
# WORKER_ID=dev-worker-01
|
||
# API 进程内 Outbox dispatcher 的调度间隔(毫秒);未设置默认 1000。
|
||
# OUTBOX_DISPATCH_INTERVAL_MS=1000
|
||
|
||
# ---------- 前端(只能暴露 VITE_PUBLIC_* 前缀,ENV-07) ----------
|
||
VITE_PUBLIC_API_BASE_URL=http://127.0.0.1:3000/api/v1
|
||
# A0 登录壳没有接后端鉴权,置 true 时登录页写入本地演示会话以便查看布局;A1 接入真实登录后删除。
|
||
VITE_PUBLIC_DEMO_SESSION=false
|
||
|
||
# ---------- 可观测 ----------
|
||
OTEL_EXPORTER_OTLP_ENDPOINT=
|
||
|
||
# ---------- 功能开关 ----------
|
||
FEATURE_VIDEO=false
|