Deplo

Take over your VPS

Beta

Install Deplo on the machine that already runs Dokploy or Coolify. It brings your projects across, takes the ports, and removes the old panel when you say so.

Beta

This feature is currently beta/experimental and subject to change. It is not recommended for production. Try it out and share your feedback on our GitHub.

Most people have one server, and it already runs something. Deplo installs on that server by taking its place: it brings your projects across, then takes ports 80 and 443 from the old panel and removes it.

If you do not want any of it, the wizard's first step offers Start clean instead: the old panel and everything on it is deleted, and Deplo takes the machine with nothing carried over.

Your domains keep pointing at the same IP, and Deplo inherits the certificates that panel already had. Nothing to change in DNS, no HTTPS gap.

On a machine that already runs Dokploy or Coolify, this is the only way Deplo installs. Two panels cannot share ports 80 and 443, so the installer either replaces the other one or exits without touching anything.

Will your apps make it across?

What migrates lists the shapes that come across untouched, the ones that need a look, and how each release is measured against live installations.


What you need

  • A snapshot of the server, taken before you start.
  • A machine running Dokploy or Coolify, with root access for one command.
  • An API token from that panel. Deplo reads it over the API, the same way Move from Dokploy and Move from Coolify do.
  • Room on the disk: every volume that comes across is written a second time before the old one goes.

Take the snapshot first

The cutover removes the old panel in the same confirmed step, so the snapshot is your only way back once you press it - and your way back from the rest too: a volume emptied for a copy that then failed, a disk that filled part way, the Docker restart the cutover needs. It is one click at every provider.


The takeover

Run the installer

The same command as any other install:

curl -fsSL https://deplo.build/install.sh | bash

It finds the other panel and asks:

[ !] Dokploy is already running on this machine.
     Deplo can only install here by taking its place: it brings your projects
     across, then removes Dokploy. Two panels cannot share 80 and 443.

  -> Migrate off Dokploy and let Deplo replace it? [y/N]

Answer no and nothing is installed. Answer yes and Deplo installs on a free port, leaving the other panel exactly where it is.

--yes does not answer this one: replacing somebody's platform is not a default. To install without being asked, set DEPLO_TAKEOVER=dokploy (or coolify).

If it says the server agent did not install

The summary card then reads Server NOT installed, and it means the data phase cannot start: every byte is copied by the agent on this machine. The installer prints why. Re-run /opt/deplo/install.sh here, or copy the command the dashboard offers under Settings -> Servers. Both install the agent.

Open the address it prints

The installer prints the way in and exits. The terminal is yours again: the half that needs root on the host - moving the ports, restarting Docker, removing the old panel - is a systemd unit it leaves behind, deplo-takeover.service, which waits for the dashboard to say so.

Next
  1  Open http://deplo-cb00710b.nip.io/setup?key=... and create your account.
     No SSH needed - it goes in through Dokploy's own proxy on port 80.
  2  Bring your projects over from Dokploy, or start clean.
     The dashboard takes the machine when you say so, and opens by itself after.

That address is Deplo's address, before and after: your domain if you gave one, the generated deplo-<hex>.nip.io otherwise. Until the cutover it answers over plain http through the old panel's own proxy - Deplo writes one route into it, which it reloads by itself - and after the cutover the same host answers over https from Deplo's proxy. Nothing to re-open, nothing to re-type.

Deplo waits on loopback, deliberately

Until it takes 80 and 443, Deplo's own proxy is bound to 127.0.0.1 only. An account-creation page behind a certificate Deplo signed itself has no business on the open internet, and a published Docker port would walk straight past ufw. The route through the old panel's proxy is the way in, and it goes away at the cutover.

To watch the host side, journalctl -u deplo-takeover -f; its transcript is /var/log/deplo-takeover.log. Re-running /opt/deplo/install.sh only puts the unit back if it is missing, and prints the address again.

Create your account, and choose

After the account and the team, Deplo opens the takeover wizard and nothing else: until the ports are its own, there is nothing to deploy onto.

Its first step asks the one question that cannot be undone later:

  • Bring your data over - your apps, databases and their data move to Deplo, and the old panel comes off the machine once they are here. This is the rest of this page.
  • Start clean - the old panel comes off the machine with everything it ran: apps, teams, networks, images and its directory. Nothing comes across. The volumes its apps held stay on the disk until you remove them yourself, the same as after a migration. Deplo skips straight to Take over.

The wizard's steps are Choose, Connect, Install, Review, People, Take over and Done. A step opens only when the one before it has finished, so you can never land on a step with nothing in it.

Migrate

The panel it is replacing is already filled in. Paste its API token, pick what you want to bring across, and start.

The migration runs in Review, and stays there: the progress, the log, and then the report of what came across. If anything needs a person, the report says so and you acknowledge it before the wizard moves on.

What you leave unticked stays behind, and goes when the old panel is removed.

A panel with more than one machine

The Install step lists every other machine behind the panel with an install line each, exactly as the external migration does. Until the ports move, that line reaches Deplo through the same address you are using - the old panel's proxy - so it works before Deplo has ports of its own. Its apps land on this machine.

Every team, before the ports move

A token reads one team of that panel, so add a token per team here (press Add for each), and pick beside each one the Deplo team it lands in - the team you just created, or a new one named after it. Taking the ports stops the old panel for good, and its API with it - a team you have not brought over by then has nowhere left to come from. Deplo blocks the button while a team is still on the list, and asks you to confirm there are no others, because Coolify cannot list the teams a token does not cover.

Take over the machine

Take over opens when there is something to take over for: a migration that finished, or the Start clean choice. Until then the step is closed - there is no button to press and nothing to explain.

With several teams on the list it stays shut until the last one is over, and then asks you to tick I have no other teams on this panel. Nothing here can start the old panel again once its ports are gone, so that tick is the last chance to go back for a team you forgot.

A service whose data copy failed gets a second tick of its own, naming it: the old panel still holds the only copy of that data. Its volume stays on the disk after the takeover, but nothing in Deplo reads it. Go back to Review and copy the data again instead of ticking it, unless you mean to lose it. The takeover also waits while any migration is still moving.

One confirmation does the whole cutover, and you type the panel's name for it. On the host, deplo-takeover.service:

  • stops the old panel and the apps it ran
  • copies its certificates into its own store
  • moves Traefik onto 80 and 443, with the dashboard served behind it
  • takes the old panel off the disk: its containers, the workloads it ran and their networks, its images and its directory. The volumes those workloads held stay on the disk, so a copy that went wrong can still be recovered, and so do the backups the panel wrote to its own disk - the installer prints where they are
  • restarts Docker, which applies the address pools the install wrote and puts Docker's own DNS back after the old panel's swarm is left

The apps go down because two copies of one app cannot both hold a port, and the ones the old platform ran are holding exactly the ports Deplo's proxy is about to take. Deplo's own container is not touched: only who answers on 80 and 443 changes.

The wait stays in the step, and the page follows the dashboard by itself: onto the home, at the https address, once the old panel is gone and the address answers. It does not move earlier on purpose - the removal restarts Docker, and a page that had already moved would die with it. There is nothing to open and nothing to reload.

If the port move fails, the unit puts the ports back and starts the old panel again, and the step says why, in the installer's words, next to Try again. The reason names what is holding the port: a container of yours that grabbed 80 while the proxy was down is the usual one. Remove it, then Try again.

What it does not touch

No volume of an app is ever removed: the ones the old panel's apps held and anything it left behind for an app it had already deleted both stay where they are. The installer says how many unused volumes and networks are still on the host and prints the command to list them, so you can look before you remove any of them yourself.

Done

The browser lands on the dashboard's home, on the same address over https, with a note that the old panel is gone. Ports 80 and 443 are Deplo's now, so a real certificate issues within seconds of the move; the page waits for it before it goes there, so there is no warning to click through.

deplo-takeover.service removes itself once the machine is Deplo's.

Deploy your apps

Deplo never deploys anything for you. Your apps arrived with their configuration and their data, and you deploy them one at a time, checking each one.


How you get in

The address needs no port opened: until the cutover it rides the old panel's proxy on port 80, which is already reachable. If that panel has no dynamic config directory to write into, the installer says so and falls back to SSH, which is also there for anyone who would rather use it:

ssh -L 3001:localhost:3001 root@<server-ip>

Then open http://localhost:3001. Nothing on the server changes, and the page still follows the dashboard to its own address at the cutover.


Backing out

Cancel and remove Deplo on the takeover screen, at any point before the ports move. Deplo:

  • starts again every service the migration stopped on the old panel
  • starts the old platform's own containers again, each with the restart policy it had and only if it was running
  • removes everything it created here: its stacks, with their volumes and networks, so nothing of the copy is left on the disk
  • uninstalls itself

The old panel keeps all of its data. It needs its API token again to start those services, so keep the one you pasted.

If the port move itself fails, the unit puts the ports back and starts the old panel again on its own, and the takeover step offers Try again with the reason.


What it never does

  • Deploy anything for you. Some apps need a change after a migration, so every deploy is yours to make.
  • Remove anything before you ask. The old panel is whole on the disk until the one confirmation you type its name into, and that confirmation says what goes with it.
  • Touch a machine you said no on. Answering no to the first question exits before anything is written.

Did this page help you?

On this page