ADR-0001. S3/Minio is the only live object-storage backend
| Field | Value |
|---|---|
| Status | Accepted |
| Date | 2026-03-01 |
| Deciders | platform |
| Supersedes | — |
Context
- Earlier wiki drafts described a "dual storage" model (S3 and local disk) with a presigned-URL
StaticAssetComponent. - That
StaticAssetComponentwiring (presigned URLs, MetaLink-backed static-asset options) is present inapplication-asset.component.tsbut 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
BunS3HelperfromAPP_ENV_S3_*and hardcodesstorageType: '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
| Pros | Cons |
|---|---|
| One storage path → simpler reasoning, fewer env vars | No offline/dev-disk fallback — dev needs Minio |
| Stateless replicas — any pod serves any object | Coupled to an S3-compatible endpoint being available |
storageType is effectively constant s3 | Re-enabling presigned URLs requires uncommenting + an ADR |
Alternatives Considered
| Option | Pros | Cons | Why rejected |
|---|---|---|---|
| Dual S3 + local-disk backend | Dev simplicity | Replica divergence, no shared volume, more config | Operationally fragile in K8s |
Presigned-URL StaticAssetComponent now | Offloads streaming from app | Extra wiring + MetaLink coupling not yet needed | Deferred — keep code commented until required |
References
packages/asset/src/components/application-asset.component.ts(activeBunS3Helper; commentedStaticAssetComponent)packages/asset/src/controllers/asset/asset.controller.ts(storageType: 's3')packages/core/src/common/environments.ts(APP_ENV_S3_*)