Skip to main content

The two storage modes

Collabase stores uploaded files — attachments, images, banners — in one of two places: You do not need S3. Every standard installation runs on local disk and can stay there.

Compatible providers

Collabase works with any storage that speaks the S3 protocol. Tested and known-good setups:

Setting up the bucket

Create one private bucket for Collabase. Three rules matter:
  1. The bucket must not be publicly readable. Collabase serves every file through the application, where access permissions are checked. A public bucket would let anyone bypass those checks with a direct link. Do not attach public-read policies or ACLs.
  2. Create a dedicated access key for Collabase — do not reuse an admin key.
  3. Grant only the three permissions Collabase needs, limited to that one bucket:
Collabase does not need s3:ListBucket, bucket administration rights, or access to any other bucket. A minimal policy (AWS and MinIO use the same format):
Optional but recommended: enable server-side encryption and object versioning on the bucket in your provider’s console. Collabase does not require either, but versioning gives you an undo for accidental deletions.

Configuration

Add these settings to your .env (Docker) or values file (Kubernetes): On Kubernetes, the same settings live under storage.* in the Helm values — see the Kubernetes installation guide.

Switching an existing installation to S3

Your existing files must be copied into the bucket once. Collabase ships a migration command that does this and is safe to re-run (already-copied files are skipped):
1

Prepare

Create the bucket and access key as described above. Do not change .env yet.
2

Preview the migration

This lists what would be copied without changing anything.
3

Run it

Run the same command without --dry-run. It copies all files and updates stored image links so they keep working from the bucket.
4

Switch the configuration

Add the STORAGE_DRIVER=s3 block to your .env, then restart:
5

Verify, then clean up

Open a few pages with attachments and images. When everything loads, the old local files under the Docker volumes are no longer used and can be removed at your leisure.

Troubleshooting

Uploads fail after switching. Check the access key and that the policy covers s3:PutObject on the bucket. The application log names the failing operation. Images load but new uploads fail. The key can read but not write — the policy is missing s3:PutObject. Everything fails against MinIO or a self-hosted service. Make sure S3_FORCE_PATH_STYLE is true (the default) and the endpoint includes the scheme, for example https://minio.internal:9000. I need help. Open a ticket at collabase.featurebase.app with the output of a support bundle: bash deployment/docker/install.sh support-bundle.
Last modified on July 17, 2026