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 | bash

Configured 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-64 or arm64, Bash older than 4, or a missing curl or openssl.
  • Less than 8 GB free on /. 30 GB is the recommended minimum.
  • Ports 80, 443 or 3000 already held by something that is not Deplo.
  • No outbound HTTPS to ghcr.io, or to get.docker.com when Docker has to be installed. DEPLO_SKIP_NET_CHECKS=1 skips 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, the deplo network, and the proxy configuration.
  • Generates /opt/deplo/.env once, with mode 0600.
  • 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 hasDefaultGenerated address
IPv4 and IPv6IPv4deplo-cb00710a.deplo.site (203.0.113.10)
IPv4 and IPv6, with --ipv6IPv6deplo-v6-2001-db8--10.deplo.site (2001:db8::10)
IPv6 onlyIPv6deplo-v6-2001-db8--10.deplo.site (2001:db8::10)
curl -fsSL https://deplo.build/install.sh | bash -s -- --ipv6

The 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.io and github.com, which have no IPv6 address, through public NAT64 resolvers. Set DEPLO_NAT64_DNS to 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?

On this page