File storage (Local)

If your project includes file or image uploads, you'll need an S3-compatible storage backend. For local development, we use MinIO — it provides the same API as AWS S3 and runs via Docker.

Start MinIO with Docker Compose

From the root of your project, run:

docker-compose up -d

This will:

  • Start MinIO on ports 9000 (API) and 9001 (Console)
  • Create two buckets: project-public (anonymous read) and project-private (signed URLs only)
  • Set up an application user with access credentials
  • Configure bucket policies

Configure environment variables

Add the following to your packages/backend/.env file:

S3_BUCKET_PUBLIC=project-public
S3_BUCKET_PRIVATE=project-private
S3_ACCESS_KEY_ID=app_user
S3_SECRET_ACCESS_KEY=app_password123
S3_REGION=us-east-1
S3_ENDPOINT=http://localhost:9000

Access MinIO console (optional)

Open http://localhost:9001 in your browser:

  • Username: app_user
  • Password: app_password123

From the console you can browse buckets, manage files, and configure access policies.