Our.Umbraco.StorageProviders.S3Compatible 13.0.0-rc.1

This is a prerelease version of Our.Umbraco.StorageProviders.S3Compatible.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Our.Umbraco.StorageProviders.S3Compatible" Version="13.0.0-rc.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Our.Umbraco.StorageProviders.S3Compatible" Version="13.0.0-rc.1" />
                    
Directory.Packages.props
<PackageReference Include="Our.Umbraco.StorageProviders.S3Compatible" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Our.Umbraco.StorageProviders.S3Compatible --version 13.0.0-rc.1
                    
#r "nuget: Our.Umbraco.StorageProviders.S3Compatible, 13.0.0-rc.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Our.Umbraco.StorageProviders.S3Compatible@13.0.0-rc.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Our.Umbraco.StorageProviders.S3Compatible&version=13.0.0-rc.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Our.Umbraco.StorageProviders.S3Compatible&version=13.0.0-rc.1&prerelease
                    
Install as a Cake Tool

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

  • IFileSystem implementation backed by an S3-compatible bucket
  • Middleware serving media files from the /media path (with ETag, 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 default true
  • Region: 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.