# Storage providers

> colis works with AWS S3 and any S3-compatible storage: Cloudflare R2, MinIO, Scaleway Object Storage, Wasabi. The endpoint is the only difference, the CLI writes a starter for each, and verifier says whether it works.

Canonical: https://colis-site.vercel.app/en/providers · Markdown: https://colis-site.vercel.app/en/providers.md · Français: https://colis-site.vercel.app/providers

Your parcels live in your own bucket. Set an endpoint and colis adjusts the two defaults S3-compatible providers expect; both stay overridable. The CLI writes a starter for each provider, and verifier tells you whether it actually works.

```ts
const store = createBucket({
  bucket: 'livraisons',
  endpoint: 'https://…',   // set this, and two defaults follow:
  // region: 'auto'        // for providers that ignore the region
  // forcePathStyle: true  // https://endpoint/bucket/key
})
```

## Pick yours.
- [Cloudflare R2 (colis init --provider r2): S3-compatible, the region is always "auto", and the dashboard takes the CORS rule as JSON.](https://colis-site.vercel.app/en/providers/cloudflare-r2)
- [AWS S3 (colis init --provider aws): Credentials come from the provider chain, so a Lambda or an ECS task needs no keys at all.](https://colis-site.vercel.app/en/providers/aws-s3)
- [MinIO (colis init --provider minio): One Docker command, and the whole delivery flow runs on your laptop.](https://colis-site.vercel.app/en/providers/minio)
- [Scaleway Object Storage (colis init --provider scaleway): European regions, S3-compatible, and the region actually means something.](https://colis-site.vercel.app/en/providers/scaleway)
- [Wasabi (colis init --provider wasabi): S3-compatible, on a regional endpoint.](https://colis-site.vercel.app/en/providers/wasabi)

Not listed? Other S3-compatible storage works the same way: an endpoint, a key pair, and `colis verifier` to confirm the conditional writes are honoured. [The CLI](https://colis-site.vercel.app/en/cli) has the details.

## One CORS rule, for uploads that skip the function.
Large files go from the browser straight to the bucket. The bucket has to allow `PUT` from your delivery page and let it read each answer’s `ETag`. Without the rule, small files keep working.

```json
[
  {
    "AllowedOrigins": ["https://drop.example.com"],
    "AllowedMethods": ["PUT"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3600
  }
]
```

On AWS S3, paste it under Permissions → Cross-origin resource sharing; the Cloudflare R2 dashboard takes the same JSON under the bucket’s settings. Add `http://localhost:3400` to try it in development.
