Business Plan Feature

Deploy across multiple servers

Register remote nodes via SSH. Build once, deploy anywhere. sh0 handles image transfer, routing, and health monitoring across your entire fleet.

Everything you need for multi-server

Register nodes, transfer images, route traffic, and monitor health -- all from one dashboard.

SSH registration
Add remote servers with hostname, port, user, and key or password authentication
Pure Rust SSH tunneling
Built on the russh library -- no system OpenSSH dependency required
Image transfer via SSH
Build once on the main server, tar and transfer images to any remote node
Per-node deployment
Assign each app to a specific server in your fleet from the dashboard
Heartbeat monitoring
Every 30 seconds, sh0 checks each node -- tracks pending, active, offline, draining, and error states
Real-time node stats
CPU, memory, disk usage, and container count for every registered node via the status API
Automatic Caddy routing
Reverse proxy auto-configured to route traffic to remote containers (node_ip:host_port)
Encrypted key storage
SSH private keys encrypted at rest with AES-256-GCM using your server master key

How it works

01

Register a node

Enter the SSH credentials for your remote server -- hostname, port, user, and private key or password. sh0 tests the connection immediately.

02

Build your app

The Docker build happens on your main sh0 server, exactly like a single-server deployment. No tooling needed on the remote node.

03

Transfer the image

sh0 exports the image as a tar archive and streams it to the remote node over SSH. The remote Docker daemon loads it automatically.

04

Route traffic

Caddy is auto-configured to proxy incoming requests to the remote container. HTTPS certificates are provisioned on the main server as usual.

The multi-server architecture

Main Server
Docker Build
SSH Transfer
Remote Node
Caddy Route
Live Traffic

Build centrally, deploy to any node, route automatically -- no orchestration framework required

Built for production fleets

Fleet-wide dashboard

See all your nodes and their containers in one place. Filter by status, sort by resource usage, drill into individual nodes.

Health monitoring

Heartbeat every 30 seconds. If a node goes offline, sh0 marks it immediately. Re-deploy to a healthy node in one click.

Secure by default

SSH keys are encrypted at rest. Connections use standard SSH protocol. No agents or daemons to install on remote servers.

Node draining

Set a node to "draining" to stop new deployments while existing containers finish gracefully. Then decommission safely.

Any Linux server

Works with any server running Docker and SSH. Ubuntu, Debian, CentOS, Fedora, Alpine -- any provider, any datacenter.

Resource-aware placement

View CPU, memory, and disk stats per node before deploying. Place workloads where capacity is available.

The old way

  • x Write Ansible playbooks for each server
  • x Install Docker manually on every node
  • x Push images to a private registry
  • x Configure load balancer per service
  • x Set up monitoring on each node separately
  • x SSH into servers to debug issues

The sh0 way

  • Register node with SSH credentials
  • Docker is the only prerequisite
  • Direct image transfer, no registry
  • Caddy routes traffic automatically
  • Heartbeat + stats for all nodes
  • Manage everything from one dashboard

Questions & answers

What operating systems are supported on remote nodes? +
Any Linux distribution with Docker installed and SSH access. Ubuntu, Debian, CentOS, Fedora, Alpine, and others are all supported. The remote server does not need sh0 installed -- only Docker and an SSH daemon.
What SSH key formats are supported? +
sh0 supports RSA, Ed25519, and ECDSA keys in OpenSSH format. Password authentication is also supported but key-based auth is recommended for security.
Is there a maximum number of nodes? +
There is no hard limit in the software. Practical limits depend on your Business plan tier and the resources of your main sh0 server (each node connection uses minimal overhead).
What happens if a remote node goes offline? +
sh0 detects the failure within 30 seconds via heartbeat. The node status changes to "offline" in the dashboard. Existing containers on other nodes are unaffected. You can re-deploy the affected apps to a healthy node with one click.

Scale beyond a single server.

Register your servers, deploy from one interface, and let sh0 handle routing and monitoring across your fleet.