For production deployments, Teable is strongly recommended to use S3-compatible object storage (S3 / MinIO / OSS S3 endpoint / other S3-compatible services) with public/private dual buckets.
Why two buckets?
Teable stores different types of files in different buckets:- Public bucket: avatars, form cover images, and other assets that must be publicly accessible.
- Private bucket: attachments and other content that should be protected and accessed via signed URLs.
Required environment variables
At minimum, configure:- Provider
BACKEND_STORAGE_PROVIDER:s3orminio
- Buckets
BACKEND_STORAGE_PUBLIC_BUCKETBACKEND_STORAGE_PRIVATE_BUCKET
- Public access base URL
STORAGE_PREFIX: should be the public bucket access base URL (or CDN in front of it)
S3 provider
MinIO provider
Public bucket requirements (must-do)
1) Public read access
The public bucket must allow public read for objects. If you use AWS S3, you can set a bucket policy like:AWS S3 may require you to adjust Block Public Access settings for the public bucket. Please follow your organization’s security policy.
2) CORS (allow any origin)
For browser access, configure CORS on the public bucket to allow cross-origin requests. AWS S3 example:PUT in AllowedMethods.
Private bucket guidance
- Keep the private bucket non-public.
- Teable accesses private objects via signed URLs.
- If your provider supports “bucket endpoint” for private access, you can configure:
BACKEND_STORAGE_PRIVATE_BUCKET_ENDPOINT(optional)
Azure / GCP note
Teable uses S3 APIs for object storage. Azure Blob Storage and Google Cloud Storage are not S3-native.- If you are on Azure or GCP, you can still use
BACKEND_STORAGE_PROVIDER=s3as long as you point to an S3 endpoint (for example, AWS S3) and your Teable runtime can reach it. - Or use an S3-compatible storage:
- MinIO (self-managed) as the S3 endpoint
- Another managed S3-compatible service (your choice)