Overview
Kaneo supports private uploads in task descriptions and task comments. Uploads use an S3-compatible object storage backend:- the Kaneo API creates presigned upload URLs
- the browser uploads files directly to the storage backend
- Kaneo finalizes uploads into private asset records
- Kaneo serves uploaded files back through its own API
- images render inline
- other files such as CSV, PDF, or ZIP are inserted as attachment cards/links
- uploaded files are private by default and are not meant to be served from public bucket URLs
Recommended local setup: MinIO
For local or self-hosted deployments, MinIO is the recommended storage backend. It gives you:- a stable S3-compatible API
- a web console for bucket management
- a simple Docker setup
- better compatibility for direct browser uploads
.env values:
Important: internal Docker URLs are not enough in production
When Kaneo generates a presigned upload URL, the browser uploads directly to your storage backend. That meansS3_ENDPOINT must be reachable by the browser, not just by Docker containers.
For example:
http://minio:9000works only inside Dockerhttps://files.example.comworks from the browser
S3_ENDPOINT set to http://minio:9000.
Use a public MinIO hostname instead, for example:
Recommended public setup
The simplest production setup is:cloud.kaneo.appfor Kaneofiles.cloud.kaneo.appfor MinIO
- Kaneo signs uploads against
S3_ENDPOINT - the browser uses that signed URL directly
- Docker-internal names like
minioare not resolvable from a user’s browser
/api/asset/:id.
Other S3-compatible backends
Kaneo is not tied to MinIO. Any deployment can point Kaneo at another S3-compatible backend by changing theS3_* environment variables.
Examples:
- AWS S3
- Cloudflare R2
- MinIO
fs
Using fs
fs is another S3-compatible option if you want a lightweight local object store. It is built by friends of Kaneo.
When using fs, configure Kaneo like this:
fs:
- buckets are created through the S3 API or CLI, not through a web dashboard
- Kaneo still expects the bucket to exist before uploads start
- direct browser uploads may need reverse-proxy CORS headers, because
fsdoes not currently implement S3 CORS APIs
Required Kaneo storage variables
Set these in your Kaneo deployment:
Optional:
Using an IAM role (AWS S3) instead of static keys
When Kaneo runs on AWS (EC2, ECS, or EKS), you can let it authenticate with an IAM role instead of long-lived access keys. Leave bothS3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY unset. Kaneo then falls
back to the AWS SDK’s default credential provider chain, which automatically
picks up credentials from:
- an EC2 instance profile
- an ECS task role
- an EKS service account / IRSA (
AWS_WEB_IDENTITY_TOKEN_FILE) - standard
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYenvironment variables - a shared
~/.aws/credentialsprofile
s3:PutObject, s3:GetObject, and s3:DeleteObject
on the bucket.
Testing uploads
Once storage is configured:- Open a task.
- Paste, drag, or select a file inside the description or a comment.
- Confirm images render inline and other files render as attachment cards/links.
- confirm the bucket exists
- confirm the credentials can write to the bucket
- confirm the storage endpoint is reachable from the browser
- confirm
S3_ENDPOINTis a public URL, not an internal Docker hostname - if using direct browser uploads, confirm CORS is configured correctly for your storage endpoint