Skip to main content
CapRover apps import over its HTTP API, read-only. The main difference from the other sources is that CapRover builds images on its own host and does not expose them, so every app needs a source here: a git repository or a registry image. Read the migration overview first for the flow and the downtime table.

Prerequisites

  • Levelrail installed on the new server and the CLI signed in (levelrail-cli auth login).
  • The CapRover login password. It is exchanged for a session token with POST /api/v2/login (the only non-GET request the importer makes).
  • The CapRover URL reachable from the Levelrail control plane. For a private address, set APP_IMPORT_ALLOW_PRIVATE_NETWORKS=true and pass --allow-private.
  • Each app’s git repository, or a registry you can push its image to.

What imports automatically

What needs a manual step

  • A source for every app. Connect the repository (with credentials for a private one) and run a build, or push an image to a registry and set it as the source.
  • Volume contents, by rsync commands you run.
  • Raw host port mappings are not imported. Publish a port in the app settings if it must be reachable.
  • Health checks. CapRover has none to import. Add a readiness path here.

What cannot be migrated

  • Images built on CapRover: there is no recoverable image through its API. Rebuild from source.
  • Databases as a feature. CapRover runs databases as ordinary apps or one-click apps, so nothing maps to a managed database. Create a managed database here and copy the data.
  • Certificates, DNS records, deploy history, logs and metrics.

Steps

1

Dry run

2

Import

Apps are created without a running image. The report names the repository and branch where one is known. For verdicts and one-click fixes, use levelrail-cli migrate plan --platform caprover --url https://captain.example.com, then add --apply --only ID.
3

Give each app a source and build

Connect the git repository or set the registry image on the app, then deploy it. See Importing apps.
4

Move database data

Create a managed database of the same engine, with the same or a newer major version. Then copy:
The CapRover database container must publish a port the Levelrail node can reach. Publish it temporarily and restrict it by firewall. Point the app at the managed database and set its connection variable.
5

Copy volumes, check, switch

Databases and the downtime window

The database copy is a full dump and restore with row counts compared, repeatable, with the source read-only. There is no incremental sync. Pause the old app, run the final copy, start the app here, switch DNS. The window is the final copy time plus a restart. Apps without a database and without volumes can move with no outage you would notice. See the downtime table.

Domains and TLS

CapRover runs nginx on ports 80 and 443. Point DNS at a new server, or install Levelrail in coexist mode. Lower the TTL to 300 seconds a day ahead and let levelrail-cli migrate cutover tell you when it is low enough. Certificates are issued here on first use once DNS points here. See Domains and ingress.

Common problems and fixes

Choose to stay if

CapRover’s one-click apps and simple Swarm setup already cover what you run, and you do not want to re-point apps at a git source. Levelrail has no recorded run against a live CapRover. See CapRover alternative and the comparison.
Last modified on October 20, 2026