Storage Settings
Reached from Configuration → Integrations → Storage, an Owner-only page that decides where new knowledge base document and image uploads land — your server's local disk (the default), AWS S3, or Cloudflare R2.
Internal operational files — update packages, backups, and inbound WhatsApp/Telegram media — always stay on local disk regardless of this setting. This only decides where your knowledge base's own, growing content goes.
Choosing a driver
| Driver | Best for |
|---|---|
| Local (default) | Everything stays on your own server's disk. No extra account or credentials needed — works out of the box. |
| AWS S3 | Offload growing knowledge base storage to S3, especially useful on shared hosting with limited disk space. |
| Cloudflare R2 | S3-compatible storage with no egress fees — the same fields as S3 plus an endpoint URL. |
S3 / R2 credentials
Whichever you choose, you'll need from your AWS or Cloudflare dashboard:
- Access key ID and Secret access key — required.
- Bucket name — required. For R2, also an Endpoint URL (from your R2 dashboard) — required.
-
Region — required for S3 (e.g.
us-east-1); optional for R2, where it defaults toauto. - Public URL — optional, if your bucket is served through a custom domain or CDN rather than its default endpoint.
A secret key must be saved at least once before you can select that driver. Saving with S3 or R2 selected but no secret key ever recorded for it (and none typed into this save) is rejected with a validation error. Once saved, the secret is never shown again — only a masked hint (its last 4 characters). Leaving the secret field blank on a later save keeps the existing one.
Direct-to-bucket uploads (CORS)
When S3 or R2 is selected, an Enable CORS switch appears. Uploads work either way — this only decides how:
- Off (default once switched to S3/R2) — large files are relayed through your server first. Works everywhere, including a shared host with no direct bucket access at all.
-
On — the browser uploads straight to
the bucket, which is faster but requires a CORS policy
configured on the bucket first, allowing
PUTrequests from your site's domain withExposeHeaders: ["ETag"]. Leave this off until that policy is actually in place — turning it on before the bucket is ready breaks uploads rather than merely slowing them down.