What this covers
CM Cloud apps store uploaded files on the runtime VM's local disk by default. For larger media libraries, off-app backups, or storage that is independent of the app, you can connect an external S3-compatible bucket. PocketBase has a built-in S3 storage setting; Node.js, Python, and Laravel apps connect using their own SDK and environment variables. CM Cloud does not create or host the bucket — you bring your own from a provider such as Cloudflare R2, AWS S3, or Backblaze B2.
Before you start
Create a bucket at your chosen provider and generate access credentials (access key ID, secret access key, region, and the S3 endpoint URL). Pick the provider that fits your budget — Cloudflare R2 is recommended for most CM Cloud customers because it is S3-compatible and charges no egress (bandwidth) fees.
How to do it
- Create a bucket and an access key at an S3-compatible provider (Cloudflare R2 recommended, or AWS S3 / Backblaze B2).
- PocketBase: open the admin dashboard at your-domain/_/, go to Settings → Storage, turn on S3 storage, and enter the bucket, region, endpoint, access key, and secret.
- Node.js / Python / Laravel: add your credentials as environment variables in the portal (e.g. S3_ENDPOINT, S3_BUCKET, S3_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) and use your framework's S3 SDK to read and write files.
- Keep secret keys in the portal Environment Variables section only — never commit them to your GitHub repo.
- Redeploy the app so the new variables are applied, then upload a test file to confirm it lands in the bucket.
What our team checks
Support can confirm which environment variables your app expects and verify that the S3 settings are applied, but the bucket, its credentials, and its billing stay in your own provider account.
Next step
Create a bucket at your provider, then add the credentials in the PocketBase Storage settings or the portal Environment Variables section.