Deplo

Deploy button

One link in your README deploys your project on the reader's own Deplo.

The Deploy on Deplo button puts your project one click away from anyone who runs Deplo. It opens their Deplo, on their server, with your stack already filled in.

Deploy on Deplo

Try it: the button above deploys Actual Budget on your Deplo.

Quick start

Copy a snippet and put the link to your docker-compose.yml after compose=.

[![Deploy on Deplo](https://deplo.build/button.svg)](https://deplo.build/deploy?compose=https://github.com/acme/app/blob/v1.2.0/docker-compose.yml)

That is the whole setup: one parameter, no account, nothing to register.

What happens on click

deplo.build finds their Deplo

The first time, it asks for the address of their Deplo, like deplo.acme.com. After that, a 3-second countdown and they are on their way, with Change instance and Cancel to stop it.

Their Deplo reads your files

It fetches your docker-compose.yml, plus a template.toml and a logo if they sit next to it. They sign in if needed, and land in the new-app wizard of the last team they used.

They review and deploy

The wizard is the one a template opens, marked Not from the Deplo catalog, with the compose file open to read. Nothing is created until they click Deploy.

Parameters

Prop

Type

There is no other parameter. Everything else comes from the files next to the compose.

Configure the deploy

Put these in the same folder as the compose file:

acme-app/
├── docker-compose.yml   the stack (required)
├── template.toml        variables, secrets, which service gets the domain
└── logo.svg             the icon (or logo.png)

template.toml is the format of the template catalogue:

template.toml
[variables]
db_password = "${password:32}"

[config]
mounts = []

[[config.domains]]
serviceName = "web"
port = 3000
host = "${domain}"

[config.env]
DATABASE_PASSWORD = "${db_password}"
HelperBecomes
${password:32}A random secret of that length. secret, jwt and base64 work too.
${hash:64}A random hex string of that length.
${uuid}A random UUID.
${domain}The address Deplo gives the app.

Without a template.toml, Deplo picks the web service and its port itself, and the reader fills in any variables.

Pin a version

The file is read when someone clicks, not when you write the link.

LinkDeploys
.../blob/main/docker-compose.ymlWhatever is on main that day
.../blob/v1.2.0/docker-compose.ymlAlways v1.2.0 (recommended)

Limits

  • A public https link. Private repositories are not supported.
  • Images only. A service with build: needs the repository: deploy it from Git instead.
  • Only the three files above are read. An env_file: or a config file beside the compose is not: ship it as a [[config.mounts]] entry in template.toml.
  • Sizes: compose 256 KiB, template.toml 64 KiB, logo 2 MB.
  • Needs a Deplo newer than 0.3.0. An older one opens an empty wizard.

The reader's address stays in their browser

deplo.build keeps the address of their Deplo in their browser only, and never receives it. It counts clicks per repository, and not even that once they turn analytics off on the privacy page. Forget on deplo.build/deploy removes the address.

Troubleshooting

MessageWhat to do
This button's link is broken: it has to point at an https compose file.The link after compose= is missing or not https://.
raw.githubusercontent.com has no file at this address.Check the link, the tag and that the repository is public.
This file isn't a Compose file: it has no services.The link points at a web page, not at the file. Link the file itself.
The "web" service builds from source, which needs the repository.Publish an image and use image:, or deploy from Git.
The compose file is too large (256 KiB max).Trim it, or split it into several apps.
The compose URL must not point at a private or internal addressThe file has to be on the public internet.
raw.githubusercontent.com took too long to answer.Try again; the file host is slow or down.

Next steps

Did this page help you?

On this page