Skip to content

MinIO

MinIO is a fully S3-compatible object store you can run on your own hardware. NamiDB treats it as another s3:// backend behind a custom endpoint — same object_store::aws::AmazonS3 client, same conditional-write protocol.

If you want a single-file recipe that brings up MinIO and a NamiDB daemon together, see Docker + MinIO. The page below is for using MinIO outside the compose recipe.

URI shape

s3://<bucket>?ns=<namespace>&endpoint=<minio-url>&region=<region>&allow_http=true
  • endpoint= points at the MinIO HTTP endpoint (often http://localhost:9000).
  • region= is required by the S3 client; for MinIO any string works (us-east-1 is conventional).
  • allow_http=true lets the client speak HTTP — MinIO doesn’t serve TLS by default.

Credentials come from the standard AWS env vars (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY).

Stand up MinIO locally

The most direct standalone:

Terminal window
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio server /data --console-address ":9001"

The console is on http://localhost:9001 (login: minioadmin / minioadmin). The S3 API is on :9000.

Create a bucket via the mc CLI:

Terminal window
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/namidb

Connect from NamiDB

import os
import namidb
os.environ["AWS_ACCESS_KEY_ID"] = "minioadmin"
os.environ["AWS_SECRET_ACCESS_KEY"] = "minioadmin"
client = namidb.Client(
"s3://namidb?ns=prod"
"&endpoint=http://localhost:9000"
"&region=us-east-1"
"&allow_http=true"
)
Terminal window
AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin \
namidb run --store "s3://namidb?ns=prod&endpoint=http://localhost:9000&region=us-east-1&allow_http=true" \
"CREATE (a:Person {name: 'Alice'})"
use std::env;
use namidb::storage::{parse_uri, WriterSession};
env::set_var("AWS_ACCESS_KEY_ID", "minioadmin");
env::set_var("AWS_SECRET_ACCESS_KEY", "minioadmin");
let uri = "s3://namidb?ns=prod&endpoint=http://localhost:9000&region=us-east-1&allow_http=true";
let (store, paths) = parse_uri(uri)?;
let mut writer = WriterSession::open(store, paths).await?;

Same shape, every S3-compatible backend

The same URI shape works against any S3-compatible service — Cloudflare R2, Tigris, and LocalStack all plug in the same way. The only thing that changes is the endpoint= value (and allow_http=true for plain-HTTP services like MinIO and LocalStack):

Serviceendpoint=allow_http=true?
MinIO (local)http://localhost:9000yes
LocalStackhttp://localhost:4566yes
Cloudflare R2https://<account>.r2.cloudflarestorage.com + region=autono
Tigrishttps://t3.storage.devno

IAM permissions

NamiDB needs the minimal S3 verb set:

  • s3:GetObject
  • s3:PutObject
  • s3:DeleteObject
  • s3:ListBucket

No DynamoDB lock table, no separate metadata service.

What’s next

  • Docker + MinIO — full local stack (MinIO + namidb-server) in one compose file.
  • Local filesystem — when you’d rather skip the bucket abstraction entirely.
  • In-memory — for the zero-config 30-second taste.