Neon

Neon's point-in-time restore lives inside Neon. To prove you can restore elsewhere, keep a logical backup in storage you control: AWS S3, Cloudflare R2, Scaleway, or any S3-compatible store.

1. Schedule a dump (GitHub Actions example)

name: neon-backup
on:
  schedule: [{ cron: "0 2 * * *" }]
jobs:
  dump:
    runs-on: ubuntu-24.04
    steps:
      - run: sudo apt-get install -y postgresql-client-17
      - run: |
          pg_dump --format=custom --no-owner "$NEON_DATABASE_URL" -f orders.dump
          aws s3 cp orders.dump "s3://acme-backups/orders/orders-$(date -u +%Y-%m-%dT%H-%M).dump"
        env:
          NEON_DATABASE_URL: ${{ secrets.NEON_DATABASE_URL }}   # a direct (non-pooled) connection string
          AWS_ACCESS_KEY_ID: ${{ secrets.BACKUP_WRITER_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.BACKUP_WRITER_SECRET }}

Use a pg_dump at least as new as your Neon PostgreSQL major.

2. Read-only key for Verestore

Create a separate key that can only list and read orders/. Use the policy for your store: AWS S3, Scaleway, or MinIO / S3-compatible. Never reuse the writer key.