> For the complete documentation index, see [llms.txt](https://docs.yaeris.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.yaeris.com/software/yaeris-launchpad/migrate-to-launchpad.md).

# How to Migrate Strapi to Launchpad

Move an existing Strapi project to Launchpad from a self-hosted VPS, AWS, or Strapi Cloud, including environment variable and DNS cutover steps.

Moving an existing Strapi project onto Launchpad looks very different depending on where it's coming from. Because Launchpad is BYODB (Bring Your Own Database -- see Environment Variables & Your Database), migrating your *database* usually isn't a separate step at all. The honest exception is Strapi Cloud, covered below.

## From a self-hosted setup (DigitalOcean, AWS EC2/ECS, a VPS)

If your Strapi instance already talks to an external Postgres you control (a DigitalOcean Managed Database, AWS RDS, or anything similar), this is the easy case -- there's no data export/import at all, because you're not moving the database, only where the application code runs.

1. **Push your repo to GitHub**, if it isn't already. Launchpad deploys from a GitHub repo with a working `Dockerfile`.
2. **Import the repo into Launchpad** and copy your environment variables over. This is the step that actually needs care: `APP_KEYS`, `API_TOKEN_SALT`, `ADMIN_JWT_SECRET`, and `JWT_SECRET` must be copied **exactly** as they are today. If these change, every existing admin session and API token breaks the moment you cut over.
3. **Point `DATABASE_URL` at your existing database** -- unchanged. Launchpad never takes ownership of it.
4. **If you use S3, Cloudinary, or another external provider for media**, those env vars carry over the same way -- there's nothing to migrate on the media side either, since Launchpad never stores your media locally.
5. **Deploy and verify on Launchpad's temporary `*.hosting.yaeris.com` URL first**, against your real data, before touching DNS.
6. **Cut your domain over** once you've confirmed it works. See the cutover note below.

## From Strapi Cloud

This is the one case with real friction, worth being upfront about rather than promising a copy-paste move. Strapi Cloud provisions and manages its own Postgres for you -- there's no `DATABASE_URL` you can just copy, because you don't get direct external access to that database.

The real path is Strapi's own first-party data-transfer tool:

```
strapi transfer --to <your-new-launchpad-instance-url>
```

Run this from your Strapi Cloud project to export its content and import it into a fresh Postgres database you provision yourself (Supabase, Neon, or anywhere else) for your new Launchpad project. This is a genuine data migration step, not a config change -- budget real time for it, and test on a staging database first if your content volume is large.

## From AWS specifically

If you're running Strapi on AWS against your own RDS Postgres, follow the self-hosted path above -- it's the same situation. If you're behind a managed layer you can't directly connect to or dump from (e.g. a fully managed Aurora setup with no external access), treat it like the Strapi Cloud case: export via `strapi transfer` or a database dump/restore into a Postgres you control, then follow the self-hosted steps from step 3 onward.

## Cutting DNS over

Once your new Launchpad deployment is verified and working, add your domain under **Domains** and update your DNS records. Be honest with yourself about one thing: DNS propagation isn't instant. There's a real (if usually short) window -- seconds to a few minutes depending on your DNS TTL and resolver caching -- where traffic could still hit your old host. Lowering your domain's TTL a day before the cutover minimizes this. It's not the multi-hour outage people fear from an infrastructure move, but it also isn't literally zero.

## Checklist

* [ ] Repo pushed to GitHub with a working Dockerfile
* [ ] `APP_KEYS`, `API_TOKEN_SALT`, `ADMIN_JWT_SECRET`, `JWT_SECRET` copied exactly
* [ ] `DATABASE_URL` set (existing DB for self-hosted, or a fresh one populated via `strapi transfer` for Strapi Cloud)
* [ ] Media storage env vars (S3/Cloudinary/etc.) copied, if used
* [ ] Verified working on the temporary `*.hosting.yaeris.com` URL against real data
* [ ] DNS TTL lowered ahead of cutover
* [ ] Domain added and DNS updated
