Files
lingxi/.env.example
T
Stev_Wang 633765f10f
ci / 质量门禁 (push) Successful in 6m4s
feat(media): A6 任务中心 API、SSE 进度与队列骨架
背景: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。
2026-11-04 21:52:35 +08:00

69 lines
3.2 KiB
Bash
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.
# 灵犀 · 环境变量示例(入库,禁止写真实密钥)
# 使用: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