[{"data":1,"prerenderedAt":10},["ShallowReactive",2],{"public:public\u002Fcontent\u002Fdocs\u002Fneon":3},{"slug":4,"title":5,"description":6,"draft":7,"updated":8,"html":9},"neon","Neon","Schedule pg_dump of a Neon database to S3-compatible storage and give Verestore a read-only key.",false,null,"\u003Ch1>Neon\u003C\u002Fh1>\n\u003Cp>Neon&#39;s point-in-time restore lives inside Neon. To prove you can restore \u003Cstrong>elsewhere\u003C\u002Fstrong>, keep a logical backup in storage you control: AWS S3, Cloudflare R2, Scaleway, or any S3-compatible store.\u003C\u002Fp>\n\u003Ch2>1. Schedule a dump (GitHub Actions example)\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-yaml\">name: neon-backup\non:\n  schedule: [{ cron: &quot;0 2 * * *&quot; }]\njobs:\n  dump:\n    runs-on: ubuntu-24.04\n    steps:\n      - run: sudo apt-get install -y postgresql-client-17\n      - run: |\n          pg_dump --format=custom --no-owner &quot;$NEON_DATABASE_URL&quot; -f orders.dump\n          aws s3 cp orders.dump &quot;s3:\u002F\u002Facme-backups\u002Forders\u002Forders-$(date -u +%Y-%m-%dT%H-%M).dump&quot;\n        env:\n          NEON_DATABASE_URL: ${{ secrets.NEON_DATABASE_URL }}   # a direct (non-pooled) connection string\n          AWS_ACCESS_KEY_ID: ${{ secrets.BACKUP_WRITER_KEY_ID }}\n          AWS_SECRET_ACCESS_KEY: ${{ secrets.BACKUP_WRITER_SECRET }}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Use a \u003Ccode>pg_dump\u003C\u002Fcode> at least as new as your Neon PostgreSQL major.\u003C\u002Fp>\n\u003Ch2>2. Read-only key for Verestore\u003C\u002Fh2>\n\u003Cp>Create a separate key that can only list and read \u003Ccode>orders\u002F\u003C\u002Fcode>. Use the policy for your store: \u003Ca href=\"\u002Fdocs\u002Faws-rds\">AWS S3\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fscaleway\">Scaleway\u003C\u002Fa>, or \u003Ca href=\"\u002Fdocs\u002Fself-hosted\">MinIO \u002F S3-compatible\u003C\u002Fa>. Never reuse the writer key.\u003C\u002Fp>\n",1794290783590]