Installation
Get sh0 running on a clean server in under a minute. One command downloads the binary -- sh0 handles all dependencies automatically.
System Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Linux (any distro) | Ubuntu 22.04+ / Debian 12+ |
| RAM | 1 GB | 2 GB+ |
| Disk | 10 GB | 20 GB+ (SSD) |
| CPU | 1 vCPU | 2 vCPUs+ |
| Docker | Auto-installed by sh0 if missing | |
Supported Platforms
sh0 provides pre-built binaries for the following architectures:
x86_64(AMD64) -- Most cloud servers and VPS providersaarch64(ARM64) -- AWS Graviton, Oracle Ampere, Raspberry Pi 4+
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:
curl -fsSL https://get.sh0.dev | bashThe script performs these steps:
- Detects your CPU architecture (x86_64 or aarch64)
- Downloads the latest sh0 binary to
/usr/local/bin/sh0 - Sets executable permissions
- Creates a systemd service unit
- 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:
# 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 --versionsh0-linux-x64.tar.gz: OK
sh0 1.10.2A 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:
# Check the version
sh0 --version
# Check the service status
systemctl status sh0
# Verify the API answers
curl -s http://localhost:9000/api/v1/healthThe health endpoint should return a JSON response confirming the server is operational:
{"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:
[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.targetKillMode=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:
sudo systemctl daemon-reload
sudo systemctl enable sh0
sudo systemctl start sh0journalctl -u sh0 -f.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:
| Port | Protocol | Purpose |
|---|---|---|
| 80 | TCP | HTTP traffic (redirects to HTTPS) |
| 443 | TCP | HTTPS traffic for your deployed applications |
| 9000 | TCP | sh0 dashboard and API |
If you are using ufw (Ubuntu/Debian):
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 9000/tcpUpdating 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:
sudo sh0 updateChannels, rollback, and the host checks of sh0 doctor are covered in Updates & Diagnostics.