shipfe 1.1.1 → 1.1.3

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 (170) hide show
  1. package/bin/shipfe +0 -0
  2. package/package.json +5 -1
  3. package/.github/workflows/deploy.yml +0 -46
  4. package/.github/workflows/release.yml +0 -51
  5. package/.vscode/settings.json +0 -5
  6. package/README_CN.md +0 -41
  7. package/docs/.vitepress/cache/deps/@theme_index.js +0 -275
  8. package/docs/.vitepress/cache/deps/@theme_index.js.map +0 -7
  9. package/docs/.vitepress/cache/deps/_metadata.json +0 -40
  10. package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js +0 -9719
  11. package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js.map +0 -7
  12. package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js +0 -12877
  13. package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js.map +0 -7
  14. package/docs/.vitepress/cache/deps/package.json +0 -3
  15. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4505
  16. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
  17. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -583
  18. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
  19. package/docs/.vitepress/cache/deps/vue.js +0 -347
  20. package/docs/.vitepress/cache/deps/vue.js.map +0 -7
  21. package/docs/.vitepress/config.ts +0 -120
  22. package/docs/.vitepress/dist/404.html +0 -22
  23. package/docs/.vitepress/dist/assets/app.DZUgfPE2.js +0 -1
  24. package/docs/.vitepress/dist/assets/chunks/framework.BeaujayP.js +0 -19
  25. package/docs/.vitepress/dist/assets/chunks/theme.CNyaCki0.js +0 -1
  26. package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.js +0 -17
  27. package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.lean.js +0 -1
  28. package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.js +0 -2
  29. package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.lean.js +0 -1
  30. package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.js +0 -7
  31. package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.lean.js +0 -1
  32. package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.js +0 -56
  33. package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.lean.js +0 -1
  34. package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.js +0 -34
  35. package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.lean.js +0 -1
  36. package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.js +0 -1
  37. package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.lean.js +0 -1
  38. package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.js +0 -26
  39. package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.lean.js +0 -1
  40. package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.js +0 -22
  41. package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.lean.js +0 -1
  42. package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.js +0 -20
  43. package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.lean.js +0 -1
  44. package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.js +0 -26
  45. package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.lean.js +0 -1
  46. package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.js +0 -24
  47. package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.lean.js +0 -1
  48. package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.js +0 -1
  49. package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.lean.js +0 -1
  50. package/docs/.vitepress/dist/assets/install.md.CblrJsha.js +0 -1
  51. package/docs/.vitepress/dist/assets/install.md.CblrJsha.lean.js +0 -1
  52. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  53. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  54. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  55. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  56. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  57. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  58. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  59. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  60. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  61. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  62. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  63. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  64. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  65. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  66. package/docs/.vitepress/dist/assets/license.md.hVRT8__d.js +0 -1
  67. package/docs/.vitepress/dist/assets/license.md.hVRT8__d.lean.js +0 -1
  68. package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.js +0 -23
  69. package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.lean.js +0 -1
  70. package/docs/.vitepress/dist/assets/style.DES0mfMn.css +0 -1
  71. package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.js +0 -1
  72. package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.lean.js +0 -1
  73. package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.js +0 -9
  74. package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.lean.js +0 -1
  75. package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.js +0 -18
  76. package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.lean.js +0 -1
  77. package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.js +0 -6
  78. package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.lean.js +0 -1
  79. package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.js +0 -44
  80. package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.lean.js +0 -1
  81. package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.js +0 -45
  82. package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.lean.js +0 -1
  83. package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.js +0 -67
  84. package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.lean.js +0 -1
  85. package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.js +0 -167
  86. package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.lean.js +0 -1
  87. package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.js +0 -42
  88. package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.lean.js +0 -1
  89. package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.js +0 -50
  90. package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.lean.js +0 -1
  91. package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.js +0 -26
  92. package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.lean.js +0 -1
  93. package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.js +0 -39
  94. package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.lean.js +0 -1
  95. package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.js +0 -1
  96. package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.lean.js +0 -1
  97. package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.js +0 -41
  98. package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.lean.js +0 -1
  99. package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.js +0 -1
  100. package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.lean.js +0 -1
  101. package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.js +0 -19
  102. package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.lean.js +0 -1
  103. package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.js +0 -1
  104. package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.lean.js +0 -1
  105. package/docs/.vitepress/dist/commands/deploy.html +0 -41
  106. package/docs/.vitepress/dist/commands/init.html +0 -26
  107. package/docs/.vitepress/dist/commands/rollback.html +0 -31
  108. package/docs/.vitepress/dist/config/auth.html +0 -80
  109. package/docs/.vitepress/dist/config/overview.html +0 -58
  110. package/docs/.vitepress/dist/config/schema.html +0 -25
  111. package/docs/.vitepress/dist/config/sub-env.html +0 -50
  112. package/docs/.vitepress/dist/features/atomic.html +0 -46
  113. package/docs/.vitepress/dist/features/cleanup.html +0 -44
  114. package/docs/.vitepress/dist/features/shared-assets.html +0 -50
  115. package/docs/.vitepress/dist/features/snapshot.html +0 -48
  116. package/docs/.vitepress/dist/hashmap.json +0 -1
  117. package/docs/.vitepress/dist/index.html +0 -25
  118. package/docs/.vitepress/dist/install.html +0 -25
  119. package/docs/.vitepress/dist/license.html +0 -25
  120. package/docs/.vitepress/dist/quick-start.html +0 -47
  121. package/docs/.vitepress/dist/troubleshooting.html +0 -25
  122. package/docs/.vitepress/dist/vp-icons.css +0 -0
  123. package/docs/.vitepress/dist/zh/commands/deploy.html +0 -33
  124. package/docs/.vitepress/dist/zh/commands/init.html +0 -42
  125. package/docs/.vitepress/dist/zh/commands/rollback.html +0 -30
  126. package/docs/.vitepress/dist/zh/config/auth.html +0 -68
  127. package/docs/.vitepress/dist/zh/config/overview.html +0 -69
  128. package/docs/.vitepress/dist/zh/config/schema.html +0 -91
  129. package/docs/.vitepress/dist/zh/config/sub-env.html +0 -191
  130. package/docs/.vitepress/dist/zh/features/atomic.html +0 -66
  131. package/docs/.vitepress/dist/zh/features/cleanup.html +0 -74
  132. package/docs/.vitepress/dist/zh/features/shared-assets.html +0 -50
  133. package/docs/.vitepress/dist/zh/features/snapshot.html +0 -63
  134. package/docs/.vitepress/dist/zh/index.html +0 -25
  135. package/docs/.vitepress/dist/zh/install.html +0 -65
  136. package/docs/.vitepress/dist/zh/license.html +0 -25
  137. package/docs/.vitepress/dist/zh/quick-start.html +0 -43
  138. package/docs/.vitepress/dist/zh/troubleshooting.html +0 -25
  139. package/docs/commands/deploy.md +0 -46
  140. package/docs/commands/init.md +0 -27
  141. package/docs/commands/rollback.md +0 -45
  142. package/docs/config/auth.md +0 -112
  143. package/docs/config/overview.md +0 -63
  144. package/docs/config/schema.md +0 -52
  145. package/docs/config/sub-env.md +0 -62
  146. package/docs/features/atomic.md +0 -67
  147. package/docs/features/cleanup.md +0 -80
  148. package/docs/features/shared-assets.md +0 -72
  149. package/docs/features/snapshot.md +0 -58
  150. package/docs/index.md +0 -48
  151. package/docs/install.md +0 -21
  152. package/docs/license.md +0 -23
  153. package/docs/quick-start.md +0 -98
  154. package/docs/troubleshooting.md +0 -88
  155. package/docs/zh/commands/deploy.md +0 -127
  156. package/docs/zh/commands/init.md +0 -76
  157. package/docs/zh/commands/rollback.md +0 -115
  158. package/docs/zh/config/auth.md +0 -195
  159. package/docs/zh/config/overview.md +0 -153
  160. package/docs/zh/config/schema.md +0 -253
  161. package/docs/zh/config/sub-env.md +0 -293
  162. package/docs/zh/features/atomic.md +0 -249
  163. package/docs/zh/features/cleanup.md +0 -241
  164. package/docs/zh/features/shared-assets.md +0 -72
  165. package/docs/zh/features/snapshot.md +0 -186
  166. package/docs/zh/index.md +0 -65
  167. package/docs/zh/install.md +0 -160
  168. package/docs/zh/license.md +0 -23
  169. package/docs/zh/quick-start.md +0 -109
  170. package/docs/zh/troubleshooting.md +0 -88
@@ -1,249 +0,0 @@
1
- # 原子部署
2
-
3
- Shipfe 的核心特性:零停机、原子化的部署流程。
4
-
5
- ## 什么是原子部署
6
-
7
- 原子部署意味着部署要么完全成功,要么完全失败,没有中间状态。这确保了应用在部署过程中的稳定性。
8
-
9
- ## 部署流程
10
-
11
- ### 传统部署 vs 原子部署
12
-
13
- **传统部署**:
14
- ```
15
- 上传文件 → 覆盖现有文件 → 重启服务
16
- ❌ 如果上传中断,应用可能处于损坏状态
17
- ```
18
-
19
- **原子部署**:
20
- ```
21
- 创建新目录 → 上传到新目录 → 原子切换符号链接 → 清理旧版本
22
- ✅ 始终有一个可用的版本
23
- ```
24
-
25
- ## 详细流程
26
-
27
- ### 1. 准备阶段
28
-
29
- Shipfe 创建一个时间戳命名的发布目录:
30
-
31
- ```
32
- releases/
33
- └── 20260304_120000/ # 新发布目录
34
- ```
35
-
36
- ### 2. 上传阶段
37
-
38
- 所有文件上传到新目录:
39
-
40
- ```bash
41
- # 上传构建产物
42
- scp -r ./dist/* user@server:/var/www/myapp/releases/20260304_120000/
43
- ```
44
-
45
- ### 3. 验证阶段
46
-
47
- 验证上传的文件完整性:
48
-
49
- - 检查文件大小
50
- - 验证文件权限
51
- - 运行健康检查(如果配置)
52
-
53
- ### 4. 切换阶段
54
-
55
- 原子化切换当前版本:
56
-
57
- ```bash
58
- # 在服务器上执行
59
- ln -sfn releases/20260304_120000 current
60
- ```
61
-
62
- 这个操作是原子的,瞬间完成。
63
-
64
- ### 5. 清理阶段
65
-
66
- 清理旧版本(根据配置):
67
-
68
- ```bash
69
- # 删除超出限制的旧版本
70
- rm -rf releases/20260303_100000/
71
- ```
72
-
73
- ## 零停机保证
74
-
75
- ### 符号链接切换
76
-
77
- 使用符号链接而不是直接覆盖文件:
78
-
79
- ```
80
- current -> releases/20260304_120000 # 新版本
81
- current -> releases/20260304_110000 # 旧版本(仍然可用)
82
- ```
83
-
84
- ### 回滚能力
85
-
86
- 如果新版本有问题,可以立即回滚:
87
-
88
- ```bash
89
- # 切换回旧版本
90
- ln -sfn releases/20260304_110000 current
91
- ```
92
-
93
- ### 无缝切换
94
-
95
- - Web服务器继续服务旧版本
96
- - 用户不会察觉到切换过程
97
- - 新请求自动路由到新版本
98
-
99
- ## 错误处理
100
-
101
- ### 部署失败
102
-
103
- 如果在任何阶段失败:
104
-
105
- 1. **清理失败的发布目录**
106
- 2. **保持当前版本不变**
107
- 3. **记录详细错误信息**
108
- 4. **应用继续正常运行**
109
-
110
- ### 部分上传
111
-
112
- 如果文件上传中断:
113
-
114
- - 未完成的发布目录被删除
115
- - 当前版本不受影响
116
- - 可以重新开始部署
117
-
118
- ## 性能优势
119
-
120
- ### 增量部署
121
-
122
- 只上传变更的文件:
123
-
124
- - **首次部署**:上传所有文件
125
- - **后续部署**:只上传变更的文件
126
- - **大幅减少**:网络传输时间
127
-
128
- ### 并行处理
129
-
130
- 支持并行文件上传:
131
-
132
- - 多个文件同时传输
133
- - 充分利用带宽
134
- - 减少部署时间
135
-
136
- ## 目录结构
137
-
138
- 完整的部署目录结构:
139
-
140
- ```
141
- remote_deploy_path/
142
- ├── current -> releases/20260304_120000 # 当前活动版本
143
- ├── releases/ # 所有历史版本
144
- │ ├── 20260304_120000/ # 最新版本
145
- │ │ ├── index.html
146
- │ │ ├── app.js
147
- │ │ └── styles.css
148
- │ ├── 20260304_110000/ # 上一版本
149
- │ └── 20260304_100000/ # 更早版本
150
- └── shared/ # 共享资源(可选)
151
- └── assets/
152
- ```
153
-
154
- ## 配置选项
155
-
156
- ### 保留版本数量
157
-
158
- ```json
159
- {
160
- "keep_releases": 5
161
- }
162
- ```
163
-
164
- 控制保留的历史版本数量。
165
-
166
- ### 清理策略
167
-
168
- ```json
169
- {
170
- "delete_old": false // 保留多个版本
171
- }
172
- ```
173
-
174
-
175
-
176
- ```json
177
- {
178
- "delete_old": true // 只保留最新版本
179
- }
180
- ```
181
-
182
- ## 监控和日志
183
-
184
- ### 部署日志
185
-
186
- 每次部署都会记录详细日志:
187
-
188
- ```
189
- 2026-03-04 12:00:00 INFO Starting deployment
190
- 2026-03-04 12:00:01 INFO Created release directory: releases/20260304_120000
191
- 2026-03-04 12:00:05 INFO Uploaded 150 files (45.2 MB)
192
- 2026-03-04 12:00:06 INFO Switched to new release
193
- 2026-03-04 12:00:07 INFO Deployment completed successfully
194
- ```
195
-
196
- ### 健康检查
197
-
198
- 配置部署后的健康检查:
199
-
200
- ```json
201
- {
202
- "post_deploy_commands": [
203
- "curl -f http://localhost/health || exit 1"
204
- ]
205
- }
206
- ```
207
-
208
- ## 最佳实践
209
-
210
- 1. **测试部署**:先在测试环境验证
211
- 2. **监控日志**:实时监控部署日志
212
- 3. **备份策略**:保留足够的历史版本
213
- 4. **回滚计划**:准备好回滚方案
214
- 5. **性能监控**:监控部署时间和资源使用
215
-
216
- ## 故障排除
217
-
218
- ### 切换失败
219
-
220
- 如果符号链接切换失败:
221
-
222
- - 检查文件系统权限
223
- - 验证当前目录存在
224
- - 确认没有进程锁定文件
225
-
226
- ### 权限问题
227
-
228
- 确保部署用户有足够权限:
229
-
230
- ```bash
231
- # 检查目录权限
232
- ls -la /var/www/myapp/
233
-
234
- # 修复权限
235
- chown -R deploy:deploy /var/www/myapp/
236
- chmod -R 755 /var/www/myapp/
237
- ```
238
-
239
- ### 磁盘空间
240
-
241
- 监控磁盘使用情况:
242
-
243
- ```bash
244
- # 检查磁盘空间
245
- df -h /var/www/myapp/
246
-
247
- # 清理旧版本
248
- shipfe deploy # 会自动清理
249
- ```
@@ -1,241 +0,0 @@
1
- # 自动清理
2
-
3
- Shipfe 提供可配置的自动清理旧发布和未使用共享资源功能。
4
-
5
- ## 配置选项
6
-
7
- ### `keep_releases`(推荐)
8
-
9
- ```json
10
- {
11
- "keep_releases": 5,
12
- "delete_old": false
13
- }
14
- ```
15
-
16
- - 保留最近的 5 个发布
17
- - 自动删除旧发布
18
- - 与共享资源清理配合工作
19
-
20
- ### `delete_old`(传统)
21
-
22
- ```json
23
- {
24
- "delete_old": true
25
- }
26
- ```
27
-
28
- - 在每次部署后删除所有旧发布
29
- - 只保留当前部署
30
- - 覆盖 `keep_releases` 设置
31
-
32
- ## 清理过程
33
-
34
- ### 发布清理
35
-
36
- 1. 按修改时间排序发布(最新优先)
37
- 2. 保留指定数量的最近发布
38
- 3. 完全删除旧发布目录
39
-
40
- ### 共享资源清理(当 `enable_shared: true` 时)
41
-
42
- 1. 扫描所有剩余发布快照
43
- 2. 收集当前被引用的所有哈希资源
44
- 3. 从 `shared/assets/` 删除未引用的文件
45
-
46
- ## 清理行为示例
47
-
48
- ### 清理前(7 个发布)
49
-
50
- ```
51
- releases/
52
- ├── 20260301_100000/ (最旧)
53
- ├── 20260302_100000/
54
- ├── 20260303_100000/
55
- ├── 20260304_100000/
56
- ├── 20260305_100000/
57
- ├── 20260306_100000/
58
- └── 20260307_100000/ (最新,当前)
59
- ```
60
-
61
- ### 清理后(`keep_releases: 3`)
62
-
63
- ```
64
- releases/
65
- ├── 20260305_100000/ (保留)
66
- ├── 20260306_100000/ (保留)
67
- └── 20260307_100000/ (保留,当前)
68
- ```
69
-
70
- *旧发布自动删除*
71
-
72
- ## 监控清理
73
-
74
- ```bash
75
- # 检查当前发布
76
- ls -la releases/
77
-
78
- # 在 shipfe.log 中查看清理日志
79
- tail -f shipfe.log | grep -i "cleanup\|remove"
80
- ```
81
-
82
- ## 手动清理
83
-
84
- ### 强制清理
85
-
86
- ```bash
87
- # 重新部署会触发清理
88
- shipfe deploy
89
- ```
90
-
91
- ### 自定义清理脚本
92
-
93
- ```bash
94
- #!/bin/bash
95
- # 自定义清理脚本示例
96
-
97
- DEPLOY_PATH="/var/www/myapp"
98
- KEEP_RELEASES=5
99
-
100
- # 进入发布目录
101
- cd "$DEPLOY_PATH/releases"
102
-
103
- # 获取要删除的旧发布
104
- OLD_RELEASES=$(ls -t | tail -n +$((KEEP_RELEASES + 1)))
105
-
106
- # 删除旧发布
107
- for release in $OLD_RELEASES; do
108
- echo "Removing old release: $release"
109
- rm -rf "$release"
110
- done
111
- ```
112
-
113
- ## 清理策略选择
114
-
115
- ### 滚动发布策略
116
-
117
- ```json
118
- {
119
- "keep_releases": 5,
120
- "delete_old": false
121
- }
122
- ```
123
-
124
- **适用场景**:
125
- - 需要频繁回滚
126
- - 存储空间充足
127
- - 重视部署历史
128
-
129
- ### 最小化策略
130
-
131
- ```json
132
- {
133
- "delete_old": true
134
- }
135
- ```
136
-
137
- **适用场景**:
138
- - 存储空间有限
139
- - 部署频繁
140
- - 不需要历史版本
141
-
142
- ## 共享资源清理
143
-
144
- 当启用共享资源时,清理过程更复杂:
145
-
146
- 1. **扫描快照**:检查所有保留发布的快照文件
147
- 2. **收集引用**:汇总所有仍在使用的共享资源哈希
148
- 3. **安全删除**:只删除完全未引用的共享文件
149
-
150
- ### 示例清理过程
151
-
152
- ```
153
- 保留发布:v1, v2, v3
154
- v1 使用的共享资源:a.js, b.css
155
- v2 使用的共享资源:a.js, c.png
156
- v3 使用的共享资源:b.css, d.svg
157
-
158
- 仍在使用的资源:a.js, b.css, c.png, d.svg
159
- 可删除的资源:(无)
160
-
161
- 结果:所有共享资源都被保留
162
- ```
163
-
164
- ## 性能影响
165
-
166
- ### 磁盘I/O
167
-
168
- - 清理操作主要涉及文件删除
169
- - 对运行中的应用无影响
170
- - 可以在低峰期执行
171
-
172
- ### 存储优化
173
-
174
- - 自动释放磁盘空间
175
- - 防止日志和临时文件积累
176
- - 维持健康的存储使用率
177
-
178
- ## 安全考虑
179
-
180
- ### 数据保护
181
-
182
- - 清理前验证快照完整性
183
- - 只删除确认未使用的文件
184
- - 保留最近的多个版本作为安全网
185
-
186
- ### 权限检查
187
-
188
- - 验证删除权限
189
- - 避免删除系统文件
190
- - 记录所有清理操作
191
-
192
- ## 故障排除
193
-
194
- ### 清理失败
195
-
196
- ```
197
- Warning: Failed to remove old release
198
- ```
199
-
200
- **可能原因**:
201
- - 文件被进程锁定
202
- - 权限不足
203
- - 文件系统问题
204
-
205
- **解决方案**:
206
- - 检查文件锁定:`lsof +D /path/to/release`
207
- - 修复权限:`chmod -R 755 /var/www/myapp`
208
- - 手动清理:`rm -rf /path/to/old/release`
209
-
210
- ### 共享资源清理问题
211
-
212
- ```
213
- Warning: Failed to cleanup shared assets
214
- ```
215
-
216
- **可能原因**:
217
- - 快照文件损坏
218
- - 硬链接引用错误
219
- - 权限问题
220
-
221
- **解决方案**:
222
- - 验证快照文件
223
- - 检查硬链接:`ls -la shared/assets/`
224
- - 重新生成共享资源
225
-
226
- ### 磁盘空间不足
227
-
228
- 如果清理无法释放足够空间:
229
-
230
- - 检查大文件:`du -sh releases/*`
231
- - 手动删除旧版本
232
- - 增加 `keep_releases` 的值
233
- - 考虑迁移到更大磁盘
234
-
235
- ## 最佳实践
236
-
237
- 1. **监控存储使用**:定期检查磁盘使用情况
238
- 2. **设置合理保留数量**:根据部署频率调整 `keep_releases`
239
- 3. **备份重要版本**:对关键版本进行额外备份
240
- 4. **日志监控**:监控清理操作的日志
241
- 5. **定期审核**:检查清理策略是否仍然合适
@@ -1,72 +0,0 @@
1
- # 共享资源管理
2
-
3
- 共享资源通过文件哈希去重减少磁盘使用和网络传输。
4
-
5
- ## 启用共享资源
6
-
7
- ```json
8
- {
9
- "enable_shared": true,
10
- "hashed_asset_patterns": [
11
- "**/*.js",
12
- "**/*.css",
13
- "**/*.png",
14
- "**/*.jpg",
15
- "**/*.svg",
16
- "**/*.woff2"
17
- ]
18
- }
19
- ```
20
-
21
- ## 工作原理
22
-
23
- 1. **文件匹配**:根据 `hashed_asset_patterns` 匹配文件
24
- 2. **哈希计算**:对匹配文件计算 SHA256 哈希值
25
- 3. **存储策略**:
26
- - 相同哈希的文件只存储一次在 `shared/assets/` 目录
27
- - 文件名格式为 `{hash}.{ext}`,如 `abc123def456.js`
28
- 4. **链接创建**:在发布目录中创建硬链接指向共享文件
29
- 5. **清理机制**:删除不再被任何发布引用的共享文件
30
-
31
- ## 共享资源重置
32
-
33
- 在每次部署开始时,Shipfe 会自动清除 `shared/` 目录下的所有现有资源,然后重新创建 `shared/assets/` 目录。这确保了每次部署从干净的状态开始,避免了旧资源的积累和潜在冲突。
34
-
35
- ## 目录结构示例
36
-
37
- ```
38
- remote_deploy_path/
39
- ├── shared/
40
- │ └── assets/
41
- │ ├── abc123def456.js
42
- │ ├── def789ghi012.css
43
- │ └── hij345klm678.png
44
- ├── releases/
45
- │ ├── 20260304_120000/
46
- │ │ ├── index.html
47
- │ │ ├── app.js -> ../../shared/assets/abc123def456.js
48
- │ │ └── styles.css -> ../../shared/assets/def789ghi012.css
49
- │ └── 20260304_120100/
50
- │ ├── index.html
51
- │ ├── app.js -> ../../shared/assets/abc123def456.js
52
- │ └── styles.css -> ../../shared/assets/def789ghi012.css
53
- └── current -> releases/20260304_120100
54
- ```
55
-
56
- ## 优势
57
-
58
- - **减少磁盘使用**:相同文件只存储一次
59
- - **加快部署**:未更改的文件不需要重新上传
60
- - **节省带宽**:只传输新的或更改的文件
61
- - **原子更新**:所有硬链接同时创建,确保一致性
62
-
63
- ## 注意事项
64
-
65
- - 共享资源需要服务器文件系统支持硬链接
66
- - 首次启用共享时,所有匹配文件都会被哈希处理
67
- - 禁用共享后,已有的共享文件不会被删除,需要手动清理
68
-
69
- ## 适用场景
70
-
71
- - **启用共享**:大型应用,频繁部署,有很多静态资源
72
- - **禁用共享**:小型应用,部署不频繁,或需要简单调试