Flysystem S3-Driver · Storage::disk()

Laravel S3 Object Storage im RZ Frankfurt

Der Flysystem-S3-Treiber zeigt einfach auf den deutschen Endpoint — Storage::disk() bleibt unverändert, Sie tauschen nur Config und ENV. Endpoint https://de-fra.i3storage.com, Region de-fra, SigV4, presigned temporaryUrl. DSGVO/AVV, 1 TB Egress inkl. pro TB, ab 2,49 €/TB.

php — config/filesystems.php
'intercolo' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => 'de-fra',
    'bucket' => env('AWS_BUCKET'),
    'endpoint' => 'https://de-fra.i3storage.com',
    'use_path_style_endpoint' => false,
    'visibility' => 'private',
],
Flysystem
S3-Driver
temporaryUrl
presigned
DSGVO / AVV
RZ Frankfurt

Der S3-Filesystem-Treiber zeigt einfach auf Frankfurt

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.

Einrichtung in vier Schritten

1

Flysystem-S3-Adapter installieren

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.

2

Disk in config/filesystems.php anlegen

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.

3

.env füllen

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.

4

Im Code nutzen

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.

Nutzung: put, get und presigned temporaryUrl

php
use Illuminate\Support\Facades\Storage;

// Upload privat speichern — kein public-ACL nötig
Storage::disk('intercolo')->put('rechnungen/2026/inv-1042.pdf', $pdf);

// Inhalt wieder lesen oder als Stream verarbeiten
$content = Storage::disk('intercolo')->get('rechnungen/2026/inv-1042.pdf');
$stream  = Storage::disk('intercolo')->readStream('videos/rohschnitt.mov');

// Existenz und Größe prüfen
if (Storage::disk('intercolo')->exists('rechnungen/2026/inv-1042.pdf')) {
    $bytes = Storage::disk('intercolo')->size('rechnungen/2026/inv-1042.pdf');
}

// Presigned Download-Link, 15 Minuten gültig — statt öffentlicher URL
$url = Storage::disk('intercolo')->temporaryUrl(
    'rechnungen/2026/inv-1042.pdf',
    now()->addMinutes(15),
);

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.

Keine public-Buckets über ACL — bewusst so gebaut

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.

Zwei Zeilen ändern, keinen Code anfassen

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.

Zwei Zeilen ändern, keinen Code anfassen

Vertrauliche Dateien clientseitig verschlüsseln — vor put()

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.

Vertrauliche Dateien clientseitig verschlüsseln — vor put()

Was der Treiber kann — und was bewusst fehlt

Voll unterstützt

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.

Kein public-ACL

Ö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.

Keine Versionierung, kein Object Lock

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.

Keine at-Rest-Verschlüsselung

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.

intercolo i3 vs. AWS S3 vs. Cloudflare R2 als Laravel-Disk

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

Agentur-Setup: ein Bucket und ein Key-Paar je Projekt

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.

Wir migrieren Ihre Daten für Sie

Unsere Erfahrung spricht für sich: Wir haben bereits erfolgreich Migrationen mit mehreren Petabyte an Daten und über 500 Millionen Dateien durchgeführt.

500 Mio.+
migrierte Dateien
Petabyte
Datenvolumen migriert
seit 2006
am Markt
Nein. Sie legen eine neue Disk in config/filesystems.php an und füllen die .env — jeder bestehende Storage::disk()-, put()- oder get()-Aufruf funktioniert unverändert weiter, weil intercolo dieselbe S3-API wie AWS spricht.
Über temporaryUrl(): Das erzeugt eine presigned URL, die per SigV4 signiert und zeitlich begrenzt gültig ist. Für dauerhaft öffentliche, unkritische Assets (CSS, JS, Logos) nutzen Sie weiterhin public/ oder einen CDN-PoP; vertrauliche Dateien bleiben privat.
Der Transport ist per TLS gesichert, eine at-Rest-Verschlüsselung storage-seitig gibt es nicht. Für Vertraulichkeit verschlüsseln Sie den Inhalt clientseitig vor put() — etwa mit libsodium, rclone crypt oder Restic. Der Schlüssel bleibt dann ausschließlich bei Ihnen.
Sie ändern in der Disk nur endpoint auf https://de-fra.i3storage.com und region auf de-fra; SDK, Flysystem und Ihr Code bleiben unangetastet. Bestehende Objekte spiegeln Sie einmalig per rclone oder aws-cli sync nach Frankfurt.
Genau eines: composer require league/flysystem-aws-s3-v3 "^3.0". Es bringt die AWS-SDK als Sub-Dependency mit und ist mit Laravel 9, 10 und 11 kompatibel.
Mit use_path_style_endpoint false adressiert Laravel virtual-hosted: https://<bucket>.de-fra.i3storage.com. Path-Style https://de-fra.i3storage.com/<bucket> funktioniert ebenfalls, wenn Sie den Wert auf true setzen. Beide Varianten sind unterstützt.
Ja. Legen Sie pro Projekt einen eigenen Bucket und ein eigenes SigV4-Schlüsselpaar an und definieren jeweils eine separate Disk in config/filesystems.php. So bleiben Kunden und Umgebungen sauber isoliert und einzeln rotierbar.
1 Monat kostenlos testen

Testen Sie unseren S3-kompatiblen Speicher 1 Monat kostenlos.