Laravel spricht Object Storage über das Flysystem-Paket und den s3-Treiber an. Für intercolo tauschen Sie lediglich endpoint und region in config/filesystems.php — Ihr Anwendungscode mit Storage::disk() bleibt Zeile für Zeile unverändert. Uploads, Nutzer-Assets, generierte PDFs oder CSV-Exporte landen dann in einem DSGVO-konformen deutschen Object Storage im RZ Frankfurt statt bei einem US-Hyperscaler. Endpoint https://de-fra.i3storage.com, Region de-fra, Auth per SigV4, strong read-after-write und 99,999999% Durability. Ab 2,49 € pro TB/Monat, 1 TB Egress inklusive pro gespeichertem TB.
Der s3-Treiber braucht genau ein Composer-Paket: composer require league/flysystem-aws-s3-v3 "^3.0". Das ist die einzige Abhängigkeit — die AWS-SDK zieht Composer automatisch als Sub-Dependency mit. Kompatibel mit Laravel 9, 10 und 11.
Legen Sie unter disks eine neue Disk an (siehe Terminal oben): driver s3, region de-fra, endpoint https://de-fra.i3storage.com, use_path_style_endpoint false und visibility private. key, secret und bucket ziehen Sie über env() aus der .env. Damit ist Storage::disk('intercolo') überall in der App verfügbar.
Tragen Sie die Zugangsdaten ein: AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY aus Ihrem intercolo API-Key-Paar, AWS_BUCKET mit Ihrem Bucket-Namen, AWS_DEFAULT_REGION=de-fra, AWS_ENDPOINT=https://de-fra.i3storage.com sowie AWS_USE_PATH_STYLE_ENDPOINT=false. Keine Passwörter, keine Bucket-Policies — der Zugriff läuft ausschließlich über dieses SigV4-Schlüsselpaar.
Ab jetzt sprechen Sie den Speicher über die vertraute Facade an: Storage::disk('intercolo')->put(...), ->get(...) und ->temporaryUrl(...). Bestehender Code, der bereits Storage::disk() verwendet, funktioniert nach dem reinen Config-Wechsel unverändert weiter.
Storage::disk('intercolo') liefert einen ganz normalen Flysystem-Adapter — put, get, exists, size, readStream und temporaryUrl funktionieren identisch zu jedem anderen Disk. temporaryUrl signiert die URL per SigV4 gegen den in der Disk gesetzten Endpoint.
intercolo unterstützt keine öffentlichen Buckets per ACL. Setzen Sie in der Disk daher visibility auf private und nicht auf public — ein Aufruf von Storage::disk('intercolo')->url() für dauerhaft öffentliche Links läuft bewusst ins Leere. Das ist Absicht, keine Lücke: Statt Dateien über Bucket-ACLs global lesbar zu schalten (und damit versehentliche Daten-Leaks zu riskieren), liefern Sie jeden Download über temporaryUrl() als presigned URL aus — signiert per SigV4, zeitlich begrenzt gültig und pro Datei einzeln autorisiert. Öffentliche, unkritische Assets wie CSS, JS oder Logos legen Sie weiterhin klassisch nach public/ oder hinter einen CDN-PoP in DACH und Europa; vertrauliche Uploads bleiben privat und werden nur on demand signiert freigegeben. So gibt es keinen globalen Lesezugriff, den man vergisst wieder zu schließen.
Wenn Ihre App bereits den s3-Treiber gegen AWS nutzt, ist der Wechsel trivial: Sie setzen in der Disk endpoint auf https://de-fra.i3storage.com und region auf de-fra — das war es im Code. Die AWS-SDK, Flysystem, jeder Storage::disk()- und Storage::put()-Aufruf sowie Ihre Queue-Worker bleiben unverändert, weil intercolo dieselbe S3-API spricht (SigV4-Signatur, Multipart-Upload, presigned URLs). In der .env ersetzen Sie AWS_DEFAULT_REGION durch de-fra und ergänzen AWS_ENDPOINT sowie AWS_USE_PATH_STYLE_ENDPOINT=false. Bestehende Objekte spiegeln Sie einmalig per rclone oder aws-cli sync nach Frankfurt — auf diesem Weg sind bereits über 500 Millionen Dateien umgezogen.
intercolo verschlüsselt nicht at-rest; gesichert ist der Transport per TLS. Für vertrauliche Uploads verschlüsseln Sie den Inhalt daher clientseitig, bevor er in put() geht — etwa mit sodium_crypto_secretstream (libsodium ist in aktuellen PHP-Versionen an Bord) und einem eigenen Schlüssel aus Ihrem Laravel-Config- oder Secrets-Store, oder Sie spiegeln ganze Verzeichnisse über rclone crypt beziehungsweise Restic in den Bucket. Dann liegt im Object Storage ausschließlich Chiffrat, der Schlüssel verlässt nie Ihre App-Infrastruktur, und kein Provider — wir eingeschlossen — kann die Dateien lesen. Für öffentliche, unkritische Assets sparen Sie sich diesen Schritt; die Entscheidung treffen Sie pro Datei oder pro Bucket.
put, get, exists, size, delete, copy, move, readStream und writeStream für große Dateien, Multipart-Uploads, Verzeichnis-Listing und presigned temporaryUrl() — alles über die vertraute Storage-Facade und problemlos aus Queue-Jobs heraus.
Öffentliche Buckets über ACLs gibt es nicht. Statt visibility public nutzen Sie private plus temporaryUrl() für signierte, ablaufende Links; dauerhaft öffentliche Assets liefern Sie über public/ oder einen CDN-PoP aus.
Objekt-Versionierung und Object Lock/WORM gibt es nicht. Historie und Aufbewahrung bilden Sie in Ihrer App-Logik über eigene Pfade und Timestamps ab oder sichern den Bucket zusätzlich mit einem Backup-Tool.
Gesichert ist nur der TLS-Transport. Vertrauliches verschlüsseln Sie clientseitig vor dem Upload (libsodium, rclone crypt, Restic). Kein AES-256-at-Rest-Versprechen — dafür bleibt die volle Schlüsselhoheit bei Ihnen.
| AWS S3 (nativ) | Cloudflare R2 | intercolo i3 | |
|---|---|---|---|
| Standort / Datenhoheit | EU-Region wählbar, US-Konzern (CLOUD Act) | EU/global, US-Konzern | RZ Frankfurt, 100% DE, DSGVO/AVV |
| Config-Umstellung | nativer s3-Treiber | endpoint überschreiben | endpoint https://de-fra.i3storage.com, region de-fra |
| Egress-Modell | pro GB, kann teuer werden | kein Egress, aber US-Betreiber | 1 TB inkl./TB, dann +3,99 €/TB |
| Öffentliche Dateien | public-ACL / CloudFront | r2.dev / public bucket | privat + presigned temporaryUrl() |
| Ab-Preis Storage | Listenpreis US$/TB | Listenpreis US$/TB | 2,49 €/TB |
| DSGVO / AVV (Art. 28) | DPA, aber US-Zugriff möglich | DPA, US-Konzern | AVV, deutscher Betreiber, Schrems-II-sicher |
Betreuen Sie mehrere Kundenprojekte, legen Sie pro Projekt einen eigenen Bucket und ein eigenes API-Key-Paar (Access/Secret) an und hinterlegen es in der jeweiligen .env als separate Disk. Der Zugriff läuft ausschließlich über diese SigV4-Schlüssel — kein Passwort-Login, keine Bucket-Policies. Wird ein Projekt beendet oder ein Schlüssel kompromittiert, rotieren Sie genau dieses Key-Paar, ohne andere Kunden zu berühren. Zeitintensive Uploads wie Video-Encoding-Ergebnisse oder große Exporte schieben Sie aus einem queued Job mit ShouldQueue in den Bucket, damit der Web-Request schnell bleibt. Jedes Projekt ist so sauber getrennt, pro Bucket abrechenbar und einzeln kündbar.
Unsere Erfahrung spricht für sich: Wir haben bereits erfolgreich Migrationen mit mehreren Petabyte an Daten und über 500 Millionen Dateien durchgeführt.