Skip to content

ADR-0001. S3/Minio is the only live object-storage backend

FieldValue
StatusAccepted
Date2026-03-01
Decidersplatform
Supersedes

Context

  • Earlier wiki drafts described a "dual storage" model (S3 and local disk) with a presigned-URL StaticAssetComponent.
  • That StaticAssetComponent wiring (presigned URLs, MetaLink-backed static-asset options) is present in application-asset.component.ts but commented out — it is not bound at runtime.
  • A local-disk backend would diverge across replicas (no shared volume in K8s) and break horizontal scaling.
  • The only active code path constructs a single BunS3Helper from APP_ENV_S3_* and hardcodes storageType: 's3' on every MetaLink.

Decision

We will support only S3/Minio object storage via BunS3Helper, bound under APPLICATION_S3_STORAGE_HELPER. The local-disk / presigned-URL StaticAssetComponent path stays commented out and is not documented as live.

Consequences

ProsCons
One storage path → simpler reasoning, fewer env varsNo offline/dev-disk fallback — dev needs Minio
Stateless replicas — any pod serves any objectCoupled to an S3-compatible endpoint being available
storageType is effectively constant s3Re-enabling presigned URLs requires uncommenting + an ADR

Alternatives Considered

OptionProsConsWhy rejected
Dual S3 + local-disk backendDev simplicityReplica divergence, no shared volume, more configOperationally fragile in K8s
Presigned-URL StaticAssetComponent nowOffloads streaming from appExtra wiring + MetaLink coupling not yet neededDeferred — keep code commented until required

References

  • packages/asset/src/components/application-asset.component.ts (active BunS3Helper; commented StaticAssetComponent)
  • packages/asset/src/controllers/asset/asset.controller.ts (storageType: 's3')
  • packages/core/src/common/environments.ts (APP_ENV_S3_*)

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.