create-vibe-workflow 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +248 -57
  2. package/dist/adapters/next-only/skills.recommend.json +1 -0
  3. package/dist/adapters/node-api/skills.recommend.json +1 -0
  4. package/dist/cli.js +163 -5
  5. package/dist/cli.js.map +1 -1
  6. package/dist/generator.d.ts.map +1 -1
  7. package/dist/generator.js +255 -44
  8. package/dist/generator.js.map +1 -1
  9. package/dist/questions.d.ts +11 -1
  10. package/dist/questions.d.ts.map +1 -1
  11. package/dist/questions.js +103 -16
  12. package/dist/questions.js.map +1 -1
  13. package/dist/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  14. package/dist/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  15. package/dist/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  16. package/dist/templates/commands/gstack/cso.md.ejs +213 -0
  17. package/dist/templates/commands/gstack/office-hours.md.ejs +109 -0
  18. package/dist/templates/commands/gstack/review.md.ejs +192 -0
  19. package/dist/templates/commands/gstack/ship.md.ejs +256 -0
  20. package/dist/templates/commands/opsx/apply.md.ejs +106 -0
  21. package/dist/templates/commands/opsx/archive.md.ejs +88 -0
  22. package/dist/templates/commands/opsx/explore.md.ejs +84 -0
  23. package/dist/templates/commands/opsx/propose.md.ejs +185 -0
  24. package/dist/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  25. package/dist/templates/commands/superpowers/tdd.md.ejs +230 -0
  26. package/dist/templates/commands/superpowers/verify.md.ejs +211 -0
  27. package/dist/templates/commands/workflow/plan.md.ejs +219 -0
  28. package/dist/templates/hooks/check-deps.mjs +66 -65
  29. package/dist/templates/memory/.gitkeep +0 -0
  30. package/dist/templates/memory/MEMORY.md.ejs +88 -0
  31. package/dist/templates/memory/dev-notes.md.ejs +61 -0
  32. package/dist/templates/memory/troubleshooting.md.ejs +30 -0
  33. package/dist/templates/rules/agents.md +49 -49
  34. package/dist/templates/rules/coding-style.md +156 -117
  35. package/dist/templates/rules/development-workflow.md +103 -50
  36. package/dist/templates/rules/git-workflow.md +103 -47
  37. package/dist/templates/rules/hooks.md +159 -0
  38. package/dist/templates/rules/hooks.md.ejs +159 -0
  39. package/dist/templates/rules/memory.md +106 -0
  40. package/dist/templates/rules/memory.md.ejs +106 -0
  41. package/dist/templates/rules/patterns.md +117 -48
  42. package/dist/templates/rules/performance.md +108 -0
  43. package/dist/templates/rules/performance.md.ejs +108 -0
  44. package/dist/templates/rules/security.md +52 -37
  45. package/dist/templates/rules/testing.md +83 -30
  46. package/dist/templates/settings/settings.template.json +18 -2
  47. package/dist/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  48. package/dist/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  49. package/dist/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  50. package/dist/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  51. package/dist/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  52. package/dist/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  53. package/dist/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  54. package/dist/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  55. package/dist/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  56. package/dist/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  57. package/dist/templates/skills/skill-manifest.json +59 -0
  58. package/dist/templates/skills/skills-lock.template.json +12 -0
  59. package/dist/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  60. package/dist/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  61. package/dist/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  62. package/dist/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  63. package/dist/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  64. package/dist/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  65. package/dist/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
  66. package/dist/utils.d.ts +40 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +110 -0
  69. package/dist/utils.js.map +1 -0
  70. package/package.json +2 -2
  71. package/templates/claude-md/CLAUDE.zh-CN.md +51 -46
  72. package/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
  73. package/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
  74. package/templates/commands/gstack/cso.md.ejs +213 -0
  75. package/templates/commands/gstack/office-hours.md.ejs +109 -0
  76. package/templates/commands/gstack/review.md.ejs +192 -0
  77. package/templates/commands/gstack/ship.md.ejs +256 -0
  78. package/templates/commands/opsx/apply.md.ejs +106 -0
  79. package/templates/commands/opsx/archive.md.ejs +88 -0
  80. package/templates/commands/opsx/explore.md.ejs +84 -0
  81. package/templates/commands/opsx/propose.md.ejs +185 -0
  82. package/templates/commands/superpowers/brainstorm.md.ejs +240 -0
  83. package/templates/commands/superpowers/tdd.md.ejs +230 -0
  84. package/templates/commands/superpowers/verify.md.ejs +211 -0
  85. package/templates/commands/workflow/plan.md.ejs +219 -0
  86. package/templates/hooks/check-deps.mjs +66 -65
  87. package/templates/memory/.gitkeep +0 -0
  88. package/templates/memory/MEMORY.md.ejs +88 -0
  89. package/templates/memory/dev-notes.md.ejs +61 -0
  90. package/templates/memory/troubleshooting.md.ejs +30 -0
  91. package/templates/rules/agents.md +49 -49
  92. package/templates/rules/coding-style.md +156 -117
  93. package/templates/rules/development-workflow.md +103 -50
  94. package/templates/rules/git-workflow.md +103 -47
  95. package/templates/rules/hooks.md +159 -0
  96. package/templates/rules/memory.md +106 -0
  97. package/templates/rules/patterns.md +117 -48
  98. package/templates/rules/performance.md +108 -0
  99. package/templates/rules/security.md +52 -37
  100. package/templates/rules/testing.md +83 -30
  101. package/templates/settings/settings.template.json +18 -2
  102. package/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
  103. package/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
  104. package/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
  105. package/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
  106. package/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
  107. package/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
  108. package/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
  109. package/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
  110. package/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
  111. package/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
  112. package/templates/skills/skill-manifest.json +59 -0
  113. package/templates/skills/skills-lock.template.json +12 -0
  114. package/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
  115. package/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
  116. package/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
  117. package/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
  118. package/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
  119. package/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
  120. package/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
@@ -0,0 +1,235 @@
1
+ # PostgreSQL Patterns — PostgreSQL 数据库模式
2
+
3
+ > 使用此 skill 时:设计表结构、编写查询、优化数据库性能时。
4
+
5
+ ## 索引策略
6
+
7
+ ### 索引类型选择
8
+
9
+ ```text
10
+ B-Tree(默认):
11
+ 适用:等值查询、范围查询、排序
12
+ 不适用:全文搜索、数组包含
13
+
14
+ Hash:
15
+ 适用:等值查询(性能略高于 B-Tree)
16
+ 不适用:范围查询、排序
17
+ 注意:不记录大小,重建时需 REINDEX
18
+
19
+ GiST:
20
+ 适用:全文搜索、地理空间、范围重叠
21
+ 示例:tsvector、geometry、timerange
22
+
23
+ GIN:
24
+ 适用:包含查询(数组、JSONB、全文搜索)
25
+ 示例:JSONB 的 @> 操作符、数组的 @> 操作符
26
+
27
+ BRIN:
28
+ 适用:与物理存储顺序相关的大表(如时间序列)
29
+ 优点:索引体积极小
30
+ 注意:数据插入顺序须与索引列顺序接近
31
+ ```
32
+
33
+ ### 索引设计检查清单
34
+
35
+ ```text
36
+ 是否真正需要?
37
+ [ ] 这个查询是频繁执行的吗?
38
+ [ ] 表大到不用索引会慢吗?(<1000 行不需要)
39
+ [ ] 这个查询会随着数据增长变慢吗?
40
+
41
+ 索引列选择:
42
+ [ ] WHERE 子句中的列优先
43
+ [ ] JOIN 的关联列必须索引
44
+ [ ] ORDER BY 的列考虑包含在索引中
45
+ [ ] 高选择性的列优先(唯一值多)
46
+
47
+ 避免过度索引:
48
+ [ ] 不要为低频查询建索引
49
+ [ ] 不要重复索引(复合索引的前缀列不需要单独索引)
50
+ [ ] 写密集的表索引尽量少(每个索引增加写入开销)
51
+ [ ] 定期用 pg_stat_user_indexes 检查未使用索引
52
+
53
+ 复合索引:
54
+ [ ] = 条件的列放前面
55
+ [ ] 范围条件的列放后面
56
+ [ ] 查询条件中有多个 = 列时,任意顺序均可
57
+ [ ] 考虑 INCLUDE 列(覆盖索引)
58
+ ```
59
+
60
+ ## 数据类型选择
61
+
62
+ ```text
63
+ 【数值型】
64
+ 整数:
65
+ smallint (2B, ±32K) → 枚举/状态码
66
+ integer (4B, ±2B) → 默认选择
67
+ bigint (8B) → 自增 ID 超 2B 时
68
+
69
+ 小数:
70
+ numeric(p,s) → 精确计算(金额)
71
+ double precision → 科学计算(允许小误差)
72
+
73
+ 【文本型】
74
+ text → 没有长度限制,性能与 varchar 相同
75
+ varchar(n) → 有长度约束时(如邮箱限制 254 字符)
76
+ citext → 不区分大小写的文本(扩展)
77
+
78
+ 选择规则:默认用 text,需要约束长度时用 varchar(n)
79
+
80
+ 【时间型】
81
+ timestamptz → 首选(带时区,存储为 UTC)
82
+ timestamp → 不需要时区时
83
+ date → 只需要日期时
84
+ time → 只需要时间时
85
+ interval → 时间间隔
86
+
87
+ 【JSON vs JSONB】
88
+ json → 只存不查(保留原格式、键顺序)
89
+ jsonb → 需要查询/索引(二进制格式,去重键)
90
+
91
+ 总结:90% 场景用 jsonb,只有日志归档等只存不查场景用 json
92
+
93
+ 【数组】
94
+ 适用:标签、分类等有限集合
95
+ 注意:数组查询不能利用普通 B-Tree 索引(需 GIN)
96
+ ```
97
+
98
+ ## 查询优化
99
+
100
+ ### N+1 查询检测
101
+
102
+ ```text
103
+ 症状:一次查询后循环内执行 N 次查询
104
+
105
+ 识别:
106
+ - 日志中出现大量相似查询
107
+ - 翻页/列表接口慢
108
+
109
+ // ❌ N+1
110
+ for each user {
111
+ query("SELECT * FROM orders WHERE user_id = ?", user.id)
112
+ }
113
+
114
+ // ✅ 批量查询
115
+ userIds = users.map(u => u.id)
116
+ orders = query("SELECT * FROM orders WHERE user_id = ANY(?)", [userIds])
117
+ // 在应用层关联
118
+ ```
119
+
120
+ ### JOIN vs 子查询
121
+
122
+ ```text
123
+ 【优先 JOIN】
124
+ 适用:
125
+ - 需要返回父表和子表的列
126
+ - 关联表行数不多
127
+
128
+ 注意:
129
+ - JOIN 的表都应有索引
130
+ - 避免大表的 CROSS JOIN
131
+
132
+ 【子查询(EXISTS)】
133
+ 适用:
134
+ - 只需要检查是否存在
135
+ - 关联条件是聚合结果
136
+
137
+ 注意:
138
+ - EXISTS 找到第一条即停止,比 IN 快
139
+ - NOT EXISTS 比 NOT IN 安全(NOT IN 遇到 NULL 行为异常)
140
+
141
+ 总结:
142
+ 90% 的关联查询用 JOIN
143
+ 存在性检查用 EXISTS
144
+ 聚合子查询用 CTE 或 LATERAL JOIN
145
+ ```
146
+
147
+ ### 分页策略
148
+
149
+ ```text
150
+ 【OFFSET/LIMIT】— 简单但大偏移量慢
151
+ 适用:小数据集、前几页
152
+ 问题:OFFSET 越大越慢(需要扫描并丢弃前面的行)
153
+
154
+ 优化:用复合索引 + 覆盖索引减轻
155
+
156
+ 【游标分页(Keyset Pagination)】— 大数据集推荐
157
+ 适用:无限滚动、实时数据
158
+ 原理:用 WHERE 条件代替 OFFSET
159
+
160
+ SELECT * FROM users
161
+ WHERE createdAt < :lastCreatedAt OR (createdAt = :lastCreatedAt AND id < :lastId)
162
+ ORDER BY createdAt DESC, id DESC
163
+ LIMIT 20
164
+
165
+ 优点:无论翻到第几页,性能恒定
166
+ 缺点:不能直接跳转到特定页
167
+ ```
168
+
169
+ ### EXPLAIN 分析
170
+
171
+ ```text
172
+ EXPLAIN ANALYZE {query};
173
+
174
+ 关键指标:
175
+ - seq scan → 考虑加索引
176
+ - rows 估算偏差大 → 更新统计信息(ANALYZE)
177
+ - actual time 大 → 确认瓶颈
178
+
179
+ 常见问题:
180
+ - 类型不匹配导致隐式转换 → 索引失效
181
+ - OR 条件 → 考虑 UNION ALL
182
+ - IN 子句大量值 → 考虑临时表或 ANY
183
+ ```
184
+
185
+ ## 约束与数据完整性
186
+
187
+ ```text
188
+ NOT NULL — 默认用,除非真有理由允许 NULL
189
+ UNIQUE — 保证业务唯一性(用户名、邮箱)
190
+ CHECK — 业务规则(age > 0, status IN ('a','b','c'))
191
+ FOREIGN KEY — 引用完整性(注意:会加锁)
192
+ EXCLUDE — 排他约束(时间范围不重叠)
193
+
194
+ 注意:
195
+ - 外键约束创建和维护有开销
196
+ - 批量导入时可先禁用约束,导入后重建验证
197
+ - CHECK 约束比应用层验证更可靠
198
+ ```
199
+
200
+ ## Row-Level Security(RLS)
201
+
202
+ ```text
203
+ 适用:多租户隔离(每个用户只能看到自己的数据)
204
+
205
+ 实现:
206
+ 1. 启用行级安全:ALTER TABLE {table} ENABLE ROW LEVEL SECURITY
207
+ 2. 创建策略:允许/禁止特定操作
208
+
209
+ 示例:多租户隔离
210
+ CREATE POLICY tenant_isolation ON orders
211
+ USING (tenant_id = current_setting('app.tenant_id')::int)
212
+
213
+ 规则:
214
+ - RLS 应用层不可绕过
215
+ - 性能影响很小(查询只加一次过滤)
216
+ - 管理员应有一个绕过 RLS 的角色
217
+ ```
218
+
219
+ ## 连接池
220
+
221
+ ```text
222
+ 为什么需要连接池?
223
+ - 建立连接开销大(TCP + TLS + 认证)
224
+ - 数据库并发连接数有限
225
+
226
+ 配置要点:
227
+ - 池大小 = 2 × CPU 核心数 + 磁盘数(经验公式)
228
+ - 不是越大越好(过多连接→上下文切换→性能下降)
229
+ - 设置超时:连接超时、查询超时、闲置超时
230
+
231
+ 连接耗尽处理:
232
+ - 优先保证关键路径的连接
233
+ - 非关键操作降级(缓存结果 / 返回降级响应)
234
+ - 监控连接池使用率
235
+ ```
@@ -0,0 +1,228 @@
1
+ # Deployment Patterns — 部署模式
2
+
3
+ > 使用此 skill 时:设计部署流水线、选择部署策略、配置健康检查、管理回滚。
4
+
5
+ ## CI/CD 流水线
6
+
7
+ ### 标准流水线结构
8
+
9
+ ```text
10
+ ┌─ Code Push ─→ CI(构建+测试) ─→ CD(部署) ─→ 验证 ─→ 完成
11
+
12
+ 【CI 阶段(提交触发)】
13
+ 1. Lint + 类型检查
14
+ 2. 单元测试 + 集成测试
15
+ 3. 构建(编译、打包)
16
+ 4. 构建镜像(Docker build)
17
+ 5. 镜像扫描(安全漏洞)
18
+ 6. 推送镜像到仓库
19
+
20
+ 【CD 阶段(手动/自动触发)】
21
+ 1. 从镜像仓库拉取指定版本
22
+ 2. 部署到目标环境
23
+ 3. 运行健康检查
24
+ 4. 运行 Smoke Test
25
+ 5. 切换流量(如有负载均衡)
26
+ 6. 通知团队
27
+ ```
28
+
29
+ ### 环境管理
30
+
31
+ ```text
32
+ 开发(Development):
33
+ - 开发者自行部署
34
+ - 自动从 feature 分支部署
35
+ - 不稳定,用于快速迭代
36
+
37
+ 测试(Staging / QA):
38
+ - 合并到 main 后自动部署
39
+ - 运行全量测试套件
40
+ - 模拟生产环境配置
41
+
42
+ 生产(Production):
43
+ - 从 Staging 提升(promotion)
44
+ - 需要审批流程
45
+ - 蓝绿/灰度发布
46
+
47
+ 环境差异性管理:
48
+ build once, deploy many
49
+ 同一构建产物部署到所有环境
50
+ 通过环境变量区分配置
51
+ ```
52
+
53
+ ## 部署策略
54
+
55
+ ### 策略对比
56
+
57
+ | 策略 | 零停机 | 回滚速度 | 成本 | 适用场景 |
58
+ |------|--------|---------|------|---------|
59
+ | Rolling | 是 | 慢 | 低 | 标准 Web 服务 |
60
+ | Blue-Green | 是 | 极快 | 高(双倍资源) | 关键服务 |
61
+ | Canary | 是 | 中 | 中 | 高风险变更 |
62
+ | Recreate | 否 | N/A | 低 | 内部工具/定时任务 |
63
+
64
+ ### Rolling Update(滚动更新)
65
+
66
+ ```text
67
+ 过程:
68
+ 1. 启动新版本实例(逐台替换)
69
+ 2. 旧实例下线前完成请求处理
70
+ 3. 新实例通过健康检查后开始接收流量
71
+
72
+ 配置要点:
73
+ maxSurge: 1 # 最多超出目标实例数 1 个
74
+ maxUnavailable: 0 # 始终保持 100% 可用
75
+ minReadySeconds: 30 # 新实例就绪后等待 30 秒再继续
76
+
77
+ 适用场景:
78
+ - 无状态服务
79
+ - 多实例(≥3)
80
+ - 可以接受慢回滚
81
+ ```
82
+
83
+ ### Blue-Green Deployment(蓝绿部署)
84
+
85
+ ```text
86
+ 过程:
87
+ 1. Blue(当前生产环境)
88
+ 2. Green(新版本环境,独立部署)
89
+ 3. Green 验证通过后,切换负载均衡指向 Green
90
+ 4. Blue 保留以备回滚
91
+
92
+ 回滚:
93
+ - 负载均衡切回 Blue(秒级回滚)
94
+ - Blue 实例保持运行直到确认稳定
95
+
96
+ 资源要求:
97
+ - 双倍基础设施
98
+ - 数据库需前后兼容(两个版本同时读写)
99
+
100
+ 适用场景:
101
+ - 关键业务服务
102
+ - 需要即时回滚
103
+ - 可以承担双倍资源成本
104
+ ```
105
+
106
+ ### Canary Release(金丝雀发布)
107
+
108
+ ```text
109
+ 过程:
110
+ 1. 部署新版本到少量实例(如 5% 流量)
111
+ 2. 监控错误率、延迟、业务指标
112
+ 3. 稳定后逐步增加流量(10% → 25% → 50% → 100%)
113
+ 4. 异常时自动回滚
114
+
115
+ 流量路由方式:
116
+ - 负载均衡权重
117
+ - 基于用户群体(内部用户先使用)
118
+ - 基于地域
119
+
120
+ 适用场景:
121
+ - 高风险大版本更新
122
+ - 需要真实流量验证
123
+ - 有完善的监控体系
124
+ ```
125
+
126
+ ## 健康检查端点
127
+
128
+ ### 三级检查体系
129
+
130
+ ```text
131
+ 【就绪检查(Readiness)】
132
+ 端点:GET /health/ready
133
+ 目的:服务是否准备好接收流量
134
+ 检查:依赖服务可用(DB、缓存、队列连接正常)
135
+ 失败:从负载均衡移除,不停止容器
136
+
137
+ 【存活检查(Liveness)】
138
+ 端点:GET /health/live
139
+ 目的:服务是否正常运行
140
+ 检查:进程响应、无死锁
141
+ 失败:重启容器
142
+
143
+ 【启动检查(Startup)】
144
+ 端点:GET /health/startup
145
+ 目的:服务是否完成初始化
146
+ 检查:预热完成、数据加载完成
147
+ 失败:延长等待,不杀死进程
148
+
149
+ 实现建议:
150
+ /health 端点应:
151
+ - 返回 200 表示健康
152
+ - 返回 5xx 表示不健康
153
+ - 不包含敏感信息
154
+ - 快速响应(< 100ms)
155
+ - 不进行复杂计算
156
+ ```
157
+
158
+ ## 回滚策略
159
+
160
+ ```text
161
+ 【触发回滚的条件】
162
+ - 健康检查连续失败
163
+ - 错误率超过阈值(如 5xx > 1%)
164
+ - 延迟超过基准线 2 倍
165
+ - 业务指标异常(如转化率下降)
166
+ - 手动触发(线上事故)
167
+
168
+ 【回滚方式】
169
+ 快速回滚(秒级):
170
+ - 负载均衡切回旧版本(蓝绿部署)
171
+ - DNS 切换
172
+
173
+ 标准回滚(分级):
174
+ - 恢复到上一个稳定版本
175
+ - 数据库迁移需回滚
176
+
177
+ 重建回滚(分钟级):
178
+ - 从头部署旧版本
179
+ - 适用:非容器化部署
180
+
181
+ 【回滚后操作】
182
+ 1. 确认服务恢复
183
+ 2. 通知团队
184
+ 3. 分析事故原因
185
+ 4. 更新测试防止重现
186
+ ```
187
+
188
+ ## 环境变量与配置管理
189
+
190
+ ```text
191
+ 【配置分层】
192
+ 代码级 → 不随环境变化(默认值、常量)
193
+ 构建级 → 构建时注入(构建时间、Git commit)
194
+ 部署级(环境变量) → 环境差异(DB URL、API Key)
195
+ 运行时级 → 运行时获取(配置中心、Secrets Manager)
196
+
197
+ 【敏感配置】
198
+ 不使用环境变量(日志可能泄露)
199
+ 使用密钥管理服务(Vault、AWS Secrets Manager、GCP Secret Manager)
200
+ 或加密后提交,部署时解密
201
+
202
+ 【配置验证】
203
+ 启动时验证所有必需配置存在
204
+ 缺失时快速失败(fail fast)
205
+ 打印缺失的配置名(但不打印值)
206
+ ```
207
+
208
+ ## 监控与告警
209
+
210
+ ```text
211
+ 【必须监控的指标】
212
+ 可用性 — 健康检查成功率
213
+ 性能 — 请求延迟(P50/P95/P99)
214
+ 容量 — CPU/内存/磁盘/网络
215
+ 错误 — 错误率(4xx/5xx)
216
+ 业务 — 关键业务指标(注册数、订单数)
217
+
218
+ 【告警规则】
219
+ P0(紧急):服务不可用、数据丢失 → 即时通知
220
+ P1(高):延迟飙升、错误率突增 → 5 分钟内通知
221
+ P2(中):容量接近上限 → 24 小时内处理
222
+ P3(低):非关键警告 → 下一迭代处理
223
+
224
+ 【告警原则】
225
+ - 告警可行动(收到告警能采取具体操作)
226
+ - 避免告警疲劳(太少 ≠ 太多)
227
+ - 告警包含上下文(什么服务、什么指标、多久了)
228
+ ```
@@ -0,0 +1,215 @@
1
+ # Docker Patterns — Docker 容器化模式
2
+
3
+ > 使用此 skill 时:编写 Dockerfile、配置 Compose、优化镜像、排查容器问题。
4
+
5
+ ## 开发环境配置
6
+
7
+ ### Docker Compose 结构
8
+
9
+ ```text
10
+ compose.yaml
11
+ ├── services:
12
+ │ ├── app # 应用服务
13
+ │ ├── db # 数据库
14
+ │ ├── cache # 缓存(Redis / Memcached)
15
+ │ ├── queue # 消息队列
16
+ │ └── proxy # 反向代理(开发用)
17
+ ├── volumes: # 持久化数据
18
+ └── networks: # 网络隔离
19
+ ```
20
+
21
+ ### 开发环境要点
22
+
23
+ ```text
24
+ 【热重载】
25
+ - 挂载源码目录到容器内(volumes)
26
+ - 应用进程支持文件变化自动重启
27
+
28
+ 【环境变量】
29
+ - 用 .env 文件管理(不提交到 git)
30
+ - compose.yaml 引用 ${VARIABLE:-default}
31
+
32
+ 【端口映射】
33
+ - 只暴露需要的端口
34
+ - 避免端口冲突(映射到随机主机端口)
35
+
36
+ 示例卷挂载:
37
+ volumes:
38
+ - ./src:/app/src # 源码热重载
39
+ - /app/node_modules # 匿名卷(覆盖,防止覆盖容器内依赖)
40
+ ```
41
+
42
+ ## 多阶段构建
43
+
44
+ ### 通用模式
45
+
46
+ ```text
47
+ 【第一阶段:构建(Builder)】
48
+ FROM base AS builder
49
+ WORKDIR /app
50
+ COPY package.json ./
51
+ RUN install dependencies
52
+ COPY . .
53
+ RUN build
54
+
55
+ 【第二阶段:运行(Runtime)】
56
+ FROM runtime-base
57
+ WORKDIR /app
58
+ COPY --from=builder /app/dist ./dist
59
+ COPY --from=builder /app/node_modules ./node_modules
60
+ EXPOSE 3000
61
+ CMD ["run"]
62
+ ```
63
+
64
+ ### 优化技巧
65
+
66
+ ```text
67
+ 缓存利用:
68
+ 1. 先复制依赖配置文件(package.json / requirements.txt)
69
+ 2. 安装依赖(这一层会缓存,源码不变时不重跑)
70
+ 3. 再复制源码
71
+ 4. 最后构建
72
+
73
+ # 好 — 利用缓存
74
+ COPY package.json .
75
+ RUN npm install
76
+ COPY src/ .
77
+ RUN npm run build
78
+
79
+ # 坏 — 每次重装依赖
80
+ COPY . .
81
+ RUN npm install && npm run build
82
+
83
+ 减少层数:
84
+ - 合并 RUN 命令(&& 连接)
85
+ - 清理缓存文件(apt-get clean、npm cache clean --force)
86
+ - 多阶段构建只复制产物
87
+
88
+ 基础镜像选择:
89
+ alpine → 最小体积(但 musl libc 可能不兼容)
90
+ slim → Debian 精简版(推荐)
91
+ distroless → 最小攻击面(但调试困难)
92
+ 结论:首选 slim,需要最小体积用 distroless
93
+ ```
94
+
95
+ ## 安全最佳实践
96
+
97
+ ```text
98
+ 【不使用 root 用户运行】
99
+ RUN groupadd -r appuser && useradd -r -g appuser appuser
100
+ USER appuser
101
+
102
+ 【最小基础镜像】
103
+ - 越小的镜像 = 越小的攻击面
104
+ - 避免包含编译器、调试工具、包管理器
105
+
106
+ 【镜像漏洞扫描】
107
+ 定期扫描:trivy / docker scan / snyk
108
+ CI 中集成:漏洞阻断(CRITICAL/HIGH)
109
+
110
+ 【其他安全措施】
111
+ - 不将敏感信息写入镜像(构建参数 vs 环境变量)
112
+ - 使用 secrets 挂载(BuildKit: --secret)
113
+ - READ_ONLY 根文件系统(read_only: true)
114
+ - 限制容器能力(cap_drop: ALL)
115
+ - 不暴露 Docker socket(除非绝对必要)
116
+ ```
117
+
118
+ ## 日志管理
119
+
120
+ ```text
121
+ 【原则】
122
+ 应用 → stdout/stderr → Docker 收集 → 日志驱动 → 集中管理
123
+
124
+ 12-Factor App:
125
+ 应用将日志写入 stdout/stderr
126
+ Docker 负责收集和路由
127
+
128
+ 生产环境日志驱动(compose.yaml):
129
+ logging:
130
+ driver: "json-file"
131
+ options:
132
+ max-size: "10m"
133
+ max-file: "3"
134
+
135
+ 集中日志方案:
136
+ - 文件日志驱动 + Filebeat → Elasticsearch
137
+ - syslog 驱动 → 集中日志服务器
138
+ - awslogs / gcp 驱动 → 云平台日志服务
139
+ ```
140
+
141
+ ## 常见服务模板
142
+
143
+ ### PostgreSQL
144
+
145
+ ```text
146
+ db:
147
+ image: postgres:16-alpine
148
+ environment:
149
+ POSTGRES_DB: ${DB_NAME}
150
+ POSTGRES_USER: ${DB_USER}
151
+ POSTGRES_PASSWORD: ${DB_PASSWORD}
152
+ volumes:
153
+ - pgdata:/var/lib/postgresql/data
154
+ - ./init-db:/docker-entrypoint-initdb.d # 初始化脚本
155
+ healthcheck:
156
+ test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
157
+ interval: 5s
158
+ timeout: 5s
159
+ retries: 5
160
+ ```
161
+
162
+ ### Redis
163
+
164
+ ```text
165
+ cache:
166
+ image: redis:7-alpine
167
+ command: redis-server --requirepass ${REDIS_PASSWORD}
168
+ volumes:
169
+ - redis-data:/data
170
+ healthcheck:
171
+ test: ["CMD", "redis-cli", "ping"]
172
+ interval: 5s
173
+ timeout: 3s
174
+ retries: 5
175
+ ```
176
+
177
+ ### Nginx(反向代理)
178
+
179
+ ```text
180
+ proxy:
181
+ image: nginx:alpine
182
+ volumes:
183
+ - ./nginx.conf:/etc/nginx/nginx.conf:ro
184
+ - ./public:/var/www/public:ro
185
+ ports:
186
+ - "80:80"
187
+ - "443:443"
188
+ depends_on:
189
+ - app
190
+ ```
191
+
192
+ ## Docker 排查命令
193
+
194
+ ```text
195
+ 查看日志:
196
+ docker logs {container} # 标准日志
197
+ docker logs -f {container} # 实时追踪
198
+ docker logs --tail 100 {container} # 只看最后 100 行
199
+
200
+ 检查进程:
201
+ docker exec {container} ps aux # 运行了什么进程
202
+ docker top {container} # Docker 封装的 top
203
+
204
+ 进入容器调试:
205
+ docker exec -it {container} sh # 进入容器(alpine)
206
+ docker exec -it {container} bash # 进入容器(debian)
207
+
208
+ 资源监控:
209
+ docker stats {container} # CPU/内存/网络
210
+ docker inspect {container} | jq '.[0].State' # 容器状态
211
+
212
+ 构建调试:
213
+ docker build --no-cache . # 无缓存构建
214
+ docker build --progress=plain . # 详细构建输出
215
+ ```