Docs / Getting Started / Installation

Installation

Get sh0 running on a clean server in under a minute. One command downloads the binary -- sh0 handles all dependencies automatically.

System Requirements

RequirementMinimumRecommended
OSLinux (any distro)Ubuntu 22.04+ / Debian 12+
RAM1 GB2 GB+
Disk10 GB20 GB+ (SSD)
CPU1 vCPU2 vCPUs+
DockerAuto-installed by sh0 if missing
Note
At idle, sh0 and its Caddy use about 140 MB of memory together. The RAM requirement is primarily for Docker and the applications you deploy. A 1 GB server can comfortably run sh0 plus 2-3 small apps.

Supported Platforms

sh0 provides pre-built binaries for the following architectures:

  • x86_64 (AMD64) -- Most cloud servers and VPS providers
  • aarch64 (ARM64) -- AWS Graviton, Oracle Ampere, Raspberry Pi 4+
Zero Dependencies
sh0 should be installed on a clean server. When you run sh0 serve as root, it automatically detects and installs Docker and Caddy if they are missing. No manual setup required.

Install sh0

Quick Install (Recommended)

The install script detects your architecture, downloads the latest binary, and sets up the systemd service automatically:

Terminal
curl -fsSL https://get.sh0.dev | bash
Terminal output showing the sh0 install script downloading the binary, setting permissions, and starting the service
The install script completes in a few seconds

The script performs these steps:

  1. Detects your CPU architecture (x86_64 or aarch64)
  2. Downloads the latest sh0 binary to /usr/local/bin/sh0
  3. Sets executable permissions
  4. Creates a systemd service unit
  5. Enables and starts the service

Manual Download

If you prefer to install manually, download the release archive from GitHub and check it against the published checksums before extracting it:

Terminal
# Download the archive and the checksums (use sh0-linux-arm64.tar.gz on ARM64)
curl -fsSLO https://github.com/zerosuite-inc/sh0/releases/latest/download/sh0-linux-x64.tar.gz
curl -fsSLO https://github.com/zerosuite-inc/sh0/releases/latest/download/checksums.txt

# Check the archive, then extract it
sha256sum --ignore-missing -c checksums.txt
tar -xzf sh0-linux-x64.tar.gz

# Install the binary
sudo install -m 0755 sh0 /usr/local/bin/sh0
sh0 --version
Output
sh0-linux-x64.tar.gz: OK
sh0 1.10.2

A manual installation does not create the systemd service: set it up as described below, then start it.

Verify Installation

Check that sh0 is installed and running:

Terminal
# Check the version
sh0 --version

# Check the service status
systemctl status sh0

# Verify the API answers
curl -s http://localhost:9000/api/v1/health
Terminal showing sh0 version output and systemctl status showing the service as active and running
A healthy sh0 installation

The health endpoint should return a JSON response confirming the server is operational:

Health Response
{"data":{"license":{"plan":"business","status":"active"},"mode":"selfhosted","needs_setup":false,"status":"ok","version":"1.10.3-rc9"}}

Systemd Service Setup

If you used the quick install script, the systemd service is already configured. For a manual installation, create the same service file the installer writes:

/etc/systemd/system/sh0.service
[Unit]
Description=sh0 -- Self-Hosted PaaS
Documentation=https://sh0.dev/docs
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service

[Service]
Type=simple
ExecStart=/usr/local/bin/sh0 serve
Restart=always
RestartSec=5
Environment=RUST_LOG=info
WorkingDirectory=/var/lib/sh0
KillMode=process
NoNewPrivileges=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
RestrictRealtime=true
LockPersonality=true
LimitNOFILE=65535:524288
StandardOutput=journal
StandardError=journal
SyslogIdentifier=sh0

[Install]
WantedBy=multi-user.target
Note
Keep KillMode=process. Without it, restarting the sh0 service also stops the processes it started, and your applications go down for the length of the restart.

Then enable and start the service:

Terminal
sudo systemctl daemon-reload
sudo systemctl enable sh0
sudo systemctl start sh0
Tip
The systemd service ensures sh0 starts automatically after a server reboot and restarts if it crashes. Logs are available via journalctl -u sh0 -f.
Note
The system object store (MinIO) runs the community image pgsty/minio (Pigsty), pinned by digest. It is not an official MinIO source. To use another MinIO-compatible image, add Environment=SH0_MINIO_IMAGE=<image> to the service environment, run systemctl daemon-reload, remove the sh0-system-minio container and restart sh0: the image only applies when the container is created, and the data volume is kept.

Firewall Configuration

sh0 requires the following ports to be accessible:

PortProtocolPurpose
80TCPHTTP traffic (redirects to HTTPS)
443TCPHTTPS traffic for your deployed applications
9000TCPsh0 dashboard and API

If you are using ufw (Ubuntu/Debian):

Terminal
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 9000/tcp
Dashboard Security
Port 9000 provides full access to your sh0 dashboard. In production, consider restricting access to trusted IPs or placing it behind a VPN. You can also configure sh0 to serve the dashboard through Caddy on a custom domain with SSL.

Updating sh0

Your configuration, deployed apps, and data live in the data directory, not inside the binary, so updating replaces only the binary. The built-in command downloads the latest final release, checks it, and keeps the previous version for a rollback:

Terminal
sudo sh0 update

Channels, rollback, and the host checks of sh0 doctor are covered in Updates & Diagnostics.

Note
sh0 automatically handles database migrations when it starts. After updating, any schema changes are applied seamlessly.