Storage support policy
This policy describes storage behavior implemented in the current CaseBender codebase. It does not announce or imply a MinIO retirement date. MinIO remains a supported provider for releases whose release notes include it; any future lifecycle change requires a separately published notice and migration window.Provider support matrix
“Supported” means the provider implements upload, download, delete, exists,
list, metadata, copy, and availability methods behind
StorageService. It does
not mean every S3-compatible product/version is certified. Record the product
version and contract-suite result for each customer deployment.
Configuration contract
Always setSTORAGE_PROVIDER explicitly in production. Auto-detection is a
developer convenience and must not select a backend during a release rollout.
local:STORAGE_PATH=/dataminio:MINIO_ENDPOINTis a hostname,MINIO_PORT,MINIO_USE_SSL=true,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_BUCKET, optionalMINIO_REGIONs3:S3_BUCKET,AWS_REGION, optional IAM-provided credentials, optional HTTPSS3_ENDPOINTgcs:GCS_BUCKET, optionalGCS_PROJECT_ID; use Workload Identity/ADC
MINIO_USE_SSL=false or
use an http:// S3 endpoint outside an explicitly isolated development system.
Application object keys are durable references in the database. Preserve keys
byte-for-byte during migration. Attachment keys currently use
attachments/<entity>/<timestamp>-<sanitized-name>.
Direct MinIO reference inventory
The supported boundary isapps/web/lib/storage/index.ts, with provider
construction in apps/web/lib/storage/factory.ts.
Expected direct SDK usage inside provider adapters:
apps/web/lib/storage/providers/minio.tsapps/web/lib/storage/providers/s3.ts
apps/web/lib/minio/minio.tsconstructs a MinIO client from a database-backed integration and can create buckets.apps/web/server/routers/attachment.tsdeletes attachment objects through the legacy MinIO service instead ofStorageService. This bypassesSTORAGE_PROVIDER, so deletion is incomplete for local, S3, and GCS.apps/web/services/attachment/index.tsimportsMinioServicebut does not use it. Uploads correctly delegate toservices/attachment/server.ts, which usesStorageService.
deleteAttachmentFile/StorageService.delete path, so local, MinIO, S3, and
GCS use the same lifecycle boundary. A storage deletion failure blocks deletion
of the database record and is surfaced to the caller for operational follow-up.
Startup health contract
Before serving writes:- validate the explicit provider and all required values;
- resolve the endpoint and establish a verified TLS connection;
- authenticate with the runtime identity;
- confirm the existing bucket/container or writable
/data; - perform a namespaced write/read/hash/delete canary;
- expose failure through readiness without logging credentials.
isAvailable() methods can create absent MinIO/GCS buckets.
Therefore pre-create storage and validate it with deployment credentials before
application startup. Runtime credentials should normally have object CRUD/list
permissions, not account-wide administration.
Provider contract and integrity
Runscripts/storage/validate-storage.sh with credentials scoped to a dedicated
test prefix. The test verifies startup access, upload, metadata/list visibility,
download SHA-256 integrity, copy integrity, and deletion. Run it:
- before installation and after credential/CA rotation;
- against every S3-compatible product/version offered for support;
- before and after a provider migration;
- during release qualification from the same network and CA trust context as the application.
casebender-contract/<timestamp>-<pid> prefix. A passing CLI test supplements,
but does not replace, an application attachment lifecycle test.
Data protection and operations
- Enable bucket/volume encryption, versioning or snapshots, and independently protected backups.
- Apply retention/object-lock only after validating CaseBender delete and legal hold workflows; retention can make deletes intentionally fail.
- Deny public access. Signed URLs must be short-lived and audited.
- Monitor availability, latency, throttling, capacity, failed deletes, and checksum mismatches.
- Include storage and database in one documented consistency set.
- Test restore and the copy-verify-rollback runbook at least once per supported release train.
storage-migration-runbook.md for migration and
storage-release-security.md for release evidence and SBOM handling.