Docs / Getting Started / Your First Deploy

Your First Deploy

Deploy your first application on sh0 in under five minutes. This guide walks you through every step, from creating a stack to seeing your app live.

Overview

Deploying an app on sh0 follows a simple flow:

  1. Create a Stack -- A stack groups related services together (like an app and its database).
  2. Add an App -- Point sh0 to a Git repository or choose a template.
  3. Configure Domain -- Assign a domain or use the default *.sh0.app subdomain.
  4. Deploy -- sh0 builds and launches your app automatically.
  5. Verify -- Visit your app and confirm everything works.
Tip
For this guide, we will deploy a simple Node.js app from a public Git repository. You can follow along with your own project or use our example repo.

Step 1: Create a Stack

Stacks are the top-level organizational unit in sh0. Think of a stack as a project folder that groups an app with its related services (databases, caches, workers).

  1. From the dashboard, click the New Stack button in the top-right corner.
  2. Enter a name for your stack (e.g., my-first-app).
  3. Optionally add a description to help identify the stack later.
  4. Click Create Stack.
New Stack dialog with a name field showing 'my-first-app', a description field, and a Create Stack button
Creating a new stack

Your new stack appears in the stack list. Click on it to open the stack detail view, where you will add your first app.

Empty stack detail view with an 'Add App' button prominently displayed in the center, plus tabs for Apps, Environment, Settings
A fresh stack ready for its first app

Step 2: Add an App

Inside your stack, click Add App. You can deploy from a Git repository, a Docker image, or a pre-built template.

From Git Repository

The most common way to deploy. Provide a Git URL and sh0 handles the rest:

  1. Select Git Repository as the source.
  2. Enter the repository URL. For this example, use our demo app:
    Repository URL
    https://github.com/sh0-dev/demo-node-app
  3. Choose the branch to deploy (defaults to main).
  4. sh0 automatically detects the project stack (Node.js, Python, Go, etc.) and selects the appropriate build configuration.
  5. Click Add App.
Add App form showing Git Repository selected, with a URL field containing a GitHub URL, branch selector set to 'main', and auto-detected stack showing 'Node.js'
Adding an app from a Git repository
Private Repositories
For private repos, you need to connect a Git provider first. Go to Settings > Git Providers to link your GitHub, GitLab, or Bitbucket account. Alternatively, you can add a deploy SSH key.

From Template

If you want to deploy a popular application without writing any code, use a template:

  1. Select Template as the source.
  2. Browse or search the template library (170+ options including WordPress, Ghost, Plausible, Uptime Kuma, and more).
  3. Click on a template to see its details -- required resources, included services, and default configuration.
  4. Click Deploy Template.
Template gallery showing a grid of application templates with icons, names, and descriptions -- WordPress, PostgreSQL, Redis, Ghost, Plausible, Uptime Kuma visible
Browse over 170 one-click deploy templates

Step 3: Configure Domain

Every app needs a domain to be accessible. sh0 offers two options:

Default Subdomain

sh0 automatically assigns a subdomain like my-first-app.sh0.app. No DNS configuration needed -- perfect for testing.

Custom Domain

Use your own domain (e.g., app.yourdomain.com). Requires adding an A record pointing to your server's IP. SSL is automatic.

To configure a domain for your app:

  1. In your app settings, go to the Domains tab.
  2. Click Add Domain.
  3. Enter your domain name (or keep the default .sh0.app subdomain).
  4. If using a custom domain, add an A record at your DNS provider pointing to your server's IP address.
  5. Click Save. sh0 will automatically provision an SSL certificate.
Domain configuration tab showing a domain input field, DNS instructions with the server IP, and an SSL status indicator showing 'Certificate Active'
Adding a custom domain with automatic SSL

Step 4: Deploy

With your app configured, it is time to deploy. Click the Deploy button. sh0 will:

  1. Clone the Git repository (or pull the Docker image)
  2. Detect the project stack and generate a Dockerfile
  3. Build the container image
  4. Start the new container and run health checks
  5. Configure the reverse proxy to route traffic
  6. Mark the deployment as live
Deployment progress view showing a real-time build log with steps: Cloning repository, Detecting stack (Node.js 20), Building image, Starting container, Running health check, Configuring proxy -- each with a green checkmark
Real-time deployment progress with build logs

You can watch the build logs in real time. A typical deployment for a Node.js app takes 30-90 seconds, depending on the size of your dependencies.

Build Cache
sh0 caches Docker layers between builds. Subsequent deployments are significantly faster because only changed layers need to be rebuilt. A cached Node.js build typically completes in under 15 seconds.
Build log showing detailed output: npm install progress, dependency tree, build output, and final container start confirmation
Detailed build output during deployment

Step 5: Verify

Once the deployment completes, your app is live. Verify it is running:

  1. Click the domain link shown in the app overview to open your app in a new tab.
  2. Check the app status indicator -- it should show a green Running badge.
  3. Review the deployment entry in the Deployments tab to see the full history.
App overview page showing status 'Running' with a green badge, the domain link, resource usage (CPU, memory), uptime, and deployment history below
Your app is live and running

You can also verify from the command line:

Terminal
curl -I https://my-first-app.sh0.app
Response
HTTP/2 200
content-type: text/html; charset=utf-8
server: Caddy
x-powered-by: sh0
DNS Propagation
If you used a custom domain, it may take up to 24 hours for DNS changes to propagate globally, though most updates complete within minutes. Use the default .sh0.app subdomain for immediate access while waiting.

What's Next

Congratulations -- your first app is deployed. Here are some recommended next steps: