The initial compose file
The first step is to create a Docker Compose file. We will call itcompose.yml.
The services and volumes
Kaneo uses the following services:postgres: The PostgreSQL database.kaneo: The combined API and web container.
postgres_data: The PostgreSQL data.
Required URL configuration
For the combined image, onlyKANEO_CLIENT_URL is required — KANEO_API_URL is derived automatically as KANEO_CLIENT_URL/api:
KANEO_API_URL explicitly only if you need to override the default (e.g. a reverse proxy changes the path).
This keeps the browser on one origin while the container proxies /api requests to the internal API process.
For this Compose setup, the bundled Kaneo container reaches PostgreSQL at the service hostname postgres.
If you run the API directly on your host instead, use localhost or set DATABASE_URL explicitly.
Notes on object storage
Kaneo uses S3-compatible object storage for private uploads in task descriptions and comments.- Object storage is optional. Kaneo runs without it, but uploads in task descriptions and comments will be unavailable.
- For local/self-hosted setups, MinIO is the recommended option when you want uploads.
- The Kaneo API creates presigned upload URLs and the browser uploads files directly to the configured storage backend.
- Kaneo serves uploaded assets back through its own API, so the bucket does not need to be public.
- If you do not configure object storage, leave the
S3_*variables unset. - For a complete MinIO example and backend-specific setup notes, see the storage backends guide.
Optional MinIO service
Add this service and volume to yourcompose.yml only if you want uploads:
S3_* environment variables in your .env file. See the environment variables page.
Example .env values for MinIO
http://localhost:9001.
Using fs instead of MinIO
If you want to use fs, you can point the same S3_* variables at its endpoint instead of MinIO. Kaneo only needs an S3-compatible API endpoint, credentials, and a bucket.
When using fs, keep these differences in mind:
- Set
S3_FORCE_PATH_STYLE=true. - Create buckets through the S3 API or CLI, not through a web console.
- Browser uploads may require reverse-proxy CORS handling, because
fsdoes not currently implement S3 CORS APIs.