shipfe 1.0.4 → 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.
- package/.github/workflows/deploy.yml +46 -0
- package/.github/workflows/release.yml +51 -0
- package/README.md +13 -270
- package/README_CN.md +6 -263
- package/bin/shipfe +0 -0
- package/docs/.vitepress/cache/deps/@theme_index.js +275 -0
- package/docs/.vitepress/cache/deps/@theme_index.js.map +7 -0
- package/docs/.vitepress/cache/deps/_metadata.json +40 -0
- package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js +9719 -0
- package/docs/.vitepress/cache/deps/chunk-BRNHR3LR.js.map +7 -0
- package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js +12877 -0
- package/docs/.vitepress/cache/deps/chunk-H6MPEGKE.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/config.ts +120 -0
- package/docs/.vitepress/dist/404.html +22 -0
- package/docs/.vitepress/dist/assets/app.DZUgfPE2.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/framework.BeaujayP.js +19 -0
- package/docs/.vitepress/dist/assets/chunks/theme.CNyaCki0.js +1 -0
- package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.js +17 -0
- package/docs/.vitepress/dist/assets/commands_deploy.md.cybIRa1n.lean.js +1 -0
- package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.js +2 -0
- package/docs/.vitepress/dist/assets/commands_init.md.Da652so5.lean.js +1 -0
- package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.js +7 -0
- package/docs/.vitepress/dist/assets/commands_rollback.md.C0zKmFtz.lean.js +1 -0
- package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.js +56 -0
- package/docs/.vitepress/dist/assets/config_auth.md.hvDhtWY8.lean.js +1 -0
- package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.js +34 -0
- package/docs/.vitepress/dist/assets/config_overview.md.DAQclMJL.lean.js +1 -0
- package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.js +1 -0
- package/docs/.vitepress/dist/assets/config_schema.md.Bv5TuD6E.lean.js +1 -0
- package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.js +26 -0
- package/docs/.vitepress/dist/assets/config_sub-env.md.DSUt0Nyq.lean.js +1 -0
- package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.js +22 -0
- package/docs/.vitepress/dist/assets/features_atomic.md.Cszqfb8O.lean.js +1 -0
- package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.js +20 -0
- package/docs/.vitepress/dist/assets/features_cleanup.md.D1j3LEm1.lean.js +1 -0
- package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.js +26 -0
- package/docs/.vitepress/dist/assets/features_shared-assets.md.ChpQD81r.lean.js +1 -0
- package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.js +24 -0
- package/docs/.vitepress/dist/assets/features_snapshot.md.Bddk9nNL.lean.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.DqmDY2QI.lean.js +1 -0
- package/docs/.vitepress/dist/assets/install.md.CblrJsha.js +1 -0
- package/docs/.vitepress/dist/assets/install.md.CblrJsha.lean.js +1 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs/.vitepress/dist/assets/license.md.hVRT8__d.js +1 -0
- package/docs/.vitepress/dist/assets/license.md.hVRT8__d.lean.js +1 -0
- package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.js +23 -0
- package/docs/.vitepress/dist/assets/quick-start.md.C06xD920.lean.js +1 -0
- package/docs/.vitepress/dist/assets/style.DES0mfMn.css +1 -0
- package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.js +1 -0
- package/docs/.vitepress/dist/assets/troubleshooting.md.DLP5r-7N.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.js +9 -0
- package/docs/.vitepress/dist/assets/zh_commands_deploy.md.BbKuBIij.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.js +18 -0
- package/docs/.vitepress/dist/assets/zh_commands_init.md.Dc_WYD8D.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.js +6 -0
- package/docs/.vitepress/dist/assets/zh_commands_rollback.md.Cdvwk1lB.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.js +44 -0
- package/docs/.vitepress/dist/assets/zh_config_auth.md.BytNcdS4.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.js +45 -0
- package/docs/.vitepress/dist/assets/zh_config_overview.md.CvAKxlb5.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.js +67 -0
- package/docs/.vitepress/dist/assets/zh_config_schema.md.CTCn0g9X.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.js +167 -0
- package/docs/.vitepress/dist/assets/zh_config_sub-env.md.Ce3xOEsi.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.js +42 -0
- package/docs/.vitepress/dist/assets/zh_features_atomic.md.DUhJ_qq0.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.js +50 -0
- package/docs/.vitepress/dist/assets/zh_features_cleanup.md.CEgw587m.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.js +26 -0
- package/docs/.vitepress/dist/assets/zh_features_shared-assets.md.DZhvWCTp.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.js +39 -0
- package/docs/.vitepress/dist/assets/zh_features_snapshot.md.Bkqgn7lu.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.js +1 -0
- package/docs/.vitepress/dist/assets/zh_index.md.DKRf1R-g.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.js +41 -0
- package/docs/.vitepress/dist/assets/zh_install.md.0LCLPI3L.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.js +1 -0
- package/docs/.vitepress/dist/assets/zh_license.md.BUZ74dvK.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.js +19 -0
- package/docs/.vitepress/dist/assets/zh_quick-start.md.Bl-Larcu.lean.js +1 -0
- package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.js +1 -0
- package/docs/.vitepress/dist/assets/zh_troubleshooting.md.DHyCAfy2.lean.js +1 -0
- package/docs/.vitepress/dist/commands/deploy.html +41 -0
- package/docs/.vitepress/dist/commands/init.html +26 -0
- package/docs/.vitepress/dist/commands/rollback.html +31 -0
- package/docs/.vitepress/dist/config/auth.html +80 -0
- package/docs/.vitepress/dist/config/overview.html +58 -0
- package/docs/.vitepress/dist/config/schema.html +25 -0
- package/docs/.vitepress/dist/config/sub-env.html +50 -0
- package/docs/.vitepress/dist/features/atomic.html +46 -0
- package/docs/.vitepress/dist/features/cleanup.html +44 -0
- package/docs/.vitepress/dist/features/shared-assets.html +50 -0
- package/docs/.vitepress/dist/features/snapshot.html +48 -0
- package/docs/.vitepress/dist/hashmap.json +1 -0
- package/docs/.vitepress/dist/index.html +25 -0
- package/docs/.vitepress/dist/install.html +25 -0
- package/docs/.vitepress/dist/license.html +25 -0
- package/docs/.vitepress/dist/quick-start.html +47 -0
- package/docs/.vitepress/dist/troubleshooting.html +25 -0
- package/docs/.vitepress/dist/vp-icons.css +0 -0
- package/docs/.vitepress/dist/zh/commands/deploy.html +33 -0
- package/docs/.vitepress/dist/zh/commands/init.html +42 -0
- package/docs/.vitepress/dist/zh/commands/rollback.html +30 -0
- package/docs/.vitepress/dist/zh/config/auth.html +68 -0
- package/docs/.vitepress/dist/zh/config/overview.html +69 -0
- package/docs/.vitepress/dist/zh/config/schema.html +91 -0
- package/docs/.vitepress/dist/zh/config/sub-env.html +191 -0
- package/docs/.vitepress/dist/zh/features/atomic.html +66 -0
- package/docs/.vitepress/dist/zh/features/cleanup.html +74 -0
- package/docs/.vitepress/dist/zh/features/shared-assets.html +50 -0
- package/docs/.vitepress/dist/zh/features/snapshot.html +63 -0
- package/docs/.vitepress/dist/zh/index.html +25 -0
- package/docs/.vitepress/dist/zh/install.html +65 -0
- package/docs/.vitepress/dist/zh/license.html +25 -0
- package/docs/.vitepress/dist/zh/quick-start.html +43 -0
- package/docs/.vitepress/dist/zh/troubleshooting.html +25 -0
- package/docs/commands/deploy.md +46 -0
- package/docs/commands/init.md +27 -0
- package/docs/commands/rollback.md +45 -0
- package/docs/config/auth.md +112 -0
- package/docs/config/overview.md +63 -0
- package/docs/config/schema.md +52 -0
- package/docs/config/sub-env.md +62 -0
- package/docs/features/atomic.md +67 -0
- package/docs/features/cleanup.md +80 -0
- package/docs/features/shared-assets.md +72 -0
- package/docs/features/snapshot.md +58 -0
- package/docs/index.md +48 -0
- package/docs/install.md +21 -0
- package/docs/license.md +23 -0
- package/docs/quick-start.md +98 -0
- package/docs/troubleshooting.md +88 -0
- package/docs/zh/commands/deploy.md +127 -0
- package/docs/zh/commands/init.md +76 -0
- package/docs/zh/commands/rollback.md +115 -0
- package/docs/zh/config/auth.md +195 -0
- package/docs/zh/config/overview.md +153 -0
- package/docs/zh/config/schema.md +253 -0
- package/docs/zh/config/sub-env.md +293 -0
- package/docs/zh/features/atomic.md +249 -0
- package/docs/zh/features/cleanup.md +241 -0
- package/docs/zh/features/shared-assets.md +72 -0
- package/docs/zh/features/snapshot.md +186 -0
- package/docs/zh/index.md +65 -0
- package/docs/zh/install.md +160 -0
- package/docs/zh/license.md +23 -0
- package/docs/zh/quick-start.md +109 -0
- package/docs/zh/troubleshooting.md +88 -0
- package/package.json +17 -10
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Deploy VitePress to GitHub Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
pages: write
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: pages
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- uses: actions/setup-node@v4
|
|
24
|
+
with:
|
|
25
|
+
node-version: 20
|
|
26
|
+
cache: npm
|
|
27
|
+
|
|
28
|
+
- run: npm ci
|
|
29
|
+
- run: npm run docs:build
|
|
30
|
+
|
|
31
|
+
- uses: actions/configure-pages@v5
|
|
32
|
+
with:
|
|
33
|
+
enablement: true
|
|
34
|
+
- uses: actions/upload-pages-artifact@v3
|
|
35
|
+
with:
|
|
36
|
+
path: docs/.vitepress/dist
|
|
37
|
+
|
|
38
|
+
deploy:
|
|
39
|
+
needs: build
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
environment:
|
|
42
|
+
name: github-pages
|
|
43
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
44
|
+
steps:
|
|
45
|
+
- id: deployment
|
|
46
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: 20
|
|
21
|
+
registry-url: 'https://registry.npmjs.org'
|
|
22
|
+
|
|
23
|
+
- run: npm ci
|
|
24
|
+
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.10'
|
|
28
|
+
|
|
29
|
+
- name: Install Rust
|
|
30
|
+
uses: dtolnay/rust-toolchain@stable
|
|
31
|
+
|
|
32
|
+
- run: cargo build --release
|
|
33
|
+
|
|
34
|
+
- run: cp target/release/shipfe bin/shipfe
|
|
35
|
+
|
|
36
|
+
- run: npm publish --provenance
|
|
37
|
+
env:
|
|
38
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
39
|
+
|
|
40
|
+
- name: Create GitHub Release
|
|
41
|
+
uses: softprops/action-gh-release@v1
|
|
42
|
+
with:
|
|
43
|
+
tag_name: ${{ github.ref_name }}
|
|
44
|
+
name: Release ${{ github.ref_name }}
|
|
45
|
+
body: |
|
|
46
|
+
## Changes
|
|
47
|
+
- Version bump to ${{ github.ref_name }}
|
|
48
|
+
draft: false
|
|
49
|
+
prerelease: false
|
|
50
|
+
env:
|
|
51
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
package/README.md
CHANGED
|
@@ -4,295 +4,38 @@
|
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://github.com/Master-Jian/shipfe-rust)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
一个强大的、**免费**、**基于 Rust** 的 Web 应用部署工具,**不请求网络**,实现**一键前端静态部署包上传到服务器**。支持多环境和子环境部署,具有零停机原子部署功能。
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
- 🚀 **Free and Open Source**: No hidden costs, MIT licensed
|
|
12
|
-
- 🦀 **Built with Rust**: Fast, reliable, and memory-safe
|
|
13
|
-
- 🔒 **No Network Requests**: Works completely offline, ensuring security and privacy
|
|
14
|
-
- ⚡ **One-Click Deployment**: Upload static frontend packages to servers instantly
|
|
15
|
-
- 🔄 **Atomic Deployments**: Zero-downtime deployments with automatic rollback
|
|
16
|
-
- 🌍 **Multi-Environment Support**: Configure different environments (dev, staging, prod)
|
|
17
|
-
- 📦 **Sub-Environment Support**: Deploy multiple apps to the same server
|
|
18
|
-
- 🔑 **Flexible Authentication**: SSH key, password, or environment variable authentication
|
|
19
|
-
- 📝 **Detailed Logging**: Comprehensive deployment logs for troubleshooting
|
|
20
|
-
|
|
21
|
-
## Installation
|
|
9
|
+
## 安装
|
|
22
10
|
|
|
23
11
|
```bash
|
|
24
12
|
npm install -g shipfe
|
|
25
13
|
```
|
|
26
14
|
|
|
27
|
-
##
|
|
15
|
+
## 快速开始
|
|
28
16
|
|
|
29
|
-
1.
|
|
17
|
+
1. 初始化项目:
|
|
30
18
|
```bash
|
|
31
19
|
shipfe init
|
|
32
20
|
```
|
|
33
21
|
|
|
34
|
-
2.
|
|
22
|
+
2. 在 `shipfe.config.json` 中配置部署
|
|
35
23
|
|
|
36
|
-
3.
|
|
24
|
+
3. 部署:
|
|
37
25
|
```bash
|
|
38
26
|
shipfe deploy --profile prod
|
|
39
27
|
```
|
|
40
28
|
|
|
41
|
-
##
|
|
42
|
-
|
|
43
|
-
### Initialize project
|
|
44
|
-
```bash
|
|
45
|
-
shipfe init
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Deploy to environment
|
|
49
|
-
```bash
|
|
50
|
-
# Deploy to default environment
|
|
51
|
-
shipfe deploy
|
|
52
|
-
|
|
53
|
-
# Deploy to specific environment
|
|
54
|
-
shipfe deploy --profile dev
|
|
55
|
-
|
|
56
|
-
# Deploy to sub-environment
|
|
57
|
-
shipfe deploy --profile dev-admin
|
|
58
|
-
|
|
59
|
-
# Deploy to all sub-environments
|
|
60
|
-
shipfe deploy --profile dev --all-sub
|
|
61
|
-
|
|
62
|
-
# Atomic deployment (creates releases/timestamp and updates current symlink)
|
|
63
|
-
shipfe deploy --atomic
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Rollback Deployment
|
|
67
|
-
```bash
|
|
68
|
-
# Rollback main environment
|
|
69
|
-
shipfe rollback --profile prod --to 20260303_034945
|
|
70
|
-
|
|
71
|
-
# Rollback sub-environment
|
|
72
|
-
shipfe rollback --profile prod-admin --to 20260303_034945
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Configuration
|
|
76
|
-
|
|
77
|
-
Edit `shipfe.config.json` to configure your deployment settings:
|
|
78
|
-
|
|
79
|
-
```json
|
|
80
|
-
{
|
|
81
|
-
"environments": {
|
|
82
|
-
"dev": {
|
|
83
|
-
"build_command": "npm run build",
|
|
84
|
-
"local_dist_path": "./dist",
|
|
85
|
-
"servers": [
|
|
86
|
-
{
|
|
87
|
-
"host": "dev.example.com",
|
|
88
|
-
"port": 22,
|
|
89
|
-
"username": "deploy",
|
|
90
|
-
"remote_deploy_path": "/var/www/dev",
|
|
91
|
-
"delete_old": false
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
|
-
"remote_tmp": "/tmp"
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
#### Authentication Options
|
|
101
|
-
|
|
102
|
-
Each server can have its own authentication method. Shipfe tries authentication methods in this order:
|
|
103
|
-
|
|
104
|
-
1. **Password** (if `password` is set in server config)
|
|
105
|
-
2. **SSH Private Key from environment** (if `SSH_PRIVATE_KEY` env var is set)
|
|
106
|
-
3. **SSH Key file** (if `key_path` is set in server config)
|
|
107
|
-
|
|
108
|
-
**Example with multiple servers using different auth methods:**
|
|
109
|
-
|
|
110
|
-
```json
|
|
111
|
-
{
|
|
112
|
-
"environments": {
|
|
113
|
-
"prod": {
|
|
114
|
-
"build_command": "npm run build",
|
|
115
|
-
"local_dist_path": "./dist",
|
|
116
|
-
"servers": [
|
|
117
|
-
{
|
|
118
|
-
"host": "web1.prod.com",
|
|
119
|
-
"port": 22,
|
|
120
|
-
"username": "deploy",
|
|
121
|
-
"password": "web1_password",
|
|
122
|
-
"remote_deploy_path": "/var/www/prod",
|
|
123
|
-
"delete_old": false
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
"host": "web2.prod.com",
|
|
127
|
-
"port": 22,
|
|
128
|
-
"username": "deploy",
|
|
129
|
-
"key_path": "/home/user/.ssh/web2_key",
|
|
130
|
-
"remote_deploy_path": "/var/www/prod",
|
|
131
|
-
"delete_old": false
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"host": "web3.prod.com",
|
|
135
|
-
"port": 22,
|
|
136
|
-
"username": "deploy",
|
|
137
|
-
"key_path": "/home/user/.ssh/web3_key",
|
|
138
|
-
"remote_deploy_path": "/var/www/prod",
|
|
139
|
-
"delete_old": false
|
|
140
|
-
}
|
|
141
|
-
],
|
|
142
|
-
"remote_tmp": "/tmp"
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
### Sub-environments
|
|
148
|
-
|
|
149
|
-
For deploying multiple applications or different configurations to the same server, use sub-environments:
|
|
150
|
-
|
|
151
|
-
```json
|
|
152
|
-
{
|
|
153
|
-
"environments": {
|
|
154
|
-
"dev": {
|
|
155
|
-
"build_command": "npm run build",
|
|
156
|
-
"local_dist_path": "./dist",
|
|
157
|
-
"servers": [
|
|
158
|
-
{
|
|
159
|
-
"host": "dev.example.com",
|
|
160
|
-
"port": 22,
|
|
161
|
-
"username": "deploy",
|
|
162
|
-
"remote_deploy_path": "/var/www/dev",
|
|
163
|
-
"delete_old": false
|
|
164
|
-
}
|
|
165
|
-
],
|
|
166
|
-
"remote_tmp": "/tmp",
|
|
167
|
-
"sub_environments": {
|
|
168
|
-
"admin": {
|
|
169
|
-
"build_command": "npm run build:admin",
|
|
170
|
-
"remote_deploy_path": "/var/www/dev/admin"
|
|
171
|
-
},
|
|
172
|
-
"shop": {
|
|
173
|
-
"build_command": "npm run build:shop",
|
|
174
|
-
"remote_deploy_path": "/var/www/dev/shop"
|
|
175
|
-
},
|
|
176
|
-
"cu": {
|
|
177
|
-
"build_command": "npm run build:cu",
|
|
178
|
-
"remote_deploy_path": "/var/www/dev/cu"
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Deploy to sub-environments:
|
|
187
|
-
```bash
|
|
188
|
-
shipfe deploy --profile dev-admin
|
|
189
|
-
shipfe deploy --profile dev-shop
|
|
190
|
-
shipfe deploy --profile dev-cu
|
|
191
|
-
|
|
192
|
-
# Deploy to all sub-environments at once
|
|
193
|
-
shipfe deploy --profile dev --all-sub
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Deploy all sub-environments at once
|
|
197
|
-
```bash
|
|
198
|
-
shipfe deploy --profile dev --all-sub
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
This will deploy to all sub-environments (admin, shop, cu) in sequence.
|
|
202
|
-
|
|
203
|
-
Sub-environments inherit settings from the parent environment and can override `build_command`, `local_dist_path`, and `remote_deploy_path`.
|
|
204
|
-
|
|
205
|
-
### Atomic Deployment
|
|
206
|
-
|
|
207
|
-
Shipfe supports atomic deployment to minimize downtime. When using `--atomic`, the deployment creates a timestamped release directory and updates a `current` symlink for zero-downtime switching.
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
# Atomic deployment to default environment
|
|
211
|
-
shipfe deploy --atomic
|
|
212
|
-
|
|
213
|
-
# Atomic deployment to specific environment
|
|
214
|
-
shipfe deploy --profile prod --atomic
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
**Directory Structure:**
|
|
218
|
-
```
|
|
219
|
-
remote_deploy_path/
|
|
220
|
-
├── releases/
|
|
221
|
-
│ ├── 20260303_034945/
|
|
222
|
-
│ ├── 20260303_035012/
|
|
223
|
-
│ └── 20260303_035045/
|
|
224
|
-
└── current -> releases/20260303_035045
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
Your web server should serve from `remote_deploy_path/current`.
|
|
228
|
-
|
|
229
|
-
**Or use environment variable for all servers:**
|
|
230
|
-
```bash
|
|
231
|
-
export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
|
|
232
|
-
shipfe deploy --profile prod
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### Authentication
|
|
236
|
-
|
|
237
|
-
Shipfe supports multiple SSH authentication methods for each server individually. For each server, authentication methods are tried in this order:
|
|
238
|
-
|
|
239
|
-
1. **Password authentication**: If `password` is set in that server's config
|
|
240
|
-
2. **SSH Private Key from environment**: If `SSH_PRIVATE_KEY` environment variable is set (applies to all servers)
|
|
241
|
-
3. **SSH Key file**: If `key_path` is set in that server's config
|
|
242
|
-
|
|
243
|
-
#### Usage Examples:
|
|
244
|
-
|
|
245
|
-
```bash
|
|
246
|
-
# Each server can use different authentication
|
|
247
|
-
shipfe deploy --profile prod
|
|
248
|
-
|
|
249
|
-
# Or override with environment variable for all servers
|
|
250
|
-
export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
|
|
251
|
-
shipfe deploy --profile prod
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
#### SSH Key Setup for Individual Servers:
|
|
255
|
-
|
|
256
|
-
1. **Generate SSH key pairs** for each server:
|
|
257
|
-
```bash
|
|
258
|
-
# For server 1
|
|
259
|
-
ssh-keygen -t rsa -b 4096 -f ~/.ssh/server1_key -C "server1"
|
|
260
|
-
|
|
261
|
-
# For server 2
|
|
262
|
-
ssh-keygen -t rsa -b 4096 -f ~/.ssh/server2_key -C "server2"
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
2. **Copy public keys to respective servers**:
|
|
266
|
-
```bash
|
|
267
|
-
ssh-copy-id -i ~/.ssh/server1_key.pub user@server1.com
|
|
268
|
-
ssh-copy-id -i ~/.ssh/server2_key.pub user@server2.com
|
|
269
|
-
```
|
|
29
|
+
## 文档
|
|
270
30
|
|
|
271
|
-
|
|
272
|
-
```json
|
|
273
|
-
{
|
|
274
|
-
"servers": [
|
|
275
|
-
{
|
|
276
|
-
"host": "server1.com",
|
|
277
|
-
"key_path": "~/.ssh/server1_key"
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
"host": "server2.com",
|
|
281
|
-
"key_path": "~/.ssh/server2_key"
|
|
282
|
-
}
|
|
283
|
-
]
|
|
284
|
-
}
|
|
285
|
-
```
|
|
31
|
+
📖 [完整文档](https://master-jian.github.io/shipfe-rust/)
|
|
286
32
|
|
|
287
|
-
##
|
|
33
|
+
## 常用命令
|
|
288
34
|
|
|
289
|
-
-
|
|
290
|
-
-
|
|
291
|
-
-
|
|
292
|
-
- SSH-based deployment
|
|
293
|
-
- Automatic backup and rollback
|
|
294
|
-
- Detailed logging
|
|
35
|
+
- `shipfe deploy --profile <env>` - 部署到指定环境
|
|
36
|
+
- `shipfe deploy --atomic` - 原子部署
|
|
37
|
+
- `shipfe rollback --profile <env> --to <timestamp>` - 回滚到指定版本
|
|
295
38
|
|
|
296
|
-
##
|
|
39
|
+
## 许可证
|
|
297
40
|
|
|
298
41
|
MIT
|
package/README_CN.md
CHANGED
|
@@ -6,18 +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
9
|
## 安装
|
|
22
10
|
|
|
23
11
|
```bash
|
|
@@ -38,260 +26,15 @@ shipfe init
|
|
|
38
26
|
shipfe deploy --profile prod
|
|
39
27
|
```
|
|
40
28
|
|
|
41
|
-
##
|
|
42
|
-
|
|
43
|
-
### 初始化项目
|
|
44
|
-
```bash
|
|
45
|
-
shipfe init
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 部署到环境
|
|
49
|
-
```bash
|
|
50
|
-
# 部署到默认环境
|
|
51
|
-
shipfe deploy
|
|
52
|
-
|
|
53
|
-
# 部署到指定环境
|
|
54
|
-
shipfe deploy --profile dev
|
|
55
|
-
|
|
56
|
-
# 部署到子环境
|
|
57
|
-
shipfe deploy --profile dev-admin
|
|
58
|
-
|
|
59
|
-
# 部署到所有子环境
|
|
60
|
-
shipfe deploy --profile dev --all-sub
|
|
61
|
-
|
|
62
|
-
# 原子部署(创建 releases/时间戳 并更新 current 符号链接)
|
|
63
|
-
shipfe deploy --atomic
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 回滚部署
|
|
67
|
-
```bash
|
|
68
|
-
# 回滚主环境
|
|
69
|
-
shipfe rollback --profile prod --to 20260303_034945
|
|
70
|
-
|
|
71
|
-
# 回滚子环境
|
|
72
|
-
shipfe rollback --profile prod-admin --to 20260303_034945
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## 配置
|
|
76
|
-
|
|
77
|
-
编辑 `shipfe.config.json` 来配置您的部署设置:
|
|
78
|
-
|
|
79
|
-
```json
|
|
80
|
-
{
|
|
81
|
-
"environments": {
|
|
82
|
-
"dev": {
|
|
83
|
-
"build_command": "npm run build",
|
|
84
|
-
"local_dist_path": "./dist",
|
|
85
|
-
"servers": [
|
|
86
|
-
{
|
|
87
|
-
"host": "dev.example.com",
|
|
88
|
-
"port": 22,
|
|
89
|
-
"username": "deploy",
|
|
90
|
-
"remote_deploy_path": "/var/www/dev",
|
|
91
|
-
"delete_old": false
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
|
-
"remote_tmp": "/tmp"
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### 认证选项
|
|
101
|
-
|
|
102
|
-
每个服务器可以有自己的认证方法。Shipfe 按以下顺序尝试认证方法:
|
|
103
|
-
|
|
104
|
-
1. **密码**(如果在服务器配置中设置了 `password`)
|
|
105
|
-
2. **环境变量中的 SSH 私钥**(如果设置了 `SSH_PRIVATE_KEY` 环境变量)
|
|
106
|
-
3. **SSH 密钥文件**(如果在服务器配置中设置了 `key_path`)
|
|
107
|
-
|
|
108
|
-
**使用不同认证方法的多个服务器示例:**
|
|
109
|
-
|
|
110
|
-
```json
|
|
111
|
-
{
|
|
112
|
-
"environments": {
|
|
113
|
-
"prod": {
|
|
114
|
-
"build_command": "npm run build",
|
|
115
|
-
"local_dist_path": "./dist",
|
|
116
|
-
"servers": [
|
|
117
|
-
{
|
|
118
|
-
"host": "web1.prod.com",
|
|
119
|
-
"port": 22,
|
|
120
|
-
"username": "deploy",
|
|
121
|
-
"password": "web1_password",
|
|
122
|
-
"remote_deploy_path": "/var/www/prod",
|
|
123
|
-
"delete_old": false
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
"host": "web2.prod.com",
|
|
127
|
-
"port": 22,
|
|
128
|
-
"username": "deploy",
|
|
129
|
-
"key_path": "/home/user/.ssh/web2_key",
|
|
130
|
-
"remote_deploy_path": "/var/www/prod",
|
|
131
|
-
"delete_old": false
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"host": "web3.prod.com",
|
|
135
|
-
"port": 22,
|
|
136
|
-
"username": "deploy",
|
|
137
|
-
"remote_deploy_path": "/var/www/prod",
|
|
138
|
-
"delete_old": false
|
|
139
|
-
}
|
|
140
|
-
],
|
|
141
|
-
"remote_tmp": "/tmp"
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### 子环境
|
|
148
|
-
|
|
149
|
-
对于在同一服务器部署多个应用或不同配置,使用子环境:
|
|
150
|
-
|
|
151
|
-
```json
|
|
152
|
-
{
|
|
153
|
-
"environments": {
|
|
154
|
-
"dev": {
|
|
155
|
-
"build_command": "npm run build",
|
|
156
|
-
"local_dist_path": "./dist",
|
|
157
|
-
"servers": [
|
|
158
|
-
{
|
|
159
|
-
"host": "dev.example.com",
|
|
160
|
-
"port": 22,
|
|
161
|
-
"username": "deploy",
|
|
162
|
-
"remote_deploy_path": "/var/www/dev",
|
|
163
|
-
"delete_old": false
|
|
164
|
-
}
|
|
165
|
-
],
|
|
166
|
-
"remote_tmp": "/tmp",
|
|
167
|
-
"sub_environments": {
|
|
168
|
-
"admin": {
|
|
169
|
-
"build_command": "npm run build:admin",
|
|
170
|
-
"remote_deploy_path": "/var/www/dev/admin"
|
|
171
|
-
},
|
|
172
|
-
"shop": {
|
|
173
|
-
"build_command": "npm run build:shop",
|
|
174
|
-
"remote_deploy_path": "/var/www/dev/shop"
|
|
175
|
-
},
|
|
176
|
-
"cu": {
|
|
177
|
-
"build_command": "npm run build:cu",
|
|
178
|
-
"remote_deploy_path": "/var/www/dev/cu"
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
部署到子环境:
|
|
187
|
-
```bash
|
|
188
|
-
shipfe deploy --profile dev-admin
|
|
189
|
-
shipfe deploy --profile dev-shop
|
|
190
|
-
shipfe deploy --profile dev-cu
|
|
191
|
-
|
|
192
|
-
# 一次部署到所有子环境
|
|
193
|
-
shipfe deploy --profile dev --all-sub
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### 一次部署所有子环境
|
|
197
|
-
```bash
|
|
198
|
-
shipfe deploy --profile dev --all-sub
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
这将按顺序部署到所有子环境(admin、shop、cu)。
|
|
202
|
-
|
|
203
|
-
子环境继承父环境的设置,可以覆盖 `build_command`、`local_dist_path` 和 `remote_deploy_path`。
|
|
204
|
-
|
|
205
|
-
### 原子部署
|
|
206
|
-
|
|
207
|
-
Shipfe 支持原子部署以最小化停机时间。使用 `--atomic` 时,部署会创建一个带时间戳的发布目录,并更新 `current` 符号链接,实现零停机切换。
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
# 原子部署到默认环境
|
|
211
|
-
shipfe deploy --atomic
|
|
212
|
-
|
|
213
|
-
# 原子部署到指定环境
|
|
214
|
-
shipfe deploy --profile prod --atomic
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
**目录结构:**
|
|
218
|
-
```
|
|
219
|
-
remote_deploy_path/
|
|
220
|
-
├── releases/
|
|
221
|
-
│ ├── 20260303_034945/
|
|
222
|
-
│ ├── 20260303_035012/
|
|
223
|
-
│ └── 20260303_035045/
|
|
224
|
-
└── current -> releases/20260303_035045
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
您的 Web 服务器应从 `remote_deploy_path/current` 提供服务。
|
|
228
|
-
|
|
229
|
-
**或为所有服务器使用环境变量:**
|
|
230
|
-
```bash
|
|
231
|
-
export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
|
|
232
|
-
shipfe deploy --profile prod
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### 认证
|
|
236
|
-
|
|
237
|
-
Shipfe 支持为每个服务器单独设置多种 SSH 认证方法。对于每个服务器,按以下顺序尝试认证方法:
|
|
238
|
-
|
|
239
|
-
1. **密码认证**:如果该服务器配置中设置了 `password`
|
|
240
|
-
2. **环境变量中的 SSH 私钥**:如果设置了 `SSH_PRIVATE_KEY` 环境变量(适用于所有服务器)
|
|
241
|
-
3. **SSH 密钥文件**:如果该服务器配置中设置了 `key_path`
|
|
242
|
-
|
|
243
|
-
#### 使用示例:
|
|
244
|
-
|
|
245
|
-
```bash
|
|
246
|
-
# 每个服务器可以使用不同的认证
|
|
247
|
-
shipfe deploy --profile prod
|
|
248
|
-
|
|
249
|
-
# 或为所有服务器使用环境变量覆盖
|
|
250
|
-
export SSH_PRIVATE_KEY="$(cat ~/.ssh/prod_key)"
|
|
251
|
-
shipfe deploy --profile prod
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
#### 为单个服务器设置 SSH 密钥:
|
|
255
|
-
|
|
256
|
-
1. **为每个服务器生成 SSH 密钥对**:
|
|
257
|
-
```bash
|
|
258
|
-
# 服务器 1
|
|
259
|
-
ssh-keygen -t rsa -b 4096 -f ~/.ssh/server1_key -C "server1"
|
|
260
|
-
|
|
261
|
-
# 服务器 2
|
|
262
|
-
ssh-keygen -t rsa -b 4096 -f ~/.ssh/server2_key -C "server2"
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
2. **将公钥复制到相应服务器**:
|
|
266
|
-
```bash
|
|
267
|
-
ssh-copy-id -i ~/.ssh/server1_key.pub user@server1.com
|
|
268
|
-
ssh-copy-id -i ~/.ssh/server2_key.pub user@server2.com
|
|
269
|
-
```
|
|
29
|
+
## 文档
|
|
270
30
|
|
|
271
|
-
|
|
272
|
-
```json
|
|
273
|
-
{
|
|
274
|
-
"servers": [
|
|
275
|
-
{
|
|
276
|
-
"host": "server1.com",
|
|
277
|
-
"key_path": "~/.ssh/server1_key"
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
"host": "server2.com",
|
|
281
|
-
"key_path": "~/.ssh/server2_key"
|
|
282
|
-
}
|
|
283
|
-
]
|
|
284
|
-
}
|
|
285
|
-
```
|
|
31
|
+
📖 [完整文档](https://master-jian.github.io/shipfe-rust/)
|
|
286
32
|
|
|
287
|
-
##
|
|
33
|
+
## 常用命令
|
|
288
34
|
|
|
289
|
-
-
|
|
290
|
-
-
|
|
291
|
-
-
|
|
292
|
-
- 基于 SSH 的部署
|
|
293
|
-
- 自动备份和回滚
|
|
294
|
-
- 详细日志记录
|
|
35
|
+
- `shipfe deploy --profile <env>` - 部署到指定环境
|
|
36
|
+
- `shipfe deploy --atomic` - 原子部署
|
|
37
|
+
- `shipfe rollback --profile <env> --to <timestamp>` - 回滚到指定版本
|
|
295
38
|
|
|
296
39
|
## 许可证
|
|
297
40
|
|
package/bin/shipfe
CHANGED
|
Binary file
|