services:
storage-server:
image: devclouddesk/storage-server:latest
ports:
- "7100:7100"
volumes:
- ./cache-data:/data
environment:
- PORT=7100
- MASTER_KEY=sk_live_master_key
- STORAGE_DRIVER=s3
- S3_ENDPOINT=https://<ACCOUNT_ID>.r2.cloudflarestorage.com
- S3_BUCKET=my-media-bucket
- S3_REGION=auto
- S3_ACCESS_KEY=your_r2_access_key_id
- S3_SECRET_KEY=your_r2_secret_access_keyBy default, DevCloudDesk Storage Server saves all uploaded assets to local disk (DATA_DIR). This is fast, 100% self-contained, and requires zero external cloud accounts.
However, if you have multi-terabyte libraries or require durable cloud replication, you can configure the S3 Storage Driver to back up master assets directly to AWS S3, Cloudflare R2, MinIO, or DigitalOcean Spaces.
How the S3 Proxy Architecture Works#
textUpload Request ───────> DevCloudDesk Storage Server ───────> Uploads original to S3/R2 │ (Transforms & Caches) │ Delivery Request <───────────────┴─────────────── Served from high-speed NVMe Cache (Zero S3 egress fees!)
- Original Assets in S3: Original, full-resolution master files are stored durably in your S3 or Cloudflare R2 bucket.
- Local Transformation & Edge Caching: When a user requests a resized variant (e.g.
w=800,f=webp), the server fetches the original from S3, generates the transformed variant vialibvips, and saves it to local disk cache. - Zero S3 Bandwidth Penalties: Subsequent requests for the same variant are served from your local server's cache without hitting S3, saving you expensive bandwidth transfer costs.
Configuration Variables#
Set these environment variables in your .env or docker-compose.yml:
| Variable | Required | Example | Description |
|---|---|---|---|
STORAGE_DRIVER | Yes | s3 | Set to s3 (defaults to local). |
S3_BUCKET | Yes | my-media-bucket | Name of your S3 or R2 bucket. |
S3_REGION | Yes | us-east-1 or auto | AWS region (use auto for Cloudflare R2). |
S3_ACCESS_KEY | Yes | AKIA... | Access Key ID. |
S3_SECRET_KEY | Yes | secret... | Secret Access Key. |
S3_ENDPOINT | No | https://<id>.r2.cloudflarestorage.com | Custom endpoint for Cloudflare R2, MinIO, or Wasabi. Leave unset for standard AWS S3. |
Cloudflare R2 Setup (Recommended for $0 Egress)#
Cloudflare R2 provides S3-compatible object storage with $0 egress fees:
bashdocker run -d \ -p 7100:7100 \ -v /var/lib/storage-cache:/data \ -e STORAGE_DRIVER=s3 \ -e S3_ENDPOINT=https://<ACCOUNT_ID>.r2.cloudflarestorage.com \ -e S3_BUCKET=my-r2-media \ -e S3_REGION=auto \ -e S3_ACCESS_KEY=your_r2_key_id \ -e S3_SECRET_KEY=your_r2_secret \ -e MASTER_KEY=sk_live_my_key \ devclouddesk/storage-server:latest
Next Steps#
- On-the-Fly Image Transformations →: Customize resizing and WebP formats.
- REST API Reference →: Explore all available server endpoints.