Skip to content

S3 Storage

By default, SkySend stores encrypted upload files on the local filesystem. You can switch to any S3-compatible object storage provider for more scalable or managed file storage.

For the full list of configuration variables, see Environment Variables.

Setup

Enable S3 by setting STORAGE_BACKEND=s3 and providing the required credentials:

yaml
environment:
  STORAGE_BACKEND: s3
  S3_BUCKET: your-bucket-name
  S3_REGION: your-region
  S3_ACCESS_KEY: your-access-key
  S3_SECRET_KEY: your-secret-key

TIP

When using S3, the /uploads volume mount is no longer needed - only the /data volume for the SQLite database.

Provider Examples

Cloudflare R2

yaml
environment:
  STORAGE_BACKEND: s3
  S3_BUCKET: skysend-uploads
  S3_REGION: auto
  S3_ENDPOINT: "https://<account-id>.r2.cloudflarestorage.com"
  S3_ACCESS_KEY: your-access-key
  S3_SECRET_KEY: your-secret-key

AWS S3

yaml
environment:
  STORAGE_BACKEND: s3
  S3_BUCKET: skysend-uploads
  S3_REGION: eu-central-1
  S3_ACCESS_KEY: your-access-key
  S3_SECRET_KEY: your-secret-key

Leave S3_ENDPOINT unset for AWS S3 - the endpoint is derived automatically from the region.

Hetzner Object Storage

yaml
environment:
  STORAGE_BACKEND: s3
  S3_BUCKET: skysend-uploads
  S3_REGION: eu-central-1
  S3_ENDPOINT: "https://eu-central-1.your-objectstorage.com"
  S3_ACCESS_KEY: your-access-key
  S3_SECRET_KEY: your-secret-key

MinIO (Self-Hosted)

yaml
environment:
  STORAGE_BACKEND: s3
  S3_BUCKET: skysend-uploads
  S3_REGION: us-east-1
  S3_ENDPOINT: "https://minio.example.com:9000"
  S3_ACCESS_KEY: your-access-key
  S3_SECRET_KEY: your-secret-key
  S3_FORCE_PATH_STYLE: "true"

MinIO requires S3_FORCE_PATH_STYLE=true. Use the same setting for Garage and other self-hosted providers that do not support virtual-hosted-style URLs.

CORS Configuration

Required for downloads

When using S3 storage, your bucket needs a CORS policy to allow browser downloads. Without it, downloads will fail with No 'Access-Control-Allow-Origin' header errors. The policy must allow GET and HEAD methods from your SkySend domain.

Cloudflare R2

Go to R2 > your bucket > Settings > CORS Policy and add:

json
[
  {
    "AllowedOrigins": [
      "https://skysend.example.com"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ]
  }
]

AWS S3

Go to your bucket > Permissions > CORS configuration and add a similar policy.

MinIO

Use mc admin config set or the MinIO Console to configure CORS.

Replace https://skysend.example.com with your actual SkySend BASE_URL. For local development, also add http://localhost:5173.