Skip to main content

Multi-Cloud Object Storage

FacilFlow supports multiple cloud storage providers through a unified abstraction layer, enabling seamless switching between storage backends without code changes.

Supported Providers

ProviderTypeUse Case
MinIOSelf-hostedOn-premise deployments, dev/test environments
AWS S3CloudAWS-native deployments, high availability
Azure BlobCloudAzure-native deployments, enterprise integration
Google Cloud StorageCloudGCP-native deployments, analytics workloads

Architecture Overview

Storage Provider Interface

All providers implement the StorageProvider interface:

interface StorageProvider {
readonly type: StorageProviderType
readonly id: string
readonly name: string

// Bucket operations
listBuckets(): Promise<BucketInfo[]>
createBucket(name: string, region?: string): Promise<boolean>
deleteBucket(name: string, force?: boolean): Promise<void>
bucketExists(name: string): Promise<boolean>

// Object operations
listObjects(bucket: string, options?: ListObjectsOptions): Promise<ObjectInfo[]>
putObject(bucket: string, key: string, data: Buffer | ReadableStream, options?: PutObjectOptions): Promise<PutObjectResult>
getObject(bucket: string, key: string): Promise<ReadableStream>
deleteObject(bucket: string, key: string): Promise<void>
deleteObjects(bucket: string, keys: string[]): Promise<void>
objectExists(bucket: string, key: string): Promise<boolean>

// Presigned URLs
getPresignedUrl(bucket: string, key: string, expiresIn?: number): Promise<string>
getPresignedPutUrl(bucket: string, key: string, expiresIn?: number): Promise<string>

// Connection testing
testConnection(): Promise<ConnectionTestResult>
}

Provider Configuration

Each provider requires specific credentials:

MinIO / AWS S3

{
"type": "minio",
"endpoint": "minio.example.com",
"port": 9000,
"useSSL": false,
"credentials": {
"accessKey": "AKIAIOSFODNN7EXAMPLE",
"secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
}

Azure Blob Storage

{
"type": "azure-blob",
"endpoint": "https://account.blob.core.windows.net",
"credentials": {
"connectionString": "DefaultEndpointsProtocol=https;AccountName=..."
}
}

Google Cloud Storage

{
"type": "gcs",
"endpoint": "storage.googleapis.com",
"credentials": {
"projectId": "my-project-id"
}
}
GCS Authentication

Google Cloud Storage uses Application Default Credentials (ADC). Set the GOOGLE_APPLICATION_CREDENTIALS environment variable to point to your service account key file.

API Endpoints

Provider Management

MethodEndpointDescription
GET/api/storage/providersList all configured providers
GET/api/storage/providers/typesGet supported provider types
GET/api/storage/providers/:idGet provider details (credentials masked)
POST/api/storage/providersCreate new provider
PUT/api/storage/providers/:idUpdate provider config
DELETE/api/storage/providers/:idDelete provider
POST/api/storage/providers/:id/testTest connection

Bucket Operations

MethodEndpointDescription
GET/api/bucketsList all buckets
POST/api/bucketsCreate bucket
DELETE/api/buckets/:nameDelete bucket

Object Operations

MethodEndpointDescription
GET/api/buckets/:name/objectsList objects
POST/api/buckets/:name/objectsUpload object
DELETE/api/buckets/:name/objects/:keyDelete object
POST/api/buckets/:name/objects/deleteBatch delete
GET/api/buckets/:name/objects/:key/urlGet download URL

Data Flow

Security Considerations

Credential Storage

  • Credentials are stored in-memory (production should use encrypted database)
  • API responses mask sensitive credential values
  • Connection strings and secret keys are never returned in full

Access Control

  • Provider management requires Admin role
  • Bucket operations respect RBAC permissions
  • Presigned URLs have configurable expiration (default: 1 hour)

Frontend Components

ProviderSelector

Dropdown component for selecting active storage provider:

  • Lists all configured providers with type icons
  • "Add Provider" option opens configuration dialog
  • Connection test button with status indicator
  • Provider type badge (MinIO, S3, Azure, GCS)

Object Store Manager Page

Full-featured storage management interface:

  • Provider selector in header
  • Bucket list sidebar
  • Object browser with folder navigation
  • Upload dialog with drag-and-drop
  • Batch operations (select, delete multiple)

Environment Variables

Backend

# Default MinIO provider (auto-registered on startup)
MINIO_ENDPOINT=localhost
MINIO_PORT=9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_USE_SSL=false

Testing

The storage providers have comprehensive test coverage:

ComponentTests
StorageProvider interface26
MinioProvider28
S3Provider23
AzureBlobProvider20
GCSProvider21
Storage Providers API17
Total135

Run tests:

cd backend
npm test -- src/__tests__/services/providers/
npm test -- src/__tests__/routes/storage-providers.test.ts