Docs/ CLI/ Push 部署

Push 部署

使用 sh0 push 从本地目录部署。无需 Git 仓库。

什么是 Push 部署

sh0 push 获取本地目录,检测技术栈(Node.js、Python、Go、Rust 等),打包文件,上传到服务器,构建容器并返回在线 URL。整个流程一条命令完成。

这是从代码到运行部署的最快方式。无需 Git 配置,无需仓库配置,无需 Webhook 集成——推送即可。

基本用法

Deploy current directory
sh0 push

输出:

Output
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

您还可以推送特定目录或自定义应用名称:

Custom options
sh0 push ~/projects/api --name my-api --port 3000

工作原理

Push 流程包含六个步骤:

  1. 解析目录——默认为当前目录。验证路径是否存在。
  2. 检查链接——如果 .sh0/link.json 存在,则为对现有应用的重新推送。
  3. 检测技术栈——识别框架和语言(支持 20+ 种技术栈)。
  4. 运行健康检查——根据最佳实践为项目评分。警告阻塞性问题。
  5. 打包并上传——创建内存中的 ZIP,遵循忽略模式。通过 multipart 表单上传。
  6. 构建并部署——服务器构建容器,启动它,并分配域名。构建日志实时流式传输。

选项

标志默认值描述
[path].要推送的目录
--name <name>目录名称应用名称(小写、字母数字、连字符)
--project <id>默认项目要部署到的项目
--port <port>自动检测容器内的应用端口
--no-checkfalse跳过健康检查
--timeout <secs>600等待部署的最大秒数

.sh0ignore

控制哪些文件从上传中排除。使用与 .gitignore 相同的语法。如果没有 .sh0ignore,CLI 回退到 .dockerignore,然后是 .gitignore。

.sh0ignore
# 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

首次推送后,CLI 在项目目录中创建 .sh0/link.json。此文件将本地目录链接到远程应用,使后续推送更新同一部署。

.sh0/link.json
{
  "app_id": "a1b2c3d4",
  "app_name": "my-app",
  "server_url": "https://panel.example.com"
}
Tip
将 .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 自动在文件变更时重新推送:

Watch mode
sh0 watch --debounce 3000

这会监视当前目录,在 3 秒无活动后重新推送。遵循 .sh0ignore 模式并在启动时执行初始推送。详见 命令参考 了解所有选项。

CI/CD 集成

在不使用基于 Git 部署的项目的 CI/CD 流水线中使用 sh0 push。以下是 GitHub Actions 示例:

.github/workflows/deploy.yml
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