---
title: "Object storage"
description: "S3-compatible object storage for adult platforms: the bucket and key model, private originals, access keys, presigned URLs, malware scanning, and quotas."
url: "https://adultinfra.com/docs/storage/object-storage/"
dateModified: "2026-09-12"
---

[Home](https://adultinfra.com/) / [Docs](https://adultinfra.com/docs/) / Storage 

# Object storage

S3-compatible object storage for adult platforms: the bucket and key model, private originals, access keys, presigned URLs, malware scanning, and quotas.

LAST REVIEWED 2026-09-13

ON THIS PAGE

- [The bucket and key model](https://adultinfra.com/docs/storage/object-storage/#the-bucket-and-key-model)
- [Keep originals private](https://adultinfra.com/docs/storage/object-storage/#keep-originals-private)
- [Access keys and least privilege](https://adultinfra.com/docs/storage/object-storage/#access-keys-and-least-privilege)
- [Presigned URLs](https://adultinfra.com/docs/storage/object-storage/#presigned-urls)
- [Malware scanning and upload hygiene](https://adultinfra.com/docs/storage/object-storage/#malware-scanning-and-upload-hygiene)
- [Quotas and capacity](https://adultinfra.com/docs/storage/object-storage/#quotas-and-capacity)
- [Where AdultInfra fits](https://adultinfra.com/docs/storage/object-storage/#where-adultinfra-fits) 

**Object storage** is the durable layer that holds your originals, packaged renditions, thumbnails, and generated derivatives, addressed by an S3-compatible API. For an adult platform it is both the system of record for irreplaceable content and the private origin that the delivery tier pulls from.

This page covers the model and the controls that matter when the objects are sensitive and the request volume is high.

## The bucket and key model

A bucket is a namespace; an object is a byte payload plus metadata identified by a key. Everything else (renditions, thumbnails, manifests, moderation artefacts) is just a key layout convention. A layout that scales separates concerns by prefix so that listing, lifecycle rules, and access policy can be scoped precisely:

- `originals/&#x3C;content-id>/`: the untouched upload, never served to viewers.

- `renditions/&#x3C;content-id>/&#x3C;profile>/`: packaged HLS/DASH or progressive output.

- `thumbs/&#x3C;content-id>/`: images and sprite sheets for the catalogue.

- `moderation/&#x3C;content-id>/`: classification output and review artefacts.

Keep keys immutable. Versioning or content-addressed keys let you replace a rendition without breaking caches or invalidating signed URLs that point at the old object.

## Keep originals private

The single most important rule: **originals must never be publicly readable.** They are the source of truth, they may contain embedded metadata you do not want exposed, and they are what you re-derive from after a policy change or takedown. Serve only packaged derivatives, and only through the delivery tier, with the bucket itself restricted to edge and pipeline identities.

If a bucket is reachable from the public internet, every cache, token, and geo control you built at the edge can be bypassed by requesting the origin directly.

## Access keys and least privilege

Use separate credentials per function, never one global key:

- **Ingest** writes to `originals/` and cannot read renditions.

- **Transcode** reads originals and writes renditions.

- **Delivery** reads only packaged prefixes and thumbnails.

- **Moderation** reads and writes only its own prefix.

Scope each key to the narrowest prefix and action set, rotate them on a schedule, and prefer short-lived credentials where the platform supports assuming a role rather than holding a long-lived secret.

## Presigned URLs

A presigned URL grants time-limited access to one object without exposing a key. Use them for:

- Direct browser or app uploads into a quarantine prefix, so bytes never transit your API.

- Time-boxed downloads of a private original for an internal reviewer.

- Short-lived access to a single derivative when a full token-gated delivery path is not warranted.

Keep the expiry as short as the workflow allows, bind the URL to one key and one method, and treat a leaked presigned URL as a leaked object until it expires.

## Malware scanning and upload hygiene

User-generated uploads are hostile input. Scan every object before it can be published, and structure the pipeline so scanning is unavoidable:

- Upload lands in a `quarantine/` prefix via a presigned URL.

- A scanner inspects it; the result is recorded as object metadata or a sidecar record.

- Only objects that pass are promoted into `originals/` and scheduled for transcode.

- Objects that fail are retained for review or deleted per policy.

Validate content type by inspecting bytes, not the client-supplied header, cap object size, and strip or preserve embedded metadata deliberately: some containers carry geolocation or device identifiers.

## Quotas and capacity

Set quotas per bucket and per tenant so one runaway pipeline cannot exhaust shared capacity. Track stored bytes, object count, and request rates separately, because they scale differently: a thumbnail-heavy catalogue can explode object count while consuming modest bytes. Alert on growth rate, not absolute usage alone, and treat lifecycle transitions as the main lever for controlling stored cost.

## Where AdultInfra fits

AdultInfra treats object storage as the private origin behind delivery and AI pipelines, with prefix-scoped credentials, quarantine-and-scan ingest, and lifecycle rules tuned for adult catalogues. If you are consolidating scattered buckets or locking down public originals, start with [the platform overview](https://adultinfra.com/platform/) and bring one content prefix.

**Need this configured for your platform?** [Get a test plan](https://adultinfra.com/contact/) and an engineer will map the resource, cache, and delivery design to your workload.

```json
{"@context":"https://schema.org","@graph":[{"@type":"TechArticle","headline":"Object storage","description":"S3-compatible object storage for adult platforms: the bucket and key model, private originals, access keys, presigned URLs, malware scanning, and quotas.","url":"https://adultinfra.com/docs/storage/object-storage/","dateModified":"2026-09-13","keywords":"adult object storage, S3-compatible storage, presigned URL, private originals, bucket key model","author":{"@id":"https://adultinfra.com/#organization"},"publisher":{"@id":"https://adultinfra.com/#organization"},"inLanguage":"en"},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://adultinfra.com/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https://adultinfra.com/docs/"},{"@type":"ListItem","position":3,"name":"Object storage","item":"https://adultinfra.com/docs/storage/object-storage/"}]}]}
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://adultinfra.com/#organization","name":"AdultInfra","url":"https://adultinfra.com","logo":"https://adultinfra.com/favicon.svg","description":"Luxembourg-based specialist infrastructure for adult platforms.","slogan":"Already behind the adult internet.","areaServed":"Worldwide","knowsAbout":["Adult video CDN","Porn tube site infrastructure","Adult live-cam streaming","Creator subscription platforms","Byte-range video caching","Origin shielding","Player quality of experience","DDoS protection","GPU infrastructure","Adult-capable AI inference"],"location":{"@type":"Place","name":"Luxembourg","address":{"@type":"PostalAddress","addressCountry":"LU"}},"contactPoint":{"@type":"ContactPoint","contactType":"sales","url":"https://adultinfra.com/contact/"}},{"@type":"WebPage","@id":"https://adultinfra.com/docs/storage/object-storage/#webpage","url":"https://adultinfra.com/docs/storage/object-storage/","name":"Object storage","description":"S3-compatible object storage for adult platforms: the bucket and key model, private originals, access keys, presigned URLs, malware scanning, and quotas.","isPartOf":{"@id":"https://adultinfra.com/#website"},"about":{"@id":"https://adultinfra.com/#organization"},"primaryImageOfPage":{"@type":"ImageObject","url":"https://adultinfra.com/og-default.png"},"inLanguage":"en","mainEntity":{"@id":"https://adultinfra.com/docs/storage/object-storage/#article"},"dateModified":"2026-09-13"},{"@type":"WebSite","@id":"https://adultinfra.com/#website","url":"https://adultinfra.com","name":"AdultInfra","description":"Luxembourg-based specialist infrastructure for adult platforms.","publisher":{"@id":"https://adultinfra.com/#organization"},"inLanguage":"en","potentialAction":{"@type":"ContactAction","target":"https://adultinfra.com/contact/"}}]}
```
