Kai Ole Hartwig
Media from S3 in TYPO3?

typo3-fal-s3 — TYPO3 files in S3, without a network drive and without new addresses.

TYPO3 keeps images and downloads in the fileadmin folder. When that folder lives in object storage such as Amazon S3, it is usually mounted as a network drive. That is slow, needs special privileges and breaks at the wrong moment. typo3-fal-s3 is a storage driver for TYPO3 that talks to S3 directly. The switch happens in place: files, references and addresses on the website stay as they are.

  • What it is: a driver for TYPO3's file abstraction layer (FAL) that connects Amazon S3 and S3-compatible storage
  • Who it is for: operators of TYPO3 websites who keep their media in S3, for example in Kubernetes without a shared disk
  • Tech: TYPO3 extension · TYPO3 14.3+ · PHP 8.5+ · async-aws · MIT licence · source on GitHub

TL;DR — Does this fit my setup?

Use it if …

Don't use it if …

Effort

One Composer package, one command to switch the storage and the name of the bucket. The way back is the same command with the old driver.

Why no network drive, and what the driver does differently

The problem

A mounted bucket pretends S3 is a disk. Every check whether a file exists becomes a request over the network. The server needs extended privileges for it, and when the drive hangs, the whole website hangs. In Kubernetes there is an extra service on every node that only provides the drive.

The solution

typo3-fal-s3 talks to S3 directly, as a driver in TYPO3's file abstraction layer. It keeps the folder structure of the bucket. That is why an existing storage can be switched without TYPO3 having to re-index a single file.

WhatHow the driver handles it
File addressesstay the same, /fileadmin/… by default
Access to S3through the identity of the server or pod, no key in TYPO3
Repeated lookupsanswers from S3 land in a shared cache; a folder costs one request, not one per file
Two servers write the same image variantboth succeed, neither overwrites the other
Image variantslive in the bucket and carry a long cache lifetime
Other data in the same bucketis hidden and read-only

In production

Since October 2026 the driver runs on four TYPO3 websites in Kubernetes. Before, every pod had a network drive with the bucket attached. The switch went website by website, with the drive as a fallback, until everything ran clean.

The files are delivered by the website's web server. To make that fast, caddy-fs-s3cache keeps a local copy.

fileadmin still mounted as a network drive? I help with the switch, the permissions and the delivery. Get in touch →

Installation and configuration

For operators of a TYPO3 14 website. Three steps.

1. Install the package

 

composer require koh/typo3-fal-s3

 

2. Name the bucket

Every setting can come from an environment variable, so the record in TYPO3 stays the same for all environments.

 

KOH_FAL_S3_BUCKET=my-media-bucket
KOH_FAL_S3_REGION=eu-north-1

 

3. Switch the storage

 

vendor/bin/typo3 koh_fal_s3:storage --uid 1 --driver KohS3
vendor/bin/typo3 cache:flush

 

The command remembers the old setting. --driver Local restores it.

The main options

OptionDefaultMeaning
bucketrequiredName of the S3 bucket
region, endpoint, pathStylefrom the AWS configurationAWS region; own endpoint and path-style addressing for S3-compatible storage such as MinIO or RustFS
keyPrefixemptyOnly a subfolder of the bucket becomes the storage
publicBaseUri/fileadmin/The address under which the web server delivers the files
excludedPrefixesa few known foldersParts of the bucket TYPO3 neither sees nor writes
malwareGateoffRefuses files that the AWS malware scan has marked as dangerous
fallbackProcessingFolderoffPuts the image variants from extensions into the bucket as well instead of the local disk

Permissions

The driver needs the right to list the bucket (s3:ListBucket). Without it, S3 answers “forbidden” instead of “not found” for a missing file. On the files it needs read, write and delete. Credentials are not stored in TYPO3. Like with every AWS tool, they come from the environment or, in Kubernetes, from the identity of the pod.

Common pitfalls

Next step

fileadmin in S3 without a network drive?

If your TYPO3 website fetches its media from S3 through a mounted drive, typo3-fal-s3 helps. I support the switch, the permissions in AWS and the delivery through the web server.

Discuss the switch →

Or email me directly: mail@ole-hartwig.eu