page:recipes:rest api:flask:persistent state

Host REST API with Flask: Postgres-backed state

Deploy a Flask REST API whose durable state lives in a managed PostgreSQL 16 database. With no DATABASE_URL supplied, Ample provisions the database and injects the connection string as an encrypted environment variable; the API stores rows with psycopg and serves them from a public HTTPS URL.

Representative Queries

Resource Requirements

Infrastructure Requirements

  1. Compute: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.
  2. 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.

Framework

Workload

Release Status

Support Status

Execution Status

Prerequisites

Tested Configuration

Input Schema

{
  "type": "object",
  "required": ["name", "path", "start"],
  "properties": {
    "env": {
      "type": "array",
      "items": { "type": "string" }
    },
    "name": { "type": "string", "minLength": 1, "maxLength": 63 },
    "path": { "type": "string", "minLength": 1, "maxLength": 512 },
    "release_command": { "type": "string", "minLength": 1, "maxLength": 512 },
    "size": {
      "type": "string",
      "enum": ["s-1vcpu-256mb", "s-1vcpu-1gb", "s-1vcpu-2gb", "s-2vcpu-2gb", "s-2vcpu-4gb"]
    },
    "start": { "type": "string", "maxLength": 512 }
  }
}

Workflow Steps

  1. Read DATABASE_URL at runtime: Open the connection from the environment inside request handlers or a pool; a local .env is replaced by the managed database in production.
  2. Deploy: Run the existing synchronous deploy once from the project directory and read the result. Exit 0 is live, 1 is failed, 2 is blocked on a required preflight action. Re-running with no change is a content-addressed no-op.
    • Command: ample deploy . --name --public --format json --start "python3 run.py"
  3. 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.
    • Command: ample logs --kind build

Examples

Success Checks

  1. Root route responds: / expects ample canary flask postgres app
  2. Database insert and count succeed: /items expects postgres=ok

Limitations

Cost Estimate

Evidence Summary

  1. Canary Run: Flask app (waitress) using psycopg.
  2. Canary Run: Node app needing PostgreSQL with no DATABASE_URL.

Last Verified At

MCP Binding

Unknowns

Formats

Next Actions