# Migrate Neon database: Text search over records

Move PostgreSQL data from Neon database to Ample, one component at a time. Destination verified on Ample: a generated tsvector column with a GIN index, ranked websearch queries and a negative query returning nothing (search=ok).

## Source procedure
Take a logical backup with `pg_dump -Fc` from the primary branch. Not migrated automatically: Neon branching, autoscaling and scale-to-zero semantics have no equivalent; the managed database is one instance per app.

## Cutover
Freeze writes at the source with the user's go-ahead, take the final dump, restore, validate, redeploy the app with the managed DATABASE_URL, keep the Neon project until confirmed.

## Rollback
Keep the source untouched until you confirm; nothing at the source is changed or deleted by this guide.

## Representative Queries
- Migrate Neon database: Text search over records
- Where can I host Text search over records?
- I need a component-scoped export/import or reconfiguration procedure for Text search over records, with compatibility checks, verification and rollback.

## Resource Requirements
- primitive:postgres

## Infrastructure Requirements
- **Postgres**: Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.

## Workload
Text search over records

## Migration Source
Neon database

## Release Status
Published

## Support Status
Verified

## Execution Status
Unbound

## Documentation Only
1. **Prerequisites**:
   - Authorized access to the Neon database source and its export tooling
   - An inventory of every component in scope and out of scope
   - A validated backup or copy before any cutover
   - An Ample account token with servers:write, databases:read

## Tested Configuration
- **Template**: node-22
- **Runtime**: node
- **Size**: s-1vcpu-1gb
- **Install**: npm install
- **Build**: npm run build --if-present
- **Start**: npm run start

## Workflow Steps
1. **Inventory the source**: List what Neon database provides beyond the component you are moving. 
2. **Source step 1**: Take a logical backup with `pg_dump -Fc` from the primary branch.
3. **Source step 2**: Check the Postgres major version and extensions in use against the managed engine (PostgreSQL 16).
4. **Source step 3**: Restore into a scratch managed database first and compare row counts.
5. **Provision and restore**: Deploy the app once so a managed PostgreSQL 16 database exists, then restore the dump with `pg_restore` using its connection string.
6. **Validate before cutover**: Run the app's own checks and, for data, compare counts and checksums.
7. **Cut over**: Freeze writes at the source with the user's go-ahead, take the final dump, restore, validate, redeploy the app with the managed DATABASE_URL.
8. **Rollback**: Point DNS or configuration back to the source.

## Examples
- **Express pattern fixture (destination)**: Verified destination basis: text search over records. (Source Ref: tests/deploy-canaries/express-patterns)

## Success Checks
- Destination app responds on its public URL.
- Text-search-over-records check from the destination example matches.
- Data or object counts and checksums match the source.

## Limitations
- Documentation only; nothing is executed automatically and no execution binding is offered.
- The source-side procedure is documented from Neon database's standard tooling and was not executed.
- No full source-product parity is claimed.

## Cost Estimate
- **Currency**: USD
- **Monthly Amount**: 10.0
- **Components**:
   - App server: size s-1vcpu-1gb, quantity 1.0, monthly amount 5.0
   - Managed PostgreSQL database: size s-1vcpu-1gb, quantity 1.0, monthly amount 5.0
   - Note: Destination always-on monthly price of the tested sizes; apps auto-pause when idle.

## Evidence Summary
- Destination side verified: the Express pattern fixture deployed on Ample and its checks passed.

## Last Verified At
2026-09-21T02:34:39Z

## Unknowns
- Region availability and compliance attestations are unknown.
