Guide Home 1. Solution Topology 2. Aspire as 3. Shared Configuration 4. Metadata with 5. Upload API 6. Object Storage 7. Worker Ingestion 8. Extracting and 9. Literary Artifacts 10. AI Provider 11. Qdrant Vector 12. Ask Flow 13. Prompting and 14. Testing the 15. Local Development All Guides
Guide navigationIndex and chapters
Chapter 6

Object Storage with MinIO

Original files are stored in object storage before indexing. The local implementation is RAG.Core/Services/S3ObjectStorage.cs.

Decorative chapter image for Object Storage with MinIO
Object keys are rooted by document ID
var objectKey = $"{documentId:N}/{fileName}";
await storage.UploadAsync(objectKey, stream, contentType, cancellationToken);

Original files are stored in object storage before indexing. The local implementation is RAG.Core/Services/S3ObjectStorage.cs.

MinIO is used because it is S3-compatible and easy to run locally in Docker. The same abstraction could later support:

The object key uses the document ID:

{documentId}/{originalFileName}

This avoids filename collisions and makes it easy to trace a stored object back to the metadata row.

Keeping original files matters because vector chunks are derived data. If chunking, extraction, embedding, or analysis changes later, the worker can reprocess the original document.

The storage abstraction now includes DeleteAsync as well as upload and read operations. That lets document deletion clean up the original object together with metadata and vector points, which is the minimum lifecycle support a real document RAG system needs.