Migration Guide
Overview
This guide covers migrating your workloads to Kovra Cloud from three scenarios:
- Migrating from BYOC (Bring Your Own Cluster) within Kovra
- Migrating from other platforms (Heroku, Railway, Render)
- Database migration steps
Migrating from BYOC to Kovra Cloud
If you are already using Kovra with your own Kubernetes clusters, migrating to Kovra Cloud simplifies your infrastructure management while keeping your applications and workflows intact.
Step 1: Plan Selection
- Review the Kovra Cloud plans and select one that matches your current resource usage
- Compare your current vCPU, RAM, and storage consumption against the plan limits
- Count your databases to ensure the plan’s database quota is sufficient
Step 2: Provision a Kovra Cloud Tenant
When you select a plan, a tenant is automatically provisioned for your organization. Wait until the tenant status is ready before deploying apps.
Step 3: Recreate Applications
For each application running on your BYOC cluster:
- Create a new application targeting Kovra Cloud from your existing Git repository
- Copy environment variables from the old application to the new one
- Configure custom domains (if applicable) on the new application
Step 4: Migrate Databases
See Database Migration Steps below for detailed instructions.
Step 5: DNS Cutover
See DNS Cutover Checklist below.
Step 6: Decommission BYOC Resources
After verifying that everything works on Kovra Cloud:
- Remove old applications from the BYOC cluster
- Delete the BYOC cluster configuration from Kovra
- Decommission or repurpose your Kubernetes cluster
Migrating from Other Platforms
From Heroku
Applications:
- Ensure your app has a
Dockerfileor buildable source (Kovra Cloud deploys via Helm charts, not buildpacks) - Push your code to a GitHub or GitLab repository
- Connect your Git provider in Kovra (Settings > Integrations)
- Import your repository
- Create a Kovra Cloud application from the imported repository
- Migrate environment variables:
Then set each variable in Kovra Cloud via the Variables API or dashboard.
# Export from Heroku heroku config -a my-app --json > env.json
Databases:
- Create a managed database in Kovra Cloud
- Export from Heroku Postgres:
heroku pg:backups:capture -a my-app heroku pg:backups:download -a my-app - Import into Kovra Cloud (see Database Migration Steps)
Add-ons: Heroku add-ons (Redis, Elasticsearch, etc.) must be replaced with equivalent services. Kovra Cloud currently supports managed PostgreSQL. For other services, deploy them as applications within your tenant namespace.
From Railway
Applications:
- Export your Railway project configuration
- Push source code to GitHub/GitLab if not already there
- Create a Kovra Cloud application from the repository
- Migrate environment variables from Railway’s Variables tab
- If using Railway’s
Procfileornixpacks.toml, convert to aDockerfile
Databases:
- Create a managed database in Kovra Cloud
- Connect to your Railway database and export:
pg_dump -Fc -h <railway-host> -U <user> -d <db> > backup.dump - Import into Kovra Cloud (see Database Migration Steps)
From Render
Applications:
- Ensure you have a
Dockerfileor supported build configuration - Push code to GitHub/GitLab
- Create a Kovra Cloud application from the repository
- Migrate environment variables from Render’s Environment tab
- Update health check paths if different
Databases:
- Create a managed database in Kovra Cloud
- Use Render’s external connection details to export:
pg_dump -Fc -h <render-host> -U <user> -d <db> > backup.dump - Import into Kovra Cloud (see Database Migration Steps)
Database Migration Steps
Prerequisites
- A Kovra Cloud managed database in
readystatus - The connection URL for the new database (from the database detail API)
- For importing data: a Business or Enterprise Cloud plan with VPN enabled (or run the import from within the cluster)
Step 1: Export from Source
Create a logical backup of your source database:
# Custom format (recommended for flexibility)
pg_dump -Fc -h <source-host> -U <source-user> -d <source-db> > backup.dump
# Plain SQL (alternative)
pg_dump -h <source-host> -U <source-user> -d <source-db> > backup.sqlStep 2: Connect to Kovra Cloud Database
You need network access to the Kovra Cloud database. Two options:
Option A: Via VPN (Business/Enterprise Cloud)
- Enable VPN for your tenant
- Connect via WireGuard
- Use the internal service DNS to connect
Option B: Via a temporary pod
Run a temporary pod in your tenant namespace to perform the import (requires kubectl access).
Step 3: Import into Kovra Cloud
# Custom format restore
pg_restore -h <kovra-db-host> -U <user> -d <database> backup.dump
# Plain SQL restore
psql -h <kovra-db-host> -U <user> -d <database> < backup.sqlReplace the host, user, and database values with those from your Kovra Cloud database connection URL.
Step 4: Verify Data
Connect to the new database and verify:
psql "<kovra-cloud-connection-url>"
# Check table counts
\dt+
# Verify critical data
SELECT count(*) FROM <important_table>;Step 5: Update Application Configuration
Update your application’s DATABASE_URL environment variable to point to the new Kovra Cloud database and trigger a redeployment to apply the change.
DNS Cutover Checklist
When migrating applications with custom domains, follow this checklist to minimize downtime.
Pre-Cutover
- Application is deployed and healthy on Kovra Cloud
- Database is migrated and application can connect to it
- Environment variables are configured correctly
- TLS certificate is provisioned for the custom domain
- Smoke tests pass against the Kovra Cloud deployment (using the generated subdomain)
Cutover
- Lower the TTL on your DNS records 24-48 hours before cutover (set to 60-300 seconds)
- Update CNAME records to point to the Kovra Cloud target
- Monitor DNS propagation
- Verify the application responds correctly at the custom domain
- Check TLS certificate is serving correctly
Post-Cutover
- Monitor error rates and latency for 24-48 hours
- Verify all integrations (webhooks, OAuth callbacks, etc.) work with the new endpoints
- Update any hardcoded URLs in external services
- Restore DNS TTL to normal values (3600+ seconds)
- Decommission the old deployment after the monitoring period
Minimizing Downtime
For zero-downtime migration:
- Run both old and new deployments simultaneously
- Use DNS-based traffic shifting (low TTL CNAME swap)
- Keep the old deployment running for 24-48 hours as a fallback
- Only decommission after confirming the new deployment is stable
Common Migration Pitfalls
| Issue | Solution |
|---|---|
| Database connection timeouts after migration | Ensure the DATABASE_URL points to the internal service DNS, not an external hostname |
| TLS certificate not ready | Wait for cert-manager to issue the certificate (usually 1-2 minutes); check external access status |
| DNS not resolving | Verify CNAME target is correct; wait for TTL expiration on old records |
| Application crashes after deploy | Check environment variables are correctly migrated; compare with source platform |
| File uploads missing | Kovra Cloud uses ephemeral storage; migrate to object storage (S3) for persistent files |
| Scheduled jobs not running | Configure CronJobs separately; Kovra Cloud applications are web processes by default |
Next Steps
- Getting Started — Initial setup guide
- App Deployment Guide — Deploy and configure applications
- Managed Databases — Database provisioning details
- Billing & Usage — Choose the right plan for your migration