Skip to content

Blob Storage

Procella stores checkpoint data (infrastructure state snapshots) in a blob storage backend. Two backends are supported: local filesystem and S3-compatible object storage.

Set PROCELLA_BLOB_BACKEND to choose the backend:

ValueBackendUse Case
local (default)Local filesystemSingle-server development
s3S3-compatibleProduction, multi-replica
Terminal window
export PROCELLA_BLOB_BACKEND=local
export PROCELLA_BLOB_LOCAL_PATH=./data/blobs

Checkpoints are stored as files in the specified directory. The directory is created automatically if it doesn’t exist.

Terminal window
export PROCELLA_BLOB_BACKEND=s3
export PROCELLA_BLOB_S3_BUCKET=procella-checkpoints

Works with any S3-compatible object storage:

ProviderConfiguration
AWS S3Set PROCELLA_BLOB_S3_BUCKET, configure AWS credentials via standard methods
MinIOSet PROCELLA_BLOB_S3_ENDPOINT=http://minio:9000 + static credentials
Cloudflare R2Set PROCELLA_BLOB_S3_ENDPOINT to R2 endpoint + API credentials
DigitalOcean SpacesSet PROCELLA_BLOB_S3_ENDPOINT + access keys

When PROCELLA_BLOB_S3_ENDPOINT is set, Procella uses path-style addressing and requires explicit credentials:

Terminal window
export PROCELLA_BLOB_BACKEND=s3
export PROCELLA_BLOB_S3_BUCKET=procella-checkpoints
export PROCELLA_BLOB_S3_ENDPOINT=http://minio:9000
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=minio

When no custom endpoint is set, Procella uses the standard AWS SDK credential chain:

Terminal window
export PROCELLA_BLOB_BACKEND=s3
export PROCELLA_BLOB_S3_BUCKET=my-procella-bucket
# Credentials via AWS_ACCESS_KEY_ID/SECRET, IAM role, etc.

The blob storage layer implements a simple interface:

export interface BlobStorage {
get(key: string): Promise<Uint8Array | null>;
put(key: string, data: Uint8Array): Promise<void>;
delete(key: string): Promise<void>;
exists(key: string): Promise<boolean>;
}

Keys are opaque strings generated by the checkpoint service. The Delete operation is idempotent — deleting a non-existent key returns success.

The default Docker Compose configuration includes MinIO for local S3-compatible storage:

minio:
image: minio/minio:RELEASE.2025-01-20T14-49-07Z
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000" # S3 API
- "9001:9001" # Web console
minio-init:
image: minio/mc:RELEASE.2025-01-17T23-25-50Z
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 minioadmin minioadmin &&
mc mb --ignore-existing local/procella-checkpoints
"

The minio-init container automatically creates the procella-checkpoints bucket on first start. You can browse stored objects at http://localhost:9001.