Push 部署
使用 sh0 push 从本地目录部署。无需 Git 仓库。
什么是 Push 部署
sh0 push 获取本地目录,检测技术栈(Node.js、Python、Go、Rust 等),打包文件,上传到服务器,构建容器并返回在线 URL。整个流程一条命令完成。
这是从代码到运行部署的最快方式。无需 Git 配置,无需仓库配置,无需 Webhook 集成——推送即可。
基本用法
sh0 push输出:
Pushing my-app
Detected nodejs (Next.js) -- 85/100 health
Uploading 42 files (2.3 MB) ··· OK 0.8s
Building ··· OK 32.4s
Deploying ··· OK 2.1s
Live in 35.3s
-> https://my-app.sh0.app您还可以推送特定目录或自定义应用名称:
sh0 push ~/projects/api --name my-api --port 3000工作原理
Push 流程包含六个步骤:
- 解析目录——默认为当前目录。验证路径是否存在。
- 检查链接——如果
.sh0/link.json存在,则为对现有应用的重新推送。 - 检测技术栈——识别框架和语言(支持 20+ 种技术栈)。
- 运行健康检查——根据最佳实践为项目评分。警告阻塞性问题。
- 打包并上传——创建内存中的 ZIP,遵循忽略模式。通过 multipart 表单上传。
- 构建并部署——服务器构建容器,启动它,并分配域名。构建日志实时流式传输。
选项
| 标志 | 默认值 | 描述 |
|---|---|---|
| [path] | . | 要推送的目录 |
| --name <name> | 目录名称 | 应用名称(小写、字母数字、连字符) |
| --project <id> | 默认项目 | 要部署到的项目 |
| --port <port> | 自动检测 | 容器内的应用端口 |
| --no-check | false | 跳过健康检查 |
| --timeout <secs> | 600 | 等待部署的最大秒数 |
.sh0ignore
控制哪些文件从上传中排除。使用与 .gitignore 相同的语法。如果没有 .sh0ignore,CLI 回退到 .dockerignore,然后是 .gitignore。
# Build artifacts
node_modules/
dist/
.next/
# Environment
.env
.env.*
# IDE
.vscode/
.idea/以下目录 始终排除,无论忽略文件如何:
.git/,node_modules/,__pycache__/,.env*target/,.next/,.nuxt/,.svelte-kit/,dist/venv/,.venv/,.sh0/,.DS_Store
.sh0/link.json
首次推送后,CLI 在项目目录中创建 .sh0/link.json。此文件将本地目录链接到远程应用,使后续推送更新同一部署。
{
"app_id": "a1b2c3d4",
"app_name": "my-app",
"server_url": "https://panel.example.com"
}.sh0/ 添加到您的 .gitignore。链接文件包含服务器特定信息,不应跨环境共享。健康检查
在上传之前,sh0 push 运行与 sh0 check 相同的代码健康检查。它为您的项目评分 0 到 100,并警告可能导致构建失败的问题。
如果您清楚自己在做什么,可以使用 --no-check 跳过健康检查。
重新推送行为
当 .sh0/link.json 存在时,运行 sh0 push 会上传到现有应用而非创建新应用。服务器创建新部署,构建更新的代码,并在配置时执行蓝绿切换。
要作为新应用部署,使用 --name new-app-name 或删除 .sh0/link.json。
使用 sh0 watch 自动推送
开发时使用 sh0 watch 自动在文件变更时重新推送:
sh0 watch --debounce 3000这会监视当前目录,在 3 秒无活动后重新推送。遵循 .sh0ignore 模式并在启动时执行初始推送。详见 命令参考 了解所有选项。
CI/CD 集成
在不使用基于 Git 部署的项目的 CI/CD 流水线中使用 sh0 push。以下是 GitHub Actions 示例:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install sh0
run: curl -fsSL https://get.sh0.dev | bash
- name: Deploy
env:
SH0_API_URL: ${{ secrets.SH0_API_URL }}
SH0_API_TOKEN: ${{ secrets.SH0_API_TOKEN }}
run: sh0 push --name my-app