Dokumentation

Speicher (Cloudflare R2)

Cloudflare-R2-Dateispeicher — Bucket-Setup, Credentials, vorsignierte Uploads und S3-kompatible API.

Öffnen inChatGPT (öffnet in neuem Tab)Claude (öffnet in neuem Tab)Cursor (öffnet in neuem Tab)Cloudflare-R2-Dateispeicher — Bucket-Setup, Credentials, vorsignierte Uploads und S3-kompatible API.

Motoko Base nutzt Cloudflare R2 für Dateispeicher. R2 ist S3-kompatibel — die App verwendet das AWS SDK mit einem benutzerdefinierten Endpoint.

Official docs: Cloudflare R2 documentation

Setup

  1. Erstelle einen R2-Bucket im Cloudflare dashboard → R2
  2. Erstelle ein R2 API token (Object Read & Write)
  3. Setze Env-Vars:
VariablePurpose
R2_ACCOUNT_IDCloudflare account ID
R2_ACCESS_KEY_IDAPI token access key
R2_SECRET_ACCESS_KEYAPI token secret
R2_BUCKET_NAMEBucket name (optional /prefix suffix)
R2_PREFIXOptional key prefix override
R2_ENDPOINTOptional custom endpoint

Ohne R2-Env-Vars startet die App — das Storage-Demo zeigt eine Konfigurationsmeldung.

How uploads work

Client → Server Action (presigned PUT URL)
   ↓
Browser uploads directly to R2
   ↓
Server validates (HEAD) → marks file ready in Postgres

Dateien werden nie über Next.js proxied. Der Server stellt eine vorsignierte URL aus; der Browser lädt zu R2 hoch. Metadaten (Name, Größe, Eigentümer) liegen in der Tabelle files.

Upload-Limits und erlaubte MIME-Types: src/features/storage/config.ts.

S3-compatible API

R2-Client: src/lib/r2.ts — nutzt @aws-sdk/client-s3 mit:

  • Endpoint: https://{R2_ACCOUNT_ID}.r2.cloudflarestorage.com
  • Region: auto
  • Path-style URLs (forcePathStyle: true)

Vorsignierte PUT- (Upload) und GET- (Download) URLs laufen nach 10–15 Minuten ab.

Production

  • Nutze einen privaten Bucket — Zugriff nur über vorsignierte URLs
  • Setze Credentials als server-only Env-Vars (nie NEXT_PUBLIC_*)
  • Avatare (Settings) nutzen bei Konfiguration ebenfalls R2 — dieselben Credentials
  • Erwäge Lifecycle-Regeln in Cloudflare für alte Objekte — nicht im Starter enthalten

Für CORS: Wenn Browser-Uploads fehlschlagen, füge den App-Origin zur Bucket-CORS-Policy in Cloudflare hinzu. Siehe R2 CORS docs.

Where to change this

WhatWhere
R2 client & presigned URLssrc/lib/r2.ts
Upload actions & validationsrc/features/storage/actions.ts
File metadata queriessrc/features/storage/queries.ts
Limits & MIME allowlistsrc/features/storage/config.ts
Storage UIsrc/features/storage/components/dashboard/storage-page.tsx

Importiere @/lib/r2 nur aus Server-Code — nie aus Client Components.


Environment Variables — alle R2-Env-Vars.