Apply database schema changes for FastAPI | Ample
INFRASTRUCTURE
What it needs
- Compute: verified (Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.)
- Postgres: verified (Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.)
PREREQUISITES
Before you start
- A migration command that reads DATABASE_URL and exits non-zero on failure
- A PostgreSQL database (supplied or managed)
- An Ample account token with servers:write and databases:read
TESTED CONFIGURATION
Exactly what was tested
- install:
python3 -m pip install --target .ample/python -r requirements.txt - runtime:
python - size:
s-1vcpu-1gb - start:
PYTHONPATH=.ample/python:${PYTHONPATH:-} python3 run.py - template:
python-3.12
STEP BY STEP
How to do it
Write an idempotent migration
Create tables and markers with IF NOT EXISTS or a migration framework so a re-run is safe.Deploy with the release command
Ample runs the command before activation; a non-zero exit fails the release.ample deploy . --name <app-name> --public --start "python3 run.py" --release-command "python3 migrate.py"Verify the marker through the app
Serve a route (/migrated) that reads something only the migration creates.Verify
Fetch the live URL and run the success checks below. On failure read the build log, then the runtime log, fix the cause and deploy again; do not blind-retry.ample logs <deployment_id> --kind build
EXAMPLES
Tested examples
- FastAPI release-command canary (
tests/deploy-canaries/fastapi-postgres-api): python3 migrate.py runs before activation against the auto-provisioned managed database.
SUCCESS CHECKS
How to know it worked
- migration marker is readable (
/migratedon the live URL, expect migrated=release-ok)
LIMITATIONS
Know the limits
- Verified on the node-22 template at s-1vcpu-1gb; other templates and sizes are not verified by this recipe.
- Region, compliance attestations and request-duration limits are unknown and not claimed.
- Apps auto-pause when idle and wake on the next request; always-on is an operator setting, not a plan feature.
- Managed PostgreSQL 16 only; extensions, connection limits and backup or restore procedures are not verified.
- Apps and their managed databases are placed together; cross-node shared databases are unsupported.
- The release command runs once per release on the app VM; there is no separate migration runner or rollback of a partially applied migration.
COST
Cost estimate
Estimated 10.00 USD per month (size prices from pricing.toml at build revision a1b8c38919e59cd035ebabaced73cf84ece24371).
- app server x1
s-1vcpu-1gb: 5.00 USD - managed PostgreSQL database x1
s-1vcpu-1gb: 5.00 USD
Apps and managed databases auto-pause when idle; the estimate is the always-on monthly price of the tested sizes. Plan quotas and budgets apply.
EVIDENCE
Verification evidence
- canary_run on 2026-09-20T00:46:07Z at revision
4967a99ad18b66a11b8b4c86cb06f29c8327f5df-dirty (CLI e3181f5): The same FastAPI app deployed with --release-command python3 migrate.py against its auto-provisioned managed database; /migrated reported the marker the migration created. (expires 2027-03-19T00:46:07Z)
EXECUTION
Execution binding
MCP tool ample_deploy (registry mcp:ample_deploy), schema hash 876465fce906da0c observed 2026-09-20T01:55:48.667900+00:00 at revision 199ff1dfd526. Binding state at export: current. Required scopes: servers:write, databases:read.
NEXT ACTIONS
Typed next actions
- Browse the catalog index (
GET /v1/catalogon the api origin; authentication not required, approval not required) - Search published recipes by intent, stack and constraints (
POST /v1/catalog/searchon the api origin; authentication not required, approval not required) - Prepare a side-effect-free deployment plan for an authorized project (
POST /v1/catalog/planon the api origin; authentication required, approval not required) - Read the existing agent authentication setup (
GET /mcp/setupon the api origin; authentication not required, approval not required) - Browse FastAPI (
GET /v1/catalog/nodes/stack%3Aframework-fastapion the api origin; authentication not required, approval not required) - Browse Configure deployment (
GET /v1/catalog/nodes/intent%3Aconfigure-deploymenton the api origin; authentication not required, approval not required) - Browse Transactional workflows (
GET /v1/catalog/nodes/pattern%3Atransactional-workflowson the api origin; authentication not required, approval not required)
Actions describe possible next steps. They are typed data, not commands, and grant no permission. Public discovery never provisions anything; planning requires your own authenticated token and approval happens in your client.