install.sh
Installs the whole platform, Docker, Traefik, Postgres, the control plane and the agent, on a fresh server.
curl -fsSL https://deplo.build/install.sh | bashConfigured by environment variables in front of the command. See
Environment variables for the table. With
none of them it asks nothing and generates a host like deplo-cb00710a.deplo.site for the
dashboard. --domain is how you put it on a hostname of your own.
Requires
Root, Bash 4, curl, openssl, and Docker Compose v2 when Docker is
already on the host. Docker itself is installed if missing. systemd is
what runs the agent: without it the panel still comes up, but the machine
cannot become a Deplo server.
Prop
Type
Preflight checks
Everything knowable before the host is touched, so a server that cannot
finish says so in ten seconds. These stop the run, unless you pass
--force:
- Architecture other than
x86-64orarm64, Bash older than 4, or a missingcurloropenssl. - Less than 8 GB free on
/. 30 GB is the recommended minimum. - Ports
80,443or3000already held by something that is not Deplo. - No outbound HTTPS to
ghcr.io, or toget.docker.comwhen Docker has to be installed.DEPLO_SKIP_NET_CHECKS=1skips the network checks on a host that reaches its registry another way. - Docker present but its daemon not answering, or without Compose v2.
These only warn:
- Less than 4 GB of RAM, fewer than 2 cores, or less than 30 GB free. That is the minimum, 4 cores and 8 GB is the comfortable size, and both are about the apps: Deplo and Postgres fit in about 1 GB, so a 2 GB server runs the platform and leaves nearly nothing to deploy on it. No amount of memory or CPU blocks the install.
- No
systemd: the control plane runs, but this machine cannot become a Deplo server. - The domain does not resolve here yet, or Let's Encrypt is unreachable, so the certificate cannot issue yet.
What the installer does
- Installs Docker when needed and configures address pools without overwriting an existing pool.
- Creates
/opt/deplo, thedeplonetwork, and the proxy configuration. - Generates
/opt/deplo/.envonce, with mode0600. - Starts Postgres, the control plane, and Traefik. The panel stays on
127.0.0.1:3000; Traefik serves it over HTTPS. - Enrolls the local machine as a server after the panel health check passes.
Re-running it is the update path
It detects /opt/deplo/.env, switches to update mode, and never rotates
a secret. The last step failing is a warning, not a fatal error: the
panel stays up and a re-run retries it.
IPv6
The installer picks the kind of address the dashboard is served on:
| Server has | Default | Generated address |
|---|---|---|
| IPv4 and IPv6 | IPv4 | deplo-cb00710a.deplo.site (203.0.113.10) |
IPv4 and IPv6, with --ipv6 | IPv6 | deplo-v6-2001-db8--10.deplo.site (2001:db8::10) |
| IPv6 only | IPv6 | deplo-v6-2001-db8--10.deplo.site (2001:db8::10) |
curl -fsSL https://deplo.build/install.sh | bash -s -- --ipv6The choice is kept in /opt/deplo/.env as DEPLO_IP_FAMILY, so an update
keeps it. Pass the other flag on a re-run to switch. If the server lost the
kind it was installed on (its IPv4 was removed), an update moves to the
kind it still has.
When the dashboard is served on IPv6, the installer also:
- Gives every Docker network an IPv6 range, so apps reach the internet over IPv6. Networks Deplo created before are moved across without restarting their apps.
- On an IPv6-only server, routes
ghcr.ioandgithub.com, which have no IPv6 address, through public NAT64 resolvers. SetDEPLO_NAT64_DNSto your provider's DNS64 resolvers to use those instead. A server whose network already translates is left alone.
Docker is restarted for this only when no app is running. Otherwise the installer writes the setting and tells you to restart Docker in a maintenance window, then re-run it.
Apps get their generated addresses from the server they run on. Move them between IPv4 and IPv6 under Generated addresses.
See also
Did this page help you?