deniz.in

Markets

Weather

Loading weather

· via dev.to (home feed)

RustFS ships one-command Docker Compose setup for self-hosted S3-compatible storage

RustFS, an Apache 2.0 S3-compatible object store written in Rust, can be brought up with a single Docker Compose command, shipping versioning, Object Lock, IAM and server-side encryption.

RustFS ships one-command Docker Compose setup for self-hosted S3-compatible storage

RustFS in one Compose command

RustFS, an open-source object store written in Rust and released under Apache 2.0, speaks the S3 API and can be brought up on local hardware with a single Docker Compose command. A walkthrough published on dev.to steps through the project's official docker-compose-simple.yml, which starts a node listening on port 9000 for the S3 API and port 9001 for the web console, using rustfsadmin for both the access and secret keys — values the file itself flags with a CHANGEME comment.

According to the dev.to guide, the resulting endpoint is MinIO-compatible and arrives with production-oriented features already in place: bucket versioning, Object Lock, IAM, and server-side encryption. Nothing depends on a cloud account, since the whole stack runs on hardware you control.

Two Compose files, two intents

The RustFS repository ships two Compose files. The simple variant launches a bare node, while the full docker-compose.yml layers on observability tooling — Prometheus, Grafana, Tempo, Jaeger, and an optional Nginx. For a quick start, the simple file is the one to reach for, and the only prerequisite is Docker itself, or Podman with podman compose.

What the simple file actually defines

The file describes two services. The rustfs service pulls rustfs/rustfs:latest, maps ports 9000 and 9001, and configures the node through environment variables: RUSTFS_VOLUMES=/data/rustfs{0...3} spreads storage across four volumes, RUSTFS_ADDRESS and RUSTFS_CONSOLE_ADDRESS bind the API and console, and RUSTFS_CONSOLE_ENABLE=true switches the web UI on. A healthcheck probes /health on 9000 and /rustfs/console/health on 9001 every 30 seconds. TLS is optional: mount a certificate directory to /opt/tls and set RUSTFS_TLS_PATH, at which point health checks switch to HTTPS automatically.

The second service, volume-permission-helper, is an Alpine container that chowns the data and log volumes to UID/GID 10001:10001 — the user the RustFS runtime executes as — and then exits. The dev.to guide notes that with a raw docker run and bind mounts, that permission step falls to you, which is one of the reasons it favors Compose.

Storage uses four named volumes, rustfs_data_0 through rustfs_data_3, plus a separate logs volume. The server container runs with no-new-privileges, restarts unless stopped, and keeps strict disk topology checks on by default; RUSTFS_UNSAFE_BYPASS_DISK_CHECK can disable them, but the file treats that as an explicit opt-in for local testing only.

Three steps to a running node

The walkthrough reduces setup to three moves: install Docker Engine and the Compose plugin (or Podman), fetch the official docker-compose-simple.yml from the repository, and run docker compose -f docker-compose-simple.yml up -d. The README also documents a one-line docker run with the same port mappings and bind-mounted data and log directories. The guide's argument for Compose is reproducibility: ports, volumes, environment, restart policy, and health check all live in one file you can commit to version control.

Caveats worth noting

The simple stack is a single node writing across four local volumes, not a distributed deployment. Two capabilities — S3 Tables, the Iceberg REST feature, and MinIO on-disk compatibility — remain in preview. And the default credentials need changing before the endpoint touches anything resembling a shared network.

Why it matters

S3 has become the default interface for object storage, and a large share of tooling — backup systems, data pipelines, CI caches — assumes an S3 endpoint exists somewhere. An Apache 2.0 implementation written in Rust that deploys with one command lowers the barrier for local development environments and small self-hosted setups, with no cloud account and no proprietary license terms to negotiate. The single-node layout and preview-status features signal that the simple stack is best treated as a development or evaluation baseline, with the fuller Compose file available once observability becomes a requirement.

  • #rust
  • #docker
  • #object-storage
  • #s3
  • #open-source
  • #self-hosting

Related posts