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 serverOn Plexivo
PM2, systemd or a screen session keeping the app upPlexivo 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 processesSeveral instances, added and removed by autoscaling.
Docker image or docker compose serviceOne Plexivo App Runner app per service, from its Dockerfile in Git or its container image.
Nginx as a reverse proxyPlexivo’s edge sends HTTPS traffic to your app on PORT. No proxy to configure.
Certificates from Let’s Encrypt and a renewal timerCertificates Plexivo issues and renews.
Nginx rate limits and IP allow or deny rulesPlexivo Shield, on every public app.
Firewall rules for internal servicesPrivate apps, and network access for databases.
.env fileThe app’s Environment tab, and Plexivo Secrets for keys several apps share.
crontab entriesA CronJob on Plexivo Kubernetes, from the Startup plan.
PostgreSQL, MySQL or Redis on the same serverPlexivo Postgres, Plexivo MySQL or Plexivo Cache, with backups.
Uploads written to the server’s diskPlexivo 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 taskThe 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#

  1. Take stock. On the server, list what runs: pm2 list, docker ps or your compose file, and your systemd services. Note the port each app listens on, your Nginx server_name and proxy_pass lines, your crontab -l, your .env files, your database versions and any folders the app writes files to.
  2. Create the app. Make the app read the PORT variable and listen on 0.0.0.0, and give it a start command: a Dockerfile CMD such as node 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.
  3. Copy your settings. Add each line of your .env file 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.
  4. 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.
  5. Add your domain. On the app’s Domains tab, add your hostname and prove you own it with the TXT record Plexivo shows. Your traffic stays on your server meanwhile. See Custom domains.
  6. Switch DNS. Test the app on its plexivo.app address first. Then replace the A record that points at your server with the routing record Plexivo shows. Plexivo issues the certificate on the first HTTPS request once the hostname routes.
  7. 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.
  8. 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 its Dockerfile.
  • A service with image: becomes an app from that image. Plexivo needs a public image for linux/amd64.
  • A postgres, mysql or redis service 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.

Paying from IndiaYour wallet is in US dollars; pay in rupees by UPI, card or netbanking at this month’s rate, with a GST tax invoice. Your databases, stored app data and backups are stored in India. See Paying from India and Data residency.

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