Add S3-Compatible Encrypted Blob Storage Backend
Priority
P2
Type
feature
Labels
Suggested GitHub labels:
backlog
go
testing
docs
deployment
security
Branch scope
- Current branch:
develop
- Current HEAD:
539bb8d0a2cab1b9dc5e18ff394ae9959c8d7350
- Target branch, if known:
develop
- Reviewed branch/ref, if applicable:
develop
- Reviewed commit SHA, if applicable:
539bb8d0a2cab1b9dc5e18ff394ae9959c8d7350
- Target release/version, if applicable:
post-#88 production-cluster follow-up
- Scope classification:
follow-up-after-merge
- Scope note: This draft was generated from the branch above. Revalidate against the target branch before creating or closing public GitHub issues if the branch has moved or has not yet merged.
Summary
Add optional S3-compatible object storage for committed encrypted chunks while preserving local filesystem blob storage as the default.
Context
docs/production-cluster-scope.md plans S3-compatible object storage as the optional production blob backend. The object store must hold opaque encrypted bytes only, use server-controlled object keys, preserve no-overwrite behavior for committed chunks, and provide cleanup guidance for abandoned staging objects. The current internal/storage implementation uses local temp files and hard links to provide immutable final paths.
Proposed change
Implement an optional S3-compatible blob backend after backend selection configuration and a blob-store interface exist. The backend should preserve the current upload contract: uploaded ciphertext is hashed before commit, committed objects are immutable, stored identifiers are server-controlled, and bundle generation streams encrypted bytes without exposing storage internals.
Acceptance criteria
Tests / validation
Out of scope
- Do not add provider-specific deployment files, Docker Compose, Kubernetes, Terraform, account management, public
/v1 exposure, backend decryption, key escrow, or server-side playable media export.
- Do not require S3-compatible storage for local development.
- Do not implement PostgreSQL or Valkey/Redis coordination in this task unless explicitly split into separate accepted issues.
Notes
- Supported by
docs/production-cluster-scope.md, internal/storage, internal/httpapi/upload.go, internal/httpapi/bundles.go, docs/security-model.md, and docs/threat-model.md.
- Related PR:
#88.
- Suggested prerequisite drafts:
001-add-backend-selection-configuration-scaffold.md and 003-introduce-blob-store-backend-interface.md.
- Label note: repository labels do not include
storage, s3, or object-storage; this draft uses go, testing, docs, deployment, and security.
Add S3-Compatible Encrypted Blob Storage Backend
Priority
P2
Type
feature
Labels
Suggested GitHub labels:
backloggotestingdocsdeploymentsecurityBranch scope
develop539bb8d0a2cab1b9dc5e18ff394ae9959c8d7350developdevelop539bb8d0a2cab1b9dc5e18ff394ae9959c8d7350post-#88 production-cluster follow-upfollow-up-after-mergeSummary
Add optional S3-compatible object storage for committed encrypted chunks while preserving local filesystem blob storage as the default.
Context
docs/production-cluster-scope.mdplans S3-compatible object storage as the optional production blob backend. The object store must hold opaque encrypted bytes only, use server-controlled object keys, preserve no-overwrite behavior for committed chunks, and provide cleanup guidance for abandoned staging objects. The currentinternal/storageimplementation uses local temp files and hard links to provide immutable final paths.Proposed change
Implement an optional S3-compatible blob backend after backend selection configuration and a blob-store interface exist. The backend should preserve the current upload contract: uploaded ciphertext is hashed before commit, committed objects are immutable, stored identifiers are server-controlled, and bundle generation streams encrypted bytes without exposing storage internals.
Acceptance criteria
Tests / validation
gofmt -w ./cmd ./internal ./migrations, if Go files changego test ./..., if code changesgo vet ./..., if code changes or CI/testing changesOut of scope
/v1exposure, backend decryption, key escrow, or server-side playable media export.Notes
docs/production-cluster-scope.md,internal/storage,internal/httpapi/upload.go,internal/httpapi/bundles.go,docs/security-model.md, anddocs/threat-model.md.#88.001-add-backend-selection-configuration-scaffold.mdand003-introduce-blob-store-backend-interface.md.storage,s3, orobject-storage; this draft usesgo,testing,docs,deployment, andsecurity.