shipfe 1.1.0 → 1.1.1

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/.github/workflows/deploy.yml +46 -0
  2. package/.github/workflows/release.yml +51 -0
  3. package/README.md +13 -686
  4. package/README_CN.md +6 -656
  5. package/bin/shipfe +0 -0
  6. package/docs/.vitepress/cache/deps/@theme_index.js +275 -0
  7. package/docs/.vitepress/cache/deps/@theme_index.js.map +7 -0
  8. package/docs/.vitepress/cache/deps/_metadata.json +40 -0
  9. package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js +9719 -0
  10. package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js.map +7 -0
  11. package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js +12877 -0
  12. package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js.map +7 -0
  13. package/docs/.vitepress/cache/deps/package.json +3 -0
  14. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  15. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  16. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  17. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  18. package/docs/.vitepress/cache/deps/vue.js +347 -0
  19. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  20. package/docs/.vitepress/config.ts +120 -0
  21. package/docs/.vitepress/dist/404.html +22 -0
  22. package/docs/.vitepress/dist/assets/app.DZUgfPE2.js +1 -0
  23. package/docs/.vitepress/dist/assets/chunks/framework.BeaujayP.js +19 -0
  24. package/docs/.vitepress/dist/assets/chunks/theme.CNyaCki0.js +1 -0
  25. package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.js +17 -0
  26. package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.lean.js +1 -0
  27. package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.js +2 -0
  28. package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.lean.js +1 -0
  29. package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.js +7 -0
  30. package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.lean.js +1 -0
  31. package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.js +56 -0
  32. package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.lean.js +1 -0
  33. package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.js +34 -0
  34. package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.lean.js +1 -0
  35. package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.js +1 -0
  36. package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.lean.js +1 -0
  37. package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.js +26 -0
  38. package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.lean.js +1 -0
  39. package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.js +22 -0
  40. package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.lean.js +1 -0
  41. package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.js +20 -0
  42. package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.lean.js +1 -0
  43. package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.js +26 -0
  44. package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.lean.js +1 -0
  45. package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.js +24 -0
  46. package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.lean.js +1 -0
  47. package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.js +1 -0
  48. package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.lean.js +1 -0
  49. package/docs/.vitepress/dist/assets/install.md.CblrJsha.js +1 -0
  50. package/docs/.vitepress/dist/assets/install.md.CblrJsha.lean.js +1 -0
  51. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  52. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  53. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  54. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  55. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  56. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  57. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  58. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  59. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  60. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  61. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  62. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  63. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  64. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  65. package/docs/.vitepress/dist/assets/license.md.hVRT8__d.js +1 -0
  66. package/docs/.vitepress/dist/assets/license.md.hVRT8__d.lean.js +1 -0
  67. package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.js +23 -0
  68. package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.lean.js +1 -0
  69. package/docs/.vitepress/dist/assets/style.DES0mfMn.css +1 -0
  70. package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.js +1 -0
  71. package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.lean.js +1 -0
  72. package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.js +9 -0
  73. package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.lean.js +1 -0
  74. package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.js +18 -0
  75. package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.lean.js +1 -0
  76. package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.js +6 -0
  77. package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.lean.js +1 -0
  78. package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.js +44 -0
  79. package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.lean.js +1 -0
  80. package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.js +45 -0
  81. package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.lean.js +1 -0
  82. package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.js +67 -0
  83. package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.lean.js +1 -0
  84. package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.js +167 -0
  85. package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.lean.js +1 -0
  86. package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.js +42 -0
  87. package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.lean.js +1 -0
  88. package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.js +50 -0
  89. package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.lean.js +1 -0
  90. package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.js +26 -0
  91. package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.lean.js +1 -0
  92. package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.js +39 -0
  93. package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.lean.js +1 -0
  94. package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.js +1 -0
  95. package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.lean.js +1 -0
  96. package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.js +41 -0
  97. package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.lean.js +1 -0
  98. package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.js +1 -0
  99. package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.lean.js +1 -0
  100. package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.js +19 -0
  101. package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.lean.js +1 -0
  102. package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.js +1 -0
  103. package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.lean.js +1 -0
  104. package/docs/.vitepress/dist/commands/deploy.html +41 -0
  105. package/docs/.vitepress/dist/commands/init.html +26 -0
  106. package/docs/.vitepress/dist/commands/rollback.html +31 -0
  107. package/docs/.vitepress/dist/config/auth.html +80 -0
  108. package/docs/.vitepress/dist/config/overview.html +58 -0
  109. package/docs/.vitepress/dist/config/schema.html +25 -0
  110. package/docs/.vitepress/dist/config/sub-env.html +50 -0
  111. package/docs/.vitepress/dist/features/atomic.html +46 -0
  112. package/docs/.vitepress/dist/features/cleanup.html +44 -0
  113. package/docs/.vitepress/dist/features/shared-assets.html +50 -0
  114. package/docs/.vitepress/dist/features/snapshot.html +48 -0
  115. package/docs/.vitepress/dist/hashmap.json +1 -0
  116. package/docs/.vitepress/dist/index.html +25 -0
  117. package/docs/.vitepress/dist/install.html +25 -0
  118. package/docs/.vitepress/dist/license.html +25 -0
  119. package/docs/.vitepress/dist/quick-start.html +47 -0
  120. package/docs/.vitepress/dist/troubleshooting.html +25 -0
  121. package/docs/.vitepress/dist/vp-icons.css +0 -0
  122. package/docs/.vitepress/dist/zh/commands/deploy.html +33 -0
  123. package/docs/.vitepress/dist/zh/commands/init.html +42 -0
  124. package/docs/.vitepress/dist/zh/commands/rollback.html +30 -0
  125. package/docs/.vitepress/dist/zh/config/auth.html +68 -0
  126. package/docs/.vitepress/dist/zh/config/overview.html +69 -0
  127. package/docs/.vitepress/dist/zh/config/schema.html +91 -0
  128. package/docs/.vitepress/dist/zh/config/sub-env.html +191 -0
  129. package/docs/.vitepress/dist/zh/features/atomic.html +66 -0
  130. package/docs/.vitepress/dist/zh/features/cleanup.html +74 -0
  131. package/docs/.vitepress/dist/zh/features/shared-assets.html +50 -0
  132. package/docs/.vitepress/dist/zh/features/snapshot.html +63 -0
  133. package/docs/.vitepress/dist/zh/index.html +25 -0
  134. package/docs/.vitepress/dist/zh/install.html +65 -0
  135. package/docs/.vitepress/dist/zh/license.html +25 -0
  136. package/docs/.vitepress/dist/zh/quick-start.html +43 -0
  137. package/docs/.vitepress/dist/zh/troubleshooting.html +25 -0
  138. package/docs/commands/deploy.md +46 -0
  139. package/docs/commands/init.md +27 -0
  140. package/docs/commands/rollback.md +45 -0
  141. package/docs/config/auth.md +112 -0
  142. package/docs/config/overview.md +63 -0
  143. package/docs/config/schema.md +52 -0
  144. package/docs/config/sub-env.md +62 -0
  145. package/docs/features/atomic.md +67 -0
  146. package/docs/features/cleanup.md +80 -0
  147. package/docs/features/shared-assets.md +72 -0
  148. package/docs/features/snapshot.md +58 -0
  149. package/docs/index.md +48 -0
  150. package/docs/install.md +21 -0
  151. package/docs/license.md +23 -0
  152. package/docs/quick-start.md +98 -0
  153. package/docs/troubleshooting.md +88 -0
  154. package/docs/zh/commands/deploy.md +127 -0
  155. package/docs/zh/commands/init.md +76 -0
  156. package/docs/zh/commands/rollback.md +115 -0
  157. package/docs/zh/config/auth.md +195 -0
  158. package/docs/zh/config/overview.md +153 -0
  159. package/docs/zh/config/schema.md +253 -0
  160. package/docs/zh/config/sub-env.md +293 -0
  161. package/docs/zh/features/atomic.md +249 -0
  162. package/docs/zh/features/cleanup.md +241 -0
  163. package/docs/zh/features/shared-assets.md +72 -0
  164. package/docs/zh/features/snapshot.md +186 -0
  165. package/docs/zh/index.md +65 -0
  166. package/docs/zh/install.md +160 -0
  167. package/docs/zh/license.md +23 -0
  168. package/docs/zh/quick-start.md +109 -0
  169. package/docs/zh/troubleshooting.md +88 -0
  170. package/package.json +17 -10
package/README_CN.md CHANGED
@@ -6,22 +6,6 @@
6
6
 
7
7
  一个强大的、**免费**、**基于 Rust** 的 Web 应用部署工具,**不请求网络**,实现**一键前端静态部署包上传到服务器**。支持多环境和子环境部署,具有零停机原子部署功能。
8
8
 
9
- ## 主要特性
10
-
11
- - 🚀 **免费开源**: 无隐藏费用,MIT 许可证
12
- - 🦀 **基于 Rust**: 快速、可靠、内存安全
13
- - 🔒 **不请求网络**: 完全离线工作,确保安全和隐私
14
- - ⚡ **一键部署**: 即时上传静态前端包到服务器
15
- - 🔄 **原子部署**: 零停机部署,自动回滚
16
- - 🌍 **多环境支持**: 配置不同环境(开发、预发布、生产)
17
- - 📦 **子环境支持**: 在同一服务器部署多个应用
18
- - 🔑 **灵活认证**: SSH 密钥、密码或环境变量认证
19
- - 📝 **详细日志**: 全面的部署日志用于故障排除
20
- - 🗂️ **共享资源管理**: 跨发布版本去重哈希静态资源
21
- - 📊 **资源快照**: 生成包含文件清单的部署快照
22
- - 🧹 **自动清理**: 可配置的旧版本保留和未使用资源清理
23
- - 🗑️ **共享资源重置**: 部署时自动清除所有共享资源,确保干净部署
24
-
25
9
  ## 安装
26
10
 
27
11
  ```bash
@@ -42,649 +26,15 @@ shipfe init
42
26
  shipfe deploy --profile prod
43
27
  ```
44
28
 
45
- ## 使用方法
46
-
47
- ### 初始化项目
48
- ```bash
49
- shipfe init
50
- ```
51
-
52
- ### 部署到环境
53
- ```bash
54
- # 部署到默认环境
55
- shipfe deploy
56
-
57
- # 部署到指定环境
58
- shipfe deploy --profile dev
59
-
60
- # 部署到子环境
61
- shipfe deploy --profile dev-admin
62
-
63
- # 部署到所有子环境
64
- shipfe deploy --profile dev --all-sub
65
-
66
- # 原子部署(创建 releases/时间戳 并更新 current 符号链接)
67
- shipfe deploy --atomic
68
- ```
69
-
70
- ### 回滚部署
71
- ```bash
72
- # 回滚主环境
73
- shipfe rollback --profile prod --to 20260303_034945
74
-
75
- # 回滚子环境
76
- shipfe rollback --profile prod-admin --to 20260303_034945
77
- ```
78
-
79
- ## 配置
80
-
81
- 编辑 `shipfe.config.json` 来配置您的部署设置:
82
-
83
- ```json
84
- {
85
- "environments": {
86
- "dev": {
87
- "build_command": "npm run build",
88
- "local_dist_path": "./dist",
89
- "servers": [
90
- {
91
- "host": "dev.example.com",
92
- "port": 22,
93
- "username": "deploy",
94
- "remote_deploy_path": "/var/www/dev",
95
- "delete_old": false
96
- }
97
- ],
98
- "remote_tmp": "/tmp"
99
- }
100
- }
101
- }
102
- ```
103
-
104
- ### 认证选项
105
-
106
- 每个服务器可以有自己的认证方法。Shipfe 按以下顺序尝试认证方法:
107
-
108
- 1. **密码**(如果在服务器配置中设置了 `password`)
109
- 2. **环境变量中的 SSH 私钥**(如果设置了 `SSH_PRIVATE_KEY` 环境变量)
110
- 3. **SSH 密钥文件**(如果在服务器配置中设置了 `key_path`)
111
-
112
- **使用不同认证方法的多个服务器示例:**
113
-
114
- ```json
115
- {
116
- "environments": {
117
- "prod": {
118
- "build_command": "npm run build",
119
- "local_dist_path": "./dist",
120
- "servers": [
121
- {
122
- "host": "web1.prod.com",
123
- "port": 22,
124
- "username": "deploy",
125
- "password": "web1_password",
126
- "remote_deploy_path": "/var/www/prod"
127
- },
128
- {
129
- "host": "web2.prod.com",
130
- "port": 22,
131
- "username": "deploy",
132
- "key_path": "/home/user/.ssh/web2_key",
133
- "remote_deploy_path": "/var/www/prod"
134
- },
135
- {
136
- "host": "web3.prod.com",
137
- "port": 22,
138
- "username": "deploy",
139
- "remote_deploy_path": "/var/www/prod"
140
- }
141
- ],
142
- "remote_tmp": "/tmp",
143
- "delete_old": false
144
- }
145
- }
146
- }
147
- ```
148
-
149
- ### 配置项详解
150
-
151
- 以下是 `shipfe.config.json` 中所有可用配置项的详细说明:
152
-
153
- #### 全局配置项
154
-
155
- - **`enable_shared`** (boolean, 默认: false)
156
- - 是否启用共享资源管理
157
- - 启用后,会对匹配的文件计算哈希并存储在共享目录中,避免重复上传
158
- - 适用于频繁部署且有大量静态资源的应用
159
-
160
- - **`hashed_asset_patterns`** (array of strings, 默认: [])
161
- - 指定需要哈希处理的静态资源文件模式
162
- - 支持 glob 模式,如 `"**/*.js"`, `"**/*.css"`, `"**/*.{png,jpg,svg}"`
163
- - 只有匹配的文件会被哈希并共享,不匹配的文件每次部署都会重新上传
164
-
165
- - **`keep_releases`** (number, 默认: 10)
166
- - 保留的发布版本数量
167
- - 超过此数量的旧发布会被自动清理
168
- - 设置为 0 禁用自动清理
169
-
170
- #### 环境配置项
171
-
172
- 每个环境(如 `dev`, `prod`)可以包含以下配置:
173
-
174
- - **`build_command`** (string, 必需)
175
- - 本地构建命令,如 `"npm run build"` 或 `"yarn build"`
176
-
177
- - **`local_dist_path`** (string, 必需)
178
- - 本地构建输出目录路径,如 `"./dist"` 或 `"./build"`
179
-
180
- - **`servers`** (array of objects, 必需)
181
- - 服务器列表,每个服务器包含以下配置:
182
- - **`host`** (string, 必需): 服务器主机名或 IP 地址
183
- - **`port`** (number, 默认: 22): SSH 端口
184
- - **`username`** (string, 必需): SSH 用户名
185
- - **`password`** (string, 可选): SSH 密码(不推荐,建议使用密钥)
186
- - **`key_path`** (string, 可选): SSH 私钥文件路径
187
- - **`remote_deploy_path`** (string, 必需): 服务器上部署目录路径
188
-
189
- - **`remote_tmp`** (string, 默认: "/tmp")
190
- - 服务器上的临时目录路径,用于上传文件
191
-
192
- - **`sub_environments`** (object, 可选)
193
- - 子环境配置,键为子环境名称,值为子环境配置对象
194
- - 子环境会继承父环境的设置,但可以覆盖 `build_command`, `local_dist_path`, `remote_deploy_path`
195
-
196
- - **`delete_old`** (boolean, 默认: false)
197
- - 是否在每次部署后删除所有旧发布
198
- - 只保留当前部署
199
- - 覆盖 `keep_releases` 设置
200
-
201
- #### 共享资源和哈希配置说明
202
-
203
- **共享资源的工作原理:**
204
-
205
- 1. **文件匹配**: 根据 `hashed_asset_patterns` 匹配文件
206
- 2. **哈希计算**: 对匹配文件计算 SHA256 哈希值
207
- 3. **存储策略**:
208
- - 相同哈希的文件只存储一次在 `shared/assets/` 目录
209
- - 文件名格式为 `{hash}.{ext}`,如 `abc123def456.js`
210
- 4. **链接创建**: 在发布目录中创建硬链接指向共享文件
211
- 5. **清理机制**: 删除不再被任何发布引用的共享文件
212
-
213
- **配置示例和解释:**
214
-
215
- ```json
216
- {
217
- "enable_shared": true,
218
- "hashed_asset_patterns": [
219
- "**/*.js", // 匹配所有 JS 文件
220
- "**/*.css", // 匹配所有 CSS 文件
221
- "**/*.{png,jpg}", // 匹配 PNG 和 JPG 文件
222
- "!**/vendor/**" // 排除 vendor 目录(如果不需要共享)
223
- ],
224
- "keep_releases": 5
225
- }
226
- ```
227
-
228
- **适用场景:**
229
- - **启用共享**: 大型应用,频繁部署,有很多静态资源
230
- - **禁用共享**: 小型应用,部署不频繁,或需要简单调试
231
-
232
- **注意事项:**
233
- - 共享资源需要服务器文件系统支持硬链接
234
- - 首次启用共享时,所有匹配文件都会被哈希处理
235
- - 禁用共享后,已有的共享文件不会被删除,需要手动清理
236
-
237
- ### 子环境
238
-
239
- 对于在同一服务器部署多个应用或不同配置,使用子环境:
240
-
241
- ```json
242
- {
243
- "environments": {
244
- "dev": {
245
- "build_command": "npm run build",
246
- "local_dist_path": "./dist",
247
- "servers": [
248
- {
249
- "host": "dev.example.com",
250
- "port": 22,
251
- "username": "deploy",
252
- "remote_deploy_path": "/var/www/dev",
253
- "delete_old": false
254
- }
255
- ],
256
- "remote_tmp": "/tmp",
257
- "sub_environments": {
258
- "admin": {
259
- "build_command": "npm run build:admin",
260
- "remote_deploy_path": "/var/www/dev/admin"
261
- },
262
- "shop": {
263
- "build_command": "npm run build:shop",
264
- "remote_deploy_path": "/var/www/dev/shop"
265
- },
266
- "cu": {
267
- "build_command": "npm run build:cu",
268
- "remote_deploy_path": "/var/www/dev/cu"
269
- }
270
- }
271
- }
272
- }
273
- }
274
- ```
275
-
276
- 部署到子环境:
277
- ```bash
278
- shipfe deploy --profile dev-admin
279
- shipfe deploy --profile dev-shop
280
- shipfe deploy --profile dev-cu
281
-
282
- # 一次部署到所有子环境
283
- shipfe deploy --profile dev --all-sub
284
- ```
285
-
286
- ### 一次部署所有子环境
287
- ```bash
288
- shipfe deploy --profile dev --all-sub
289
- ```
290
-
291
- 这将按顺序部署到所有子环境(admin、shop、cu)。
292
-
293
- 子环境继承父环境的设置,可以覆盖 `build_command`、`local_dist_path` 和 `remote_deploy_path`。
294
-
295
- ### 原子部署
296
-
297
- Shipfe 支持原子部署以最小化停机时间。使用 `--atomic` 时,部署会创建一个带时间戳的发布目录,并更新 `current` 符号链接,实现零停机切换。
298
-
299
- ```bash
300
- # 原子部署到默认环境
301
- shipfe deploy --atomic
302
-
303
- # 原子部署到指定环境
304
- shipfe deploy --profile prod --atomic
305
- ```
306
-
307
- **目录结构:**
308
- ```
309
- remote_deploy_path/
310
- ├── releases/
311
- │ ├── 20260303_034945/
312
- │ ├── 20260303_035012/
313
- │ └── 20260303_035045/
314
- └── current -> releases/20260303_035045
315
- ```
316
-
317
- 您的 Web 服务器应从 `remote_deploy_path/current` 提供服务。
318
-
319
- ## 共享资源管理
320
-
321
- Shipfe 支持跨多个发布版本共享静态资源,通过文件哈希去重来减少磁盘使用和网络传输。
322
-
323
- **启用共享资源:**
324
- ```json
325
- {
326
- "environments": {
327
- "prod": {
328
- "enable_shared": true,
329
- "hashed_asset_patterns": [
330
- "**/*.js",
331
- "**/*.css",
332
- "**/*.png",
333
- "**/*.jpg",
334
- "**/*.svg",
335
- "**/*.woff2"
336
- ],
337
- "servers": [...]
338
- }
339
- }
340
- }
341
- ```
342
-
343
- **工作原理:**
344
-
345
- 1. **文件哈希计算**:对匹配模式的文件计算 SHA256 哈希
346
- 2. **共享存储**:将哈希文件存储在 `shared/assets/` 目录
347
- 3. **硬链接创建**:在发布目录中创建指向共享文件的硬链接
348
- 4. **自动清理**:删除未被任何发布引用的共享文件
349
-
350
- **共享资源重置:**
351
-
352
- 在每次部署开始时,Shipfe 会自动清除 `shared/` 目录下的所有现有资源,然后重新创建 `shared/assets/` 目录。这确保了每次部署从干净的状态开始,避免了旧资源的积累和潜在冲突。
353
-
354
- **目录结构示例:**
355
- ```
356
- remote_deploy_path/
357
- ├── shared/
358
- │ └── assets/
359
- │ ├── abc123def456.js
360
- │ ├── def789ghi012.css
361
- │ └── hij345klm678.png
362
- ├── releases/
363
- │ ├── 20260304_120000/
364
- │ │ ├── index.html
365
- │ │ ├── app.js -> ../../shared/assets/abc123def456.js
366
- │ │ └── styles.css -> ../../shared/assets/def789ghi012.css
367
- │ └── 20260304_120100/
368
- │ ├── index.html
369
- │ ├── app.js -> ../../shared/assets/abc123def456.js
370
- │ └── styles.css -> ../../shared/assets/def789ghi012.css
371
- └── current -> releases/20260304_120100
372
- ```
373
-
374
- **优势:**
375
- - **减少磁盘使用**:相同文件只存储一次
376
- - **加快部署**:未更改的文件不需要重新上传
377
- - **节省带宽**:只传输新的或更改的文件
378
- - **原子更新**:所有硬链接同时创建,确保一致性
379
-
380
- ## 资源快照
381
-
382
- 每个发布都会生成包含完整文件清单的快照,用于审计和回滚验证。
383
-
384
- **快照内容:**
385
- - 所有部署文件及其哈希值
386
- - 共享资源引用
387
- - 部署时间戳和元数据
388
- - 文件权限和大小信息
389
-
390
- **快照文件位置:**
391
- ```
392
- releases/20260304_120100/
393
- ├── files/
394
- │ ├── index.html
395
- │ └── app.js -> ../../shared/assets/abc123def456.js
396
- ├── snapshot.json
397
- └── metadata.json
398
- ```
399
-
400
- **快照示例:**
401
- ```json
402
- {
403
- "timestamp": "20260304_120100",
404
- "files": {
405
- "index.html": {
406
- "hash": "a1b2c3d4e5f6...",
407
- "size": 1024,
408
- "permissions": "644"
409
- },
410
- "app.js": {
411
- "shared_hash": "abc123def456.js",
412
- "size": 51200,
413
- "permissions": "644"
414
- }
415
- },
416
- "metadata": {
417
- "build_command": "npm run build",
418
- "deployed_by": "user",
419
- "deployed_at": "2026-03-04T12:01:00Z"
420
- }
421
- }
422
- ```
423
-
424
- ## 自动清理
425
-
426
- Shipfe 提供可配置的自动清理旧发布和未使用共享资源功能,以有效管理磁盘使用。
427
-
428
- **配置选项:**
429
-
430
- 1. **`keep_releases`**(推荐):
431
- ```json
432
- {
433
- "keep_releases": 5,
434
- "delete_old": false
435
- }
436
- ```
437
- - 保留最近的 5 个发布
438
- - 自动删除旧发布
439
- - 与共享资源清理配合工作
440
-
441
- 2. **`delete_old`**(传统):
442
- ```json
443
- {
444
- "delete_old": true
445
- }
446
- ```
447
- - 在每次部署后删除所有旧发布
448
- - 只保留当前部署
449
- - 覆盖 `keep_releases` 设置
450
-
451
- **清理过程:**
452
-
453
- 1. **发布清理**:
454
- - 按修改时间排序发布(最新优先)
455
- - 保留指定数量的最近发布
456
- - 完全删除旧发布目录
457
-
458
- 2. **共享资源清理**(当 `enable_shared: true` 时):
459
- - 扫描所有剩余发布快照
460
- - 收集当前被引用的所有哈希资源
461
- - 从 `shared/assets/` 删除未引用的文件
462
-
463
- **清理行为示例:**
464
-
465
- **清理前(7 个发布):**
466
- ```
467
- releases/
468
- ├── 20260301_100000/ (最旧)
469
- ├── 20260302_100000/
470
- ├── 20260303_100000/
471
- ├── 20260304_100000/
472
- ├── 20260305_100000/
473
- ├── 20260306_100000/
474
- └── 20260307_100000/ (最新,当前)
475
- ```
476
-
477
- **清理后(`keep_releases: 3`):**
478
- ```
479
- releases/
480
- ├── 20260305_100000/ (保留)
481
- ├── 20260306_100000/ (保留)
482
- └── 20260307_100000/ (保留,当前)
483
- ```
484
- *旧发布自动删除*
485
-
486
- **监控清理:**
487
- ```bash
488
- # 检查当前发布
489
- ls -la releases/
490
-
491
- # 在 shipfe.log 中查看清理日志
492
- tail -f shipfe.log | grep -i "cleanup\|remove"
493
- ```
494
-
495
- **或为所有服务器使用环境变量:**
496
- ```bash
497
- export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
498
- shipfe deploy --profile prod
499
- ```
500
-
501
- ### 认证
502
-
503
- Shipfe 支持为每个服务器单独设置多种 SSH 认证方法。对于每个服务器,按以下顺序尝试认证方法:
504
-
505
- 1. **密码认证**:如果该服务器配置中设置了 `password`
506
- 2. **环境变量中的 SSH 私钥**:如果设置了 `SSH_PRIVATE_KEY` 环境变量(适用于所有服务器)
507
- 3. **SSH 密钥文件**:如果该服务器配置中设置了 `key_path`
508
-
509
- #### 使用示例:
510
-
511
- ```bash
512
- # 每个服务器可以使用不同的认证
513
- shipfe deploy --profile prod
514
-
515
- # 或为所有服务器使用环境变量覆盖
516
- export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
517
- shipfe deploy --profile prod
518
- ```
519
-
520
- #### 为单个服务器设置 SSH 密钥:
521
-
522
- 1. **为每个服务器生成 SSH 密钥对**:
523
- ```bash
524
- # 服务器 1
525
- ssh-keygen -t rsa -b 4096 -f ~/.ssh/server1_key -C "server1"
526
-
527
- # 服务器 2
528
- ssh-keygen -t rsa -b 4096 -f ~/.ssh/server2_key -C "server2"
529
- ```
530
-
531
- 2. **将公钥复制到相应服务器**:
532
- ```bash
533
- ssh-copy-id -i ~/.ssh/server1_key.pub user@server1.com
534
- ssh-copy-id -i ~/.ssh/server2_key.pub user@server2.com
535
- ```
536
-
537
- 3. **使用服务器特定密钥配置 shipfe**:
538
- ```json
539
- {
540
- "servers": [
541
- {
542
- "host": "server1.com",
543
- "key_path": "~/.ssh/server1_key"
544
- },
545
- {
546
- "host": "server2.com",
547
- "key_path": "~/.ssh/server2_key"
548
- }
549
- ]
550
- }
551
- ```
552
-
553
- ## 配置最佳实践
554
-
555
- ### 生产环境部署
556
-
557
- **推荐配置:**
558
- ```json
559
- {
560
- "enable_shared": true,
561
- "keep_releases": 10,
562
- "hashed_asset_patterns": [
563
- "**/*.js",
564
- "**/*.css",
565
- "**/*.png",
566
- "**/*.jpg",
567
- "**/*.svg",
568
- "**/*.woff2"
569
- ]
570
- }
571
- ```
572
-
573
- **为什么有效:**
574
- - 共享资源将磁盘使用减少 60-80%
575
- - 10 个发布提供回滚能力
576
- - 哈希模式覆盖常见静态资源
577
- - 自动清理防止磁盘空间问题
578
-
579
- ### 开发/预发布环境
580
-
581
- **推荐配置:**
582
- ```json
583
- {
584
- "enable_shared": false,
585
- "keep_releases": 3,
586
- "delete_old": false
587
- }
588
- ```
589
-
590
- **为什么有效:**
591
- - 部署更快(无资源哈希)
592
- - 更少的发布需要管理
593
- - 无共享资源复杂性,更易调试
594
-
595
- ### 内存受限服务器
596
-
597
- **推荐配置:**
598
- ```json
599
- {
600
- "enable_shared": true,
601
- "keep_releases": 2,
602
- "hashed_asset_patterns": ["**/*.{js,css}"]
603
- }
604
- ```
605
-
606
- **为什么有效:**
607
- - 最少的发布减少存储
608
- - 只共享必要资源
609
- - 平衡性能和磁盘使用
610
-
611
- ## 故障排除
612
-
613
- ### 常见问题
614
-
615
- **1. 权限拒绝错误**
616
- ```
617
- Error: Permission denied (publickey)
618
- ```
619
- **解决方案:**
620
- - 验证 SSH 密钥已添加到服务器的 `~/.ssh/authorized_keys`
621
- - 检查 SSH 密钥权限:`chmod 600 ~/.ssh/id_rsa`
622
- - 测试 SSH 连接:`ssh user@host`
623
-
624
- **2. 共享资源不工作**
625
- ```
626
- Warning: Failed to create hard link for shared asset
627
- ```
628
- **解决方案:**
629
- - 确保配置中 `enable_shared: true`
630
- - 检查服务器文件系统支持硬链接
631
- - 验证 shared 目录的写入权限
632
-
633
- **3. 清理不工作**
634
- ```
635
- Warning: Failed to remove old release
636
- ```
637
- **解决方案:**
638
- - 检查 releases 目录的文件权限
639
- - 确保没有进程正在使用旧发布文件
640
- - 验证 `keep_releases` 设置正确
641
-
642
- **4. 快照创建失败**
643
- ```
644
- Error: Failed to create snapshot
645
- ```
646
- **解决方案:**
647
- - 检查可用磁盘空间
648
- - 验证 releases 目录的写入权限
649
- - 确保服务器上有 tar 命令
650
-
651
- ### 调试模式
652
-
653
- 启用详细日志:
654
- ```bash
655
- shipfe deploy --debug
656
- ```
657
-
658
- 检查日志:
659
- ```bash
660
- tail -f shipfe.log
661
- ```
662
-
663
- ### 性能优化
664
-
665
- **部署缓慢:**
666
- - 为大静态文件启用共享资源
667
- - 使用 `hashed_asset_patterns` 针对特定文件
668
- - 考虑从模式中排除大的非更改文件
669
-
670
- **磁盘使用过高:**
671
- - 减少 `keep_releases` 数量
672
- - 启用共享资源
673
- - 对单发布部署使用 `delete_old: true`
29
+ ## 文档
674
30
 
675
- **网络问题:**
676
- - 部署前压缩大文件
677
- - 如果支持,使用更快的 SSH 密码
678
- - 考虑在非高峰时段部署
31
+ 📖 [完整文档](https://master-jian.github.io/shipfe-rust/)
679
32
 
680
- ## 功能特性
33
+ ## 常用命令
681
34
 
682
- - 多环境支持
683
- - 子环境配置
684
- - 自定义构建命令
685
- - 基于 SSH 的部署
686
- - 自动备份和回滚
687
- - 详细日志记录
35
+ - `shipfe deploy --profile <env>` - 部署到指定环境
36
+ - `shipfe deploy --atomic` - 原子部署
37
+ - `shipfe rollback --profile <env> --to <timestamp>` - 回滚到指定版本
688
38
 
689
39
  ## 许可证
690
40
 
package/bin/shipfe CHANGED
Binary file