浅念
|
5efb89a252
|
fix(deploy): remove orphaned proxy directives from template cleanup
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:41:31 +08:00 |
|
浅念
|
57394387cc
|
fix(deploy): proxy_pass double http:// prefix — API was down
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:39:12 +08:00 |
|
浅念
|
222c44c1f7
|
fix(deploy): disable gzip on /v1/ API paths — Flutter release AOT gzip decompression failure
服务端 200+数据正常、debug/JIT 正常;release/AOT 的 Dart HttpClient 对
Content-Encoding: gzip 解压异常 → JSON 解析失败 → 显示 INTERNAL_ERROR。
nginx /v1/ 路径 gzip off(静态资源 gzip 不受影响);proguard keep 规则
一并保留(dio/flutter_secure_storage/全项目模型)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 18:36:11 +08:00 |
|
浅念
|
f984535c2a
|
fix(deploy): absolute_redirect off — root redirect keeps host:port through reverse proxy
nginx 默认 absolute_redirect on:return 302 被绝对化为 scheme://Host/(经
OpenResty 反代 Host 无端口 → 32005/ 跳到无端口的 /admin/ 打不开)。
off 后发相对 Location,浏览器按当前 host:port 补全。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 13:55:46 +08:00 |
|
浅念
|
7ef27797ff
|
fix(deploy): root path redirect to admin (cn) — persisted in template+compose
用户约定:32005 根路径打开即管理后台。之前是直接改在服务器容器配置上的,
历次镜像重建被冲掉——本次固化进仓库:nginx 模板 location = / → 302
${ROOT_REDIRECT};Dockerfile 默认 /admin/;compose 按栈注入(cn=/admin/,
ov=/index.html 观众端安全自指,不影响 /a/<token> 与嵌入路径)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-23 13:52:29 +08:00 |
|
浅念
|
c26d6b9a73
|
fix(deploy): review fixes — smoke photoId field, web healthcheck wget, outbox table name, cdn key shape
Reviewer findings on p5-prep batch:
1. BLOCKING: prod-smoke.sh visibility grep used "id" but API items
serialize photoId (cn public.service / ov public-ov.service) — every
healthy deployment would false-FAIL release gate ④. 4 sites fixed.
2. web/web-ov healthchecks used curl on nginx:alpine (absent) → perpetual
false-unhealthy; switched to busybox wget.
3. RUNBOOK rollback rule cited nonexistent sync_outbox → outbox_events.
4. cdn-checklist invalidation sample key shape aligned to actual
variantsObjectKey layout (.../albums/{albumId}/variants/{photoId}/{version}/{variant}.jpg).
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-21 02:03:44 +08:00 |
|
浅念
|
d01cecd2f6
|
docs: p5 preparation complete and implementation draft
- docs/plans/2026-09-21-P5-真实环境接入.md 草案(头部标注待 G5 凭证评审
转正):T1-T12 任务序(每任务 产出/依赖用户输入/关口)——G1 OSS 冒烟→
国内起栈→ov 部署+bootstrap 对账→域名证书→CDN(含图片加速三选一)→
跨境 MySQL 通道定案(白名单+SSL/隧道/HTTP 化三选项,含改造量评估)→
G4 用户源→故障演练→压测 D05→G2 真机→G6 试运行→发布交接;用户输入
汇总表 + 决策 D03-D13 状态速查 + 风险表(跨境链路/双层签名/MySQL
8.0.30 门槛/镜像仓库通道等)
- 总纲 P5 行注记:准备件完成 2026-09-21,实装待 G5 + G4
- P5-prep 计划全项勾选回填(评审项注明自审已修 + 独立 reviewer 由编排方追加)
- 自审修正:monitoring 统计副本表名(无 stat_snapshots 表,副本位在
albums/photos 行)与 outbox_events.occurredAt/photo_jobs.updatedAt 列名、
jq 管道括号;cdn 失效多 URL 换行分隔;k6 helpers 请求体用 ArrayBuffer
原生形态、read-feed 身份串延迟生成(init 上下文 VU 编号恒 0)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-21 01:56:56 +08:00 |
|
浅念
|
f71a887f17
|
test(loadtest),docs: monitoring, cdn checklist and k6 framework
- monitoring.md: 指标→实现映射(1Panel+云监控+结构化日志,不引入额外监控
系统);pino 字段表如实列自代码(访问日志 req.id/res.statusCode/
responseTime + sync/worker 自定义 msg 字段);六类告警 jq 检索语句与
阈值建议总表;日志保留(compose json-file 10m×3 已设 + 每日归档建议)
- cdn-checklist.md: 全步骤待凭证执行;图片加速三选一架构核对(双层签名
冲突分析,推荐 c 起步=CDN 仅加速 viewer 静态、presigned 直链不变,
图片收益后评估 b=CDN 鉴权+私有桶回源授权);缓存规则对齐源站 immutable;
失效/预热 CLI 样例与多地域冷缓存测试点模板
- loadtest/: k6 框架——read-feed.js(N 观众四 mix:latest/hot 分页+大图+
点赞+浏览,ramp 阶段)、upload-burst.js(M 并发上传全链含 complete 与
发布/同步可选轮询,兼作数据种子)、lib/helpers.js(登录/建册/上传全链
+内嵌 JPEG fixture 与 prod-smoke 同源)、README(运行方式/参数表/
P95 输出解读对齐计划 §6 候选指标;D05 未定→阈值占位注释)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-21 01:52:47 +08:00 |
|
浅念
|
a79fff5b9c
|
docs(deploy): runbook with smoke script and emergency channel
P5-prep Task 2(docs/plans/2026-09-21-P5-准备件.md):
- infra/deploy/RUNBOOK.md:发布前检查单(备份/水位快照(outbox_events
deliveredAt、sync_state appliedVersion)/镜像 tag/env diff/磁盘);发布步骤
(迁移先行 → ov 后 cn 逐容器替换 → 四点冒烟 → 观察);回滚步骤(镜像回旧
tag、迁移不回滚的向前兼容原则、outbox/inbox/水位账本硬性保留、冻结 sync
的故障处置);紧急停用通道(ov emergency HMAC 调用样例,openssl dgst 可
复制片段,签名公式与 internal-sync.ts 实现交叉验证一致);故障速查三类
(同步积压/计数差异/CDN 缓存与隐藏照片失效窗口)。
- scripts/prod-smoke.sh:四点冒烟(两地域 health → 登录 → 时间戳相册 + 内嵌
800x600 JPEG 真实 presign PUT → complete → cn/ov 公开读轮询 ≤60s),
PASS/FAIL 摘要 + 软删照片清理;--dry-run 打印调用序列、--skip-ov/--ov
跳过 ov 段、--wait-seconds 可调;仅依赖 bash+curl+openssl+base64。
验证:bash -n 通过;--dry-run / --skip-ov / 用法错误三路径本地实测输出正确
(含密码 JSON 转义);真实栈未起(无凭证,符合准备件边界),首次真实验证
点在 README-1Panel.md §7 演练步骤。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-21 01:40:04 +08:00 |
|
浅念
|
250d4355b9
|
build(deploy): production images, compose stacks and 1panel guide
P5-prep Task 1(docs/plans/2026-09-21-P5-准备件.md):
- docker/server.Dockerfile:单镜像 photo-live-server 多角色(api-cn/api-ov/
worker/sync/migrate-deploy/seed-admin,entrypoint.sh 分发;migrate-deploy
支持 cn|ov|all 区域参数)。三阶段:全量 install(锁文件冻结)→ prisma
generate 双库 + 逐包构建;--prod 依赖层;runtime=node:20-alpine+openssl/curl
+ 全局 prisma@5.22.0(对齐锁文件)+ 双库 client 镜像内重建(db-cn 落 pnpm
store .prisma、db-ov 落包内 generated/)。sharp 走 musl 预编译验证通过。
- docker/web.Dockerfile + infra/deploy/nginx.conf.template:photo-live-web
(nginx:alpine + envsubst 模板)。viewer(/,history 回退) + admin(/admin/,
hash 路由) + /v1 反代 API_UPSTREAM(含 /v1/realtime WS 升级)+
/assets/、/admin/assets/、/embed/v1/ immutable 长缓存(admin assets 的
alias 前缀剥除坑已实测修复)。VITE_* 为构建期参数(VIEWER_BASE/
EMBED_ORIGIN 随域名构建传入)。
- infra/deploy/docker-compose.cn.yml / -ov.yml:cn=api-cn+worker+sync+web,
ov=api-ov+web-ov(核实架构:sync 仅 cn 侧,inbox/emergency 内嵌 api-ov,
无 ov 侧 sync 进程);健康检查 /v1/health、unless-stopped、json-file
10m×3、外部 1panel-network 复用 1Panel MySQL/Redis、SERVER_IMAGE/
WEB_IMAGE 环境变量化镜像 tag(回滚杠杆)。
- .env.production.example-cn/-ov:生产变量全量清单(cn 25 键/ov 24 键,
DB/Redis/OSS/SYNC/AUTH/限速/域名分组注释,源自 services+packages
process.env 全量审计);.gitignore 放行 example,真实 .env.production-*
永不入库。
- infra/deploy/README-1Panel.md:镜像导入双路径(save tar 导入 / 仓库 pull)、
MySQL 建库授权 SQL(utf8mb4_0900_bin,<8.0.30 回退 utf8mb4_bin——D12)、
Redis 连接、1Panel 编排、OpenResty 反代+证书、migrate-deploy 一次性容器、
首次部署顺序(DB→迁移→ov 栈→cn 栈→seed→冒烟)。
- 根 package.json pnpm.onlyBuiltDependencies 增补 sharp/prisma/@prisma/
engines/@prisma/client(镜像构建所需 install 脚本白名单)。
本地验证:两镜像构建成功(server 988MB / web 97.7MB);compose config 校验
通过;server 镜像内逐服务 require(sharp/argon2/双 Prisma client/bullmq/
ioredis)与双引擎 so.node、migrate-deploy 角色、无 .env 泄漏均实测;web 镜像
容器实测路由(viewer 回退/admin 子路径/assets 与 embed immutable/WS 代理路径
502 语义)全通过。未起真实栈(无真实 DB,符合准备件边界)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-21 01:39:55 +08:00 |
|
浅念
|
3d6e9ce175
|
feat(ov): ov schema, entry skeleton and compose profile
P2 Task 2 ov 数据层:
- compose ov profile:mysql-ov(mysql:8.4,127.0.0.1:3309,库级
utf8mb4_0900_bin)+ redis-ov(6381),cn 侧默认 up 不受影响
(3307/3308 已被其它本机项目占用,端口决策 3309)
- @photo/db-ov:9 表 schema(albums_ov/photos_ov 副本、sync_inbox/
sync_state 同步账本(水位行同表标志位)、like_batches/album_stats/
visit_sessions/visit_requests 互动域、outbox_stat_events 回传队列);
迁移 20260918060102_init_ov 走固化校对手决流程,information_schema
复核全部业务表/列 utf8mb4_0900_bin(_prisma_migrations 同 cn 先例
保持 unicode_ci)
- generator 独立 output(包内 generated/):pnpm 将两包 @prisma/client
提升为同一 store 实例,默认 .prisma/client 输出会被双 schema 互相
覆盖,ov 客户端独立产出经 src/index.ts 转出口
- ov 入口骨架:main-ov.ts(PORT_OV 默认 8081)+ app-ov.module.ts
(仅管线骨架 + /v1/health,feature modules 后续任务装配);logger
装配选项抽取至 shared/logger-options.ts 供 cn/ov 双入口共用(行为
不变,P1 套件守护)
- test/reset-ov.ts:ov 库 truncate-if-exists 隔离工具(无 MinIO 清理)
- 根脚本:db:generate 双库齐跑,新增 db-ov:migrate/db-ov:generate/dev:ov
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-18 14:11:41 +08:00 |
|
浅念
|
47fb81ad31
|
chore(api): p1a final-review hygiene items
- contracts: add NOT_FOUND error code (framework-level 404 for unknown
routes); Error enum + regen committed
- api: 404 default mapping in AllExceptionsFilter now NOT_FOUND (was
ALBUM_NOT_FOUND); business 404s unchanged via explicit ApiException codes
- api: extract configureApp (prefix/CORS/x-powered-by) shared by main-cn
bootstrap and e2e; disable x-powered-by, asserted in e2e
- api: move parseCursor/parseLimit (+page-size bounds) from
albums.controller to shared/pagination; members/uploads/public re-pointed
- infra: bind compose published ports to 127.0.0.1 (mysql/redis/minio);
.env.example endpoints follow suit
- e2e: unknown-route 404 NOT_FOUND + x-powered-by absent cases added
(api e2e 120 -> 122)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-18 08:18:30 +08:00 |
|
浅念
|
538fdd46dd
|
chore(infra): cn-side mysql/redis/minio compose
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-17 16:46:40 +08:00 |
|