Our.Umbraco.StorageProviders.S3Compatible
13.0.0-rc.1
dotnet add package Our.Umbraco.StorageProviders.S3Compatible --version 13.0.0-rc.1
NuGet\Install-Package Our.Umbraco.StorageProviders.S3Compatible -Version 13.0.0-rc.1
<PackageReference Include="Our.Umbraco.StorageProviders.S3Compatible" Version="13.0.0-rc.1" />
<PackageVersion Include="Our.Umbraco.StorageProviders.S3Compatible" Version="13.0.0-rc.1" />
<PackageReference Include="Our.Umbraco.StorageProviders.S3Compatible" />
paket add Our.Umbraco.StorageProviders.S3Compatible --version 13.0.0-rc.1
#r "nuget: Our.Umbraco.StorageProviders.S3Compatible, 13.0.0-rc.1"
#:package Our.Umbraco.StorageProviders.S3Compatible@13.0.0-rc.1
#addin nuget:?package=Our.Umbraco.StorageProviders.S3Compatible&version=13.0.0-rc.1&prerelease
#tool nuget:?package=Our.Umbraco.StorageProviders.S3Compatible&version=13.0.0-rc.1&prerelease
Our.Umbraco.StorageProviders.S3Compatible
Umbraco 13 media filesystem provider for S3-compatible object storage (Infomaniak, OVH, Exoscale).
It replaces the physical-disk media storage with an S3 bucket, without any change to your content or database: Umbraco keeps storing relative media paths, only the physical file location changes.
Features
IFileSystemimplementation backed by an S3-compatible bucket- Middleware serving media files from the
/mediapath (withETag, conditional requests and HTTP range support) - ImageSharp 3 image provider (original images) and cache (resized images stored under a
cache/prefix) - Works with custom endpoints via
ServiceUrl+ path-style addressing (required by most non-AWS providers)
Requirements
- Umbraco 13 (.NET 8)
Installation
dotnet add package Our.Umbraco.StorageProviders.S3Compatible
Configuration
1. Register the provider (Program.cs)
using Umbraco.Cms.Core.DependencyInjection;
builder.CreateUmbracoBuilder()
.AddBackOffice()
.AddWebsite()
.AddDeliveryApi()
.AddComposers()
.AddS3MediaFileSystem() // <-- add this
.Build();
And in the request pipeline:
app.UseUmbraco()
.WithMiddleware(u =>
{
u.UseBackOffice();
u.UseWebsite();
u.UseS3MediaFileSystem(); // <-- add this
})
.WithEndpoints(u =>
{
u.UseBackOfficeEndpoints();
u.UseWebsiteEndpoints();
});
2. Configure the bucket (appsettings.json)
{
"Umbraco": {
"Storage": {
"S3": {
"Media": {
"BucketName": "my-bucket",
"ServiceUrl": "https://s3.pub1.infomaniak.cloud",
"Region": "us-east-1",
"BucketPrefix": "media"
}
}
}
}
}
Never commit credentials. Provide AccessKey / SecretKey through user secrets, appsettings.local.json, or environment variables:
Umbraco__Storage__S3__Media__AccessKey=...
Umbraco__Storage__S3__Media__SecretKey=...
Options
| Key | Default | Description |
|---|---|---|
BucketName |
(required) | The bucket that holds the files |
ServiceUrl |
(required) | The S3-compatible endpoint of your provider |
Region |
(empty) | Authentication region. A non-empty value is expected by the SDK (us-east-1 works) |
AccessKey / SecretKey |
(empty) | Credentials. Leave empty to use the ambient AWS credentials chain |
BucketPrefix |
media |
Key prefix (virtual folder) for media inside the bucket |
CacheFolder |
cache |
Key prefix for the ImageSharp cache |
ForcePathStyle |
true |
Path-style addressing. Forced to true when ServiceUrl is set |
CannedAcl |
(empty) | Optional canned ACL (private, public-read, ...). Empty = no ACL sent |
Infomaniak
Get the exact endpoint from your Infomaniak Manager (Public Cloud / Object Storage). Keep the bucket private and put a CDN in front for public delivery.
ServiceUrl: the endpoint shown in the Manager (e.g.https://s3.pub1.infomaniak.cloud)ForcePathStyle: keep the defaulttrueRegion: any non-empty value works (us-east-1)
Health check
AddS3MediaFileSystem() registers an ASP.NET Core health check named s3-media-storage
(tags storage, s3) that performs a lightweight list request against the bucket. It never
fails application startup - it only reports status.
To expose it, map a health endpoint in your pipeline, e.g.:
app.UseUmbraco()
.WithEndpoints(u =>
{
u.EndpointRouteBuilder.MapHealthChecks("/health");
u.UseBackOfficeEndpoints();
u.UseWebsiteEndpoints();
});
This is handy for a Docker HEALTHCHECK or uptime monitoring.
Migrating existing media
The media paths stored in the database are relative, so copying the existing files into the bucket while preserving the folder structure keeps every reference valid - no database migration needed.
# aws-cli, pointing at the custom endpoint
aws s3 sync ./wwwroot/media s3://my-bucket/media --endpoint-url https://s3.pub1.infomaniak.cloud
Do not copy the ImageSharp cache; it is regenerated on demand.
Credits
The package icon is based on the bucket icon from Bootstrap Icons (MIT). See THIRD-PARTY-NOTICES.md.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- AWSSDK.S3 (>= 3.7.511.8)
- SixLabors.ImageSharp.Web.Providers.AWS (>= 3.1.4)
- Umbraco.Cms.Web.Common (>= 13.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 13.0.0-rc.1 | 72 | 8/13/2026 |
Initial release: S3-compatible media storage for Umbraco 13 with media middleware, ImageSharp 3 image provider/cache, custom endpoint support (Infomaniak, OVH, Exoscale) and startup options validation.