Docs/ CLI/ Despliegue por push

Despliegue por push

Despliega desde un directorio local con sh0 push. Sin repositorio Git requerido.

Qué es Push Deploy

sh0 push toma un directorio local, detecta el stack (Node.js, Python, Go, Rust, etc.), empaqueta los archivos, los sube a tu servidor, construye un contenedor y devuelve una URL en vivo. Todo el flujo ocurre en un comando.

Esta es la forma más rápida de ir del código a un despliegue en ejecución. Sin configuración Git, sin configuración de repositorio, sin integración de webhooks -- solo push y listo.

Uso básico

Deploy current directory
sh0 push

Salida:

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

También puedes hacer push de un directorio específico o personalizar el nombre de la app:

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

Cómo funciona

El flujo de push tiene seis pasos:

  1. Resolver directorio -- Por defecto al directorio actual. Verifica que la ruta exista.
  2. Verificar vínculo -- Si .sh0/link.json existe, es un re-push a una app existente.
  3. Detectar stack -- Identifica el framework y lenguaje (más de 20 stacks soportados).
  4. Ejecutar verificación de salud -- Puntúa el proyecto en mejores prácticas. Advierte sobre problemas bloqueantes.
  5. Empaquetar y subir -- Crea un ZIP en memoria, respetando patrones de exclusión. Sube vía formulario multipart.
  6. Construir y desplegar -- El servidor construye un contenedor, lo inicia y asigna un dominio. Los logs de build se transmiten en tiempo real.

Opciones

OpciónPor defectoDescripción
[path].Directorio a subir
--name <name>Nombre del directorioNombre de la app (minúsculas, alfanumérico, guiones)
--project <id>Proyecto por defectoProyecto donde desplegar
--port <port>AutodetectadoPuerto de la aplicación dentro del contenedor
--no-checkfalseOmitir la verificación de salud
--timeout <secs>600Máximo de segundos a esperar para el despliegue

.sh0ignore

Controla qué archivos se excluyen de la carga. Usa la misma sintaxis que .gitignore. Si no existe .sh0ignore, el CLI recurre a .dockerignore, luego .gitignore.

.sh0ignore
# Build artifacts
node_modules/
dist/
.next/

# Environment
.env
.env.*

# IDE
.vscode/
.idea/

Los siguientes directorios se excluyen siempre, independientemente de los archivos de exclusión:

  • .git/, node_modules/, __pycache__/, .env*
  • target/, .next/, .nuxt/, .svelte-kit/, dist/
  • venv/, .venv/, .sh0/, .DS_Store

Después del primer push, el CLI crea .sh0/link.json en tu directorio de proyecto. Este archivo vincula el directorio local a la app remota para que los pushes subsiguientes actualicen el mismo despliegue.

.sh0/link.json
{
  "app_id": "a1b2c3d4",
  "app_name": "my-app",
  "server_url": "https://panel.example.com"
}
Tip
Agrega .sh0/ a tu .gitignore. El archivo de vínculo contiene información específica del servidor y no debe compartirse entre ambientes.

Verificaciones de salud

Antes de subir, sh0 push ejecuta la misma verificación de salud del código disponible vía sh0 check. Puntúa tu proyecto de 0 a 100 y advierte sobre problemas que podrían causar fallos de build.

Omite la verificación de salud con --no-check si sabes lo que haces.

Comportamiento de re-push

Cuando .sh0/link.json existe, ejecutar sh0 push sube a la app existente en lugar de crear una nueva. El servidor crea un nuevo despliegue, construye el código actualizado y realiza un intercambio blue-green si está configurado.

Para desplegar como una nueva app, usa --name new-app-name o elimina .sh0/link.json.

Auto-Push con sh0 watch

Para desarrollo, usa sh0 watch para re-push automáticamente en cambios de archivos:

Watch mode
sh0 watch --debounce 3000

Esto observa el directorio actual y re-push después de 3 segundos de inactividad. Respeta patrones .sh0ignore y ejecuta un push inicial al arrancar. Ver la Referencia de comandos para todas las opciones.

Integración CI/CD

Usa sh0 push en pipelines CI/CD para proyectos que no usan despliegue basado en Git. Aquí hay un ejemplo de 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