devstack · Guide › Object storage (S3/MinIO)
The s3 command group manages tenant-scoped buckets on the shared MinIO
engine (S3-compatible). Like databases, buckets are namespaced per project so
many repos share one MinIO without colliding.
devstack s3 mb uploads # → bucket "acme-uploads" (project "acme")
devstack s3 ls # this project's buckets
devstack aws -- s3 ls s3://acme-uploads # host-side, via the aws CLI shimBy default a bucket's physical name is <project>-<name> (a hyphen, unlike
Postgres which uses _). So project acme + uploads → acme-uploads. Pass
--no-prefix to use the literal name.
devstack s3 mb uploads # → acme-uploads
devstack s3 mb media --versioning # keep every object version
devstack s3 mb shared-assets --no-prefix # literal nameIdempotent — re-running is a no-op.
| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
--versioning |
false | enable object versioning on the new bucket |
--no-prefix |
false | use the literal name (skip the <project>- prefix) |
devstack s3 rb uploads --yes
devstack s3 rb media --force --yes # delete even if non-emptyDestructive; confirmation required (--yes mandatory under --json).
| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
--force |
false | remove even if the bucket is non-empty |
--yes |
false | confirm (required for --json) |
--no-prefix |
false | treat <bucket> as literal |
devstack s3 ls # just this project's buckets
devstack s3 ls --all # every bucket on the shared MinIOLock-free (read-only).
| Flag | Default | Description |
|---|---|---|
--project |
single/first project | scope to a project |
--all |
false | list every bucket, not just this project's |
Expire (and optionally transition) objects automatically.
devstack s3 lifecycle set uploads --expire-days 30
devstack s3 lifecycle set uploads --prefix tmp/ --expire-days 7
devstack s3 lifecycle set media --transition "days=30,tier=STANDARD_IA"
devstack s3 lifecycle get uploads
devstack s3 lifecycle rm uploadss3 lifecycle set flags:
| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
--expire-days |
0 | delete objects after N days |
--transition |
"" | transition rule, e.g. days=30,tier=STANDARD_IA |
--prefix |
"" | scope the rule to a key prefix |
s3 lifecycle get prints the current rules (lock-free); s3 lifecycle rm
removes the whole lifecycle configuration (takes --project).
devstack s3 versioning uploads on
devstack s3 versioning uploads off # suspend| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
devstack s3 policy set assets --public-read # anonymous read
devstack s3 policy set assets --file policy.json # a full policy document
devstack s3 policy get assets # print current policy JSONs3 policy set flags:
| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
--public-read |
false | apply a canned public-read policy |
--file |
"" | path to a policy JSON document |
devstack s3 cors set uploads --file cors.json # array of CORS rules
devstack s3 cors get uploads| Flag | Default | Description |
|---|---|---|
--project |
single/first project | owning project |
--file |
"" | JSON file: an array of CORS rules |
The s3 group covers provisioning. To actually put and get objects from your
host, use the aws shim — it runs the host aws CLI against the local
LocalStack/MinIO endpoint, injecting the endpoint URL, region and dev credentials
for you:
devstack aws -- s3 ls
devstack aws -- s3 cp ./photo.png s3://acme-uploads/photo.png
devstack aws -- s3 ls s3://acme-uploadsEverything after -- is passed straight to aws. (For DNS-only in-container
access, apps reach MinIO at shared-minio:9000; to point a desktop S3 browser at
it, run devstack shared expose first — see shared-services.md.)
An uploads bucket for the app.
devstack s3 mb uploads
devstack aws -- s3 cp ./seed/logo.png s3://acme-uploads/logo.pngAuto-expire temp objects after 7 days.
devstack s3 lifecycle set uploads --prefix tmp/ --expire-days 7
devstack s3 lifecycle get uploadsA public-read assets bucket.
devstack s3 mb assets
devstack s3 policy set assets --public-readKeep every version of an important bucket.
devstack s3 mb archive --versioning
# or, on an existing bucket:
devstack s3 versioning archive onYou can also declare buckets in devstack.yaml under resources: so they're
provisioned as part of up, instead of running s3 mb by hand — see
the resource layer.
- Shared services & host access — expose MinIO to a desktop S3 browser.
- Databases — the parallel
dbgroup on Postgres. - Messaging — queues/topics/streams (incl. SQS/SNS on LocalStack).
- The resource layer — declare buckets in config.
- Command reference — every command, terse.
◀ Databases (Postgres) · Guide index · Messaging ▶