Files
photo-live/.env.example
T
浅念 0fcf18cc5c feat(ov): public read api on replicas with hot sorting
P2 Task 6(ov 公开读 API + viewer 切换):
- ov 装配 PublicOvModule(仅 app-ov.module):/public/albums/{token}、
  /photos、/photos/{id} 三端点同契约读 ov 副本——translations/categories
  自 JSON 列解析(防御性过滤),banner 经 ov 侧 STORAGE_PORT_OV 预签名
  (同本地 MinIO;只读属约定,真实 OSS 只读凭证 P5),viewCount 取
  album_stats 权威累计(无行默认 0;计数端点 Task 8 接线)
- 排序:latest=发布时间 keyset(shared/cursor.ts 同 cn);hot=likeTotal
  desc + photoId desc 决胜,顺序按 `${albumId}|${category}` 短期快照
  (内存 TTL 默认 30s,HOT_SORT_TTL_MS 惰性读取)——计数逐请求现读、
  顺序冻结窗口内一致,偏移游标(base64url 整数)在快照内严格稳定;
  非法 sort 400 VALIDATION_FAILED(cn 不感知该参数)
- 契约:viewCount 放宽为 integer|null(cn null、ov 权威值);
  listPublicPhotos 增 sort 枚举(latest|hot,缺省 latest);
  PhotoPublishedPayload 增 categoryId——补上 Tasks 3/4 管线缺口
  (payloads/publish.service/sync-inbox 投影 + 关联测试随改)
- e2e(services/api/test/public-ov.e2e-spec.ts,7 用例):双入口同进程
  起 cn+ov,cn API 种子→真实发送管线投递;断言相册/列表/单图与 cn
  深等(仅签名 URL 剔除)、banner 真字节、参数矩阵 400/404、hot 排序
  TTL 内快照(计数新/顺序旧)+TTL 过期翻转+偏移翻页、隐藏/下线/紧急
  停用逐态撤下
- viewer 切 ov:API 基址 VITE_API_BASE(缺省 http://127.0.0.1:8081,
  空串=同源网关;Vite 只读 apps/viewer/.env*,根 .env 对前端无效),
  移除 /v1 dev 代理(CORS_ORIGINS 增 127.0.0.1:5175 直连两形);
  playwright webServer 增 dev:ov;e2e 夹具 flushSync(albumId)=cn
  bootstrap 快照 + deliverPendingOnce(sender 新导出)经真实管线投影
  种子,deleteSeededPhoto 改软删让墓碑可同步;14 个 Playwright 全绿
  (journey 管理/staffB 腿仍走 cn 8080)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-18 17:05:56 +08:00

52 lines
2.6 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.
DATABASE_URL_CN=mysql://root:root@127.0.0.1:3306/photo_cn?connection_limit=10
REDIS_URL_CN=redis://127.0.0.1:6379
S3_ENDPOINT=http://127.0.0.1:9000
S3_REGION=us-east-1
S3_ACCESS_KEY=photo-dev
S3_SECRET_KEY=photo-dev-secret
S3_BUCKET=photo-dev
SIGNED_URL_TTL_SECONDS=900
AUTH_SESSION_TTL_SECONDS=2592000
UPLOAD_MAX_BYTES=52428800
PORT=8080
# viewer(P2 Task 6 起直连 ov 8081,跨源)需两形 origin:Playwright/本机访问
# 常走 127.0.0.1,浏览器 Origin 头按实际 host 发出——localhost 与 127.0.0.1
# 是两个不同 origin,缺一则直连 fetch 被 CORS 拦截。admin(5176)走自身
# /v1 代理同源,不依赖此清单。
CORS_ORIGINS=http://localhost:5175,http://127.0.0.1:5175,http://localhost:5176
LOG_LEVEL=info
ADMIN_ACCOUNT=admin
ADMIN_PASSWORD=admin-secret-change-me
# ── P2 双地域仿真(ov 域)──
# 本任务(Task 1)即被读取的键:内部同步 HMAC 密钥与 ov 双库连接。
SYNC_INTERNAL_KEY=dev-sync-secret-change-me
DATABASE_URL_OV=mysql://root:root@127.0.0.1:3309/photo_ov?connection_limit=10
REDIS_URL_OV=redis://127.0.0.1:6381
# P2 Task 2:ov 入口监听端口(main-ov.ts 读取;与 cn PORT=8080 同机双入口)。
PORT_OV=8081
# P2 Task 3:sync 发送器(services/sync)推送目标——ov 入口基址(不含路径,
# 端点路径由发送器拼接为 /v1/internal/sync/content-batches)。
OV_API_URL=http://127.0.0.1:8081
# P2 Task 4:对账调度器(services/sync reconciler)拉取 reconcile/digest 与
# 触发 bootstrap 的 cn 入口基址(不含路径)。
CN_API_URL=http://127.0.0.1:8080
# 以下为 P2 决策初值(D07/D11)的 env 覆盖键:默认值见
# packages/contracts/src/constants.ts(HEARTBEAT_MS 见 src/realtime.ts),
# 此处登记供运维可见与调整;SYNC_BATCH_SIZE/SYNC_PUSH_INTERVAL_MS 自 Task 3
# 起、SYNC_RECONCILE_INTERVAL_MS 自 Task 4 起被 services/sync 读取,其余为
# 前瞻登记(Task 7+ 逐个接线)。
SYNC_BATCH_SIZE=100
SYNC_PUSH_INTERVAL_MS=2000
SYNC_RECONCILE_INTERVAL_MS=300000
# P2 Task 6:ov 公开列表 sort=hot 的排序快照 TTL(毫秒,缺省 30000)——
# 顺序冻结窗口(点赞数仍逐请求现读),由 services/api public-ov 惰性读取;
# e2e 以短 TTL 加速翻转断言。另:viewer 的 API 基址是构建期变量
# VITE_API_BASE(缺省 http://127.0.0.1:8081 ov 入口;空串=同源网关)——
# Vite 只读 apps/viewer/.env*,根 .env 对前端无效(见 apps/viewer/src/api/client.ts)。
HOT_SORT_TTL_MS=30000
STAT_RETURN_INTERVAL_MS=60000
VISIT_WINDOW_MINUTES=30
LIKE_BATCH_WINDOW_HOURS=24
VISIT_REQUEST_TTL_MINUTES=35