Migrate from a VPS to Plexivo
Move an app that runs on your own server with PM2, Docker or Nginx to Plexivo App Runner, with its database, domain and HTTPS, step by step.
This guide moves an app from a server you look after yourself to Plexivo App Runner, its database to Plexivo Postgres or Plexivo MySQL, and your domain to Plexivo. You stop patching the server, renewing certificates and restarting processes: Plexivo runs, scales and restarts the app. Your server keeps serving until you change DNS, so you can go back at any point before that.
Your server and Plexivo, side by side#
| On your server | On Plexivo |
|---|---|
PM2, systemd or a screen session keeping the app up | Plexivo starts the app, restarts it if it exits or stops answering its HTTP health check, and keeps the current release serving until a new one is ready. |
| PM2 cluster mode, several processes | Several instances, added and removed by autoscaling. |
Docker image or docker compose service | One Plexivo App Runner app per service, from its Dockerfile in Git or its container image. |
| Nginx as a reverse proxy | Plexivo’s edge sends HTTPS traffic to your app on PORT. No proxy to configure. |
| Certificates from Let’s Encrypt and a renewal timer | Certificates Plexivo issues and renews. |
| Nginx rate limits and IP allow or deny rules | Plexivo Shield, on every public app. |
| Firewall rules for internal services | Private apps, and network access for databases. |
.env file | The app’s Environment tab, and Plexivo Secrets for keys several apps share. |
crontab entries | A CronJob on Plexivo Kubernetes, from the Startup plan. |
| PostgreSQL, MySQL or Redis on the same server | Plexivo Postgres, Plexivo MySQL or Plexivo Cache, with backups. |
| Uploads written to the server’s disk | Plexivo App Runner keeps no local files between restarts. Keep files in your database, or use a volume on Plexivo Kubernetes. |
| SSH to read logs or run a task | The app’s Logs tab, and the Plexivo CLI tunnel to reach your database. There is no shell into an instance. |
Before you begin#
- A Plexivo account.
- Your code on GitHub, GitLab or Bitbucket, or a public container image of it built for
linux/amd64. - SSH access to your server, and access to your domain’s DNS settings.
Move your app#
- Take stock. On the server, list what runs:
pm2 list,docker psor your compose file, and your systemd services. Note the port each app listens on, your Nginxserver_nameandproxy_passlines, yourcrontab -l, your.envfiles, your database versions and any folders the app writes files to. - Create the app. Make the app read the
PORTvariable and listen on0.0.0.0, and give it a start command: aDockerfileCMDsuch asnode server.js, or the start script Plexivo detects. PM2 is not needed. Then choose Create, then Plexivo App Runner, and deploy from Git or an image. See Listen on PORT and Deploy from Git. - Copy your settings. Add each line of your
.envfile on the app’s Environment tab, then apply. Leave out database and cache settings: Plexivo sets them when you connect a database or cache. See Environment and secrets. - Move the database. A database that listens only on the server is not reachable from outside, so move it with a dump. For PostgreSQL, follow Migrate a PostgreSQL database; for MySQL, Move a MySQL database. A Redis cache needs no move: create Plexivo Cache and your app fills it again. Then connect the new database on the app’s Environment tab.
- Add your domain. On the app’s Domains tab, add your hostname and prove you own it with the
TXTrecord Plexivo shows. Your traffic stays on your server meanwhile. See Custom domains. - Switch DNS. Test the app on its
plexivo.appaddress first. Then replace theArecord that points at your server with the routing record Plexivo shows. Plexivo issues the certificate on the first HTTPS request once the hostname routes. - Check it. On the Domains tab, Routing reads Ready on Plexivo and the certificate is valid. Open your site, run your usual checks, and watch the app’s Logs and Metrics.
- Retire the server. Keep it for a few days as your way back, with the app stopped so nothing writes to the old database. When you are satisfied, take a last backup and shut it down.
Docker Compose#
Move each service of your compose file on its own:
- A service with
build:becomes an app deployed from Git, built from itsDockerfile. - A service with
image:becomes an app from that image. Plexivo needs a public image forlinux/amd64. - A
postgres,mysqlorredisservice becomes Plexivo Postgres, Plexivo MySQL or Plexivo Cache. - Keep services that only your other services call private.
What Nginx did#
Your app now receives requests directly on PORT. If Nginx served static files, serve them from your app or build them into a static site. If it compressed responses or set caching headers, set them in your app.
Free migration help#
Prefer a hand? Tell us what you run, and Plexivo support plans the move with you. Ask for free migration help.
Next steps#
Docker, Nginx and PM2 are trademarks of their respective owners. Plexivo is not affiliated with, endorsed or sponsored by them.
Updated 2 November 2026