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.
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=.
[](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:
[variables]
db_password = "${password:32}"
[config]
mounts = []
[[config.domains]]
serviceName = "web"
port = 3000
host = "${domain}"
[config.env]
DATABASE_PASSWORD = "${db_password}"| Helper | Becomes |
|---|---|
${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.
| Link | Deploys |
|---|---|
.../blob/main/docker-compose.yml | Whatever is on main that day |
.../blob/v1.2.0/docker-compose.yml | Always 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 intemplate.toml. - Sizes: compose 256 KiB,
template.toml64 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
| Message | What 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 address | The 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?