Installation
Zeltro runs on Linux and macOS. Windows support is on its way: an installer is coming, and the WSL2 route is in preview (see Windows below).
Run every installer as your normal user, not as root. It asks for your sudo password when it needs it.
One-line install#
These lines install the CLI only. To get the desktop app as well, use the lines under The desktop app instead. They install the CLI for you if it is missing.
| Platform | Command |
|---|---|
| Ubuntu 22.04 / 24.04 / 26.04, and Ubuntu-based distros (Linux Mint, Pop!_OS) | curl -fsSL https://dist.canebaycomputers.com/zeltro/cli/ubuntu | bash |
| Fedora 43 / 44 | curl -fsSL https://dist.canebaycomputers.com/zeltro/cli/fedora | bash |
| Arch Linux | curl -fsSL https://dist.canebaycomputers.com/zeltro/cli/arch | bash |
| macOS | curl -fsSL https://dist.canebaycomputers.com/zeltro/cli/mac | bash |
Each short link redirects to the matching install-<os>.sh in the
zeltro-cli repository.
Debian itself, RHEL, Rocky and Alma are not supported yet. The Ubuntu installer uses Docker's Ubuntu package repository, and the Fedora installer uses Docker's Fedora repository. Neither repository has packages for those distros.
After the install, on Linux, log out and back in (see All Linux). Then run this once:
zeltro configure
Each installer sets up Docker, Node.js (through nvm, if you don't already
have Node 16 or newer), Git, jq, a trash command, ImageMagick,
rsvg-convert and the GitHub CLI. It then clones Zeltro to
/usr/local/share/zeltro-cli and links the zeltro command into
/usr/local/bin. On macOS it also installs the Xcode Command Line Tools,
Homebrew and Docker Desktop if any of them are missing.
zeltro configure does the following:
- writes
/etc/zeltro-cli/.env - picks a private Docker subnet
- creates your projects directory (
~/zeltro-projectsby default) - sets your Git name and email if they aren't set yet
- installs bash tab-completion
- starts the shared services
Platform notes#
All Linux#
The installer adds you to the docker group. Log out and back in (or reboot)
before you use Zeltro, or Docker calls will be denied. Over SSH, reconnecting
is enough.
macOS#
The installer puts in Docker Desktop. Open it once and accept its licence. Docker Desktop is free for personal use, education and small businesses, and larger companies need a paid Docker subscription (Docker's terms). Docker Desktop has to be running whenever you use Zeltro. It supports the current macOS release and the two before it.
Docker Desktop keeps containers inside a VM, so the container IP can't be
reached from the Mac. zeltro status prints a http://localhost:<port>
address for each project instead.
Arch#
pacman -Syu runs a full system upgrade, which often replaces the running kernel. When that happens Docker can't start until you reboot. The installer detects this and prints a REBOOT NOW step. Reboot, then re-run the installer to finish.
Fedora: SELinux#
Fedora runs SELinux in enforcing mode, and Zeltro bind-mounts each project directory into its container.
Docker CE turns off SELinux confinement by default (containers run unconfined as spc_t), so a stock install isn't affected. Once Docker's SELinux support is turned on ("selinux-enabled": true in /etc/docker/daemon.json), an unlabeled project directory gives every container Permission denied.
zeltro configure labels your projects directory container_file_t, so Zeltro works either way. If you move your projects directory by hand, re-run zeltro configure to relabel it.
Windows#
Download the desktop app from
zeltro.ai/download/windows (a beta
Setup .exe; see Downloads). It installs for your account with
no admin rights. Zeltro itself runs on Linux, so there are two ways to run your
projects from it:
- Drive another machine. The desktop app can manage Zeltro on a Linux box or a Mac over SSH. This works today. See Downloads.
- Zeltro in WSL2 (preview). The desktop app's own "Zeltro on this PC" WSL2 setup is still in testing.
There is also an older CLI script, install-windows.ps1. It has been lightly
tested, and it will be retired once the desktop app's WSL2 setup is verified.
It enables WSL2, installs Ubuntu 24.04, and installs and configures Zeltro
inside it. It needs a PowerShell started with Run as administrator:
irm https://raw.githubusercontent.com/CaneBayComputers/zeltro-cli/master/install-windows.ps1 | iex
The script runs in two stages, because turning on the WSL Windows features
needs a reboot. It schedules itself to resume after you log back in. It needs
Windows 10 version 2004 (build 19041) or newer, or Windows 11, and it refuses
older builds before it changes anything. This matches the minimum that
Microsoft gives for wsl --install.
WSL2 needs hardware virtualization: VT-x/AMD-V turned on in BIOS/UEFI, plus
SLAT. If the hypervisor can't start, the Ubuntu download succeeds and then
registering it fails with HCS_E_HYPERV_NOT_INSTALLED. This also rules out
running it inside a VirtualBox VM, because VirtualBox doesn't pass SLAT
through to the guest.
Two things behave differently under WSL:
- WSL shuts an idle distro down and stops its containers with it. Keep a
terminal open, or run
wsl -d Ubuntu-24.04 -u root -e sleep infinity. - Browse projects with the LAN ACCESS address
zeltro statusprints. It is the WSL VM's address, and it changes when WSL restarts, so read it from status each time rather than bookmarking it.
Install from a local checkout#
Use this if you want to work on Zeltro itself. When you run an installer from inside a checkout, it skips the git clone and symlinks /usr/local/share/zeltro-cli to your folder.
git clone https://github.com/CaneBayComputers/zeltro-cli.git
cd zeltro-cli
./install-ubuntu.sh # or install-fedora.sh / install-arch.sh / install-mac.sh
Configuration#
It's safe to re-run zeltro configure. It keeps the existing values from /etc/zeltro-cli/.env as defaults.
| Option | Description |
|---|---|
--git-name <name> |
Git user name |
--git-email <email> |
Git user email |
--projects-dir <dir> |
Projects directory (default: existing, or ~/zeltro-projects) |
--vpc-subnet <A.B.C> |
Docker VPC subnet (default: existing, or a random 10.x.x) |
--non-interactive, -y |
Never prompt; accept defaults for anything not passed as a flag |
For a fully unattended setup, such as a script, CI, or provisioning a machine for an agent:
zeltro configure --non-interactive \
--git-name "Your Name" --git-email "you@example.com"
Zeltro does not ask for AWS credentials or GitHub authentication, and it
needs neither. Nothing in Zeltro uses AWS. You only need GitHub
authentication for the optional --github flags and for clone fork and
clone new-repo. If you use them without it, they tell you to run
gh auth login at that point.
Zeltro picks the Docker VPC subnet for you. It is a private /24 in the
10.x.x range, never 10.0.x, so it can't collide with the 10.0.0.0/24
network that many home and office LANs use. Use --vpc-subnet if you need a
specific range.
Tab-completion covers commands, project names, framework names and installer names:
zeltro ins<TAB> → install
zeltro install gr<TAB> → grafana gramps-web graylog grist grocy
zeltro up <TAB> → (your project names)
zeltro new <TAB> → django express fastapi flask kavera laravel ...
The desktop app#
The Zeltro desktop app is optional. On Linux, one command installs it, and
installs this CLI first if zeltro is missing:
curl -fsSL https://dist.canebaycomputers.com/zeltro/ubuntu | bash
It works on Ubuntu/Debian, Fedora/RHEL and Arch. On a Mac, use
curl -fsSL https://dist.canebaycomputers.com/zeltro/mac | bash instead, and
Windows has a Setup .exe. On first launch the app shows a short setup form and
runs zeltro configure for you; if you have already configured Zeltro in a
terminal, it skips the form.
The packages are on the releases page. See Downloads for which to use.
Updating#
zeltro update # git pull the CLI only — nothing else is touched
zeltro update --full # also re-run the platform installer and re-pull Docker images
--full stops running projects.
Uninstalling#
zeltro uninstall # remove Zeltro's Docker containers, volumes and networks
zeltro uninstall --delete-images # also remove the Docker images
sudo rm -f /usr/local/bin/zeltro
sudo rm -rf /usr/local/share/zeltro-cli
sudo rm -f /usr/share/bash-completion/completions/zeltro /etc/bash_completion.d/zeltro
sudo rm -rf /etc/zeltro-cli # optional: also remove configuration
Without --delete-images, zeltro uninstall asks whether to remove the
images.
Removed: the shared service containers, project containers, and Zeltro's
volumes and networks. The volumes hold the shared databases, so every
project's database is deleted. Dump anything you want to keep first. Each
project's docker-compose.yaml is renamed to docker-compose.yaml.backup.
Kept: all your project source code, non-Zeltro containers and images, and Docker itself.
Spotted a mistake? Edit this page on GitHub.