Software Mirrors
ProductsBlogs
RustFS 1.0.1

RustFS 1.0.1

RustFS is an open-source S3-compatible object storage platform built in Rust for high performance, distributed storage, data lakes, AI workloads, backups, and MinIO-compatible deployments.
(4.5)

Developer

RustFS

Category

Developer Tools

Operating System

Windows / Linux / macOS

Date Published

Mon Oct 05 2026

Review RustFS 1.0.1

RustFS is an open-source object storage system designed to provide S3-compatible storage for applications, backups, data lakes, AI workloads, and other large-scale data environments. Built in Rust, the project focuses on performance, memory safety, distributed deployment, and compatibility with existing S3-based applications.

It can run as a standalone server or as a distributed storage cluster, making it suitable for both smaller self-hosted deployments and larger storage environments.

Features

RustFS provides an S3-compatible API for storing and managing objects. It supports core capabilities such as uploads, downloads, bucket management, versioning, object locking, lifecycle management, event notifications, and server-side encryption.

The platform includes distributed storage, healing and background scanning, bitrot protection, pool expansion, bucket replication, and site replication. These features make RustFS more suitable for production object-storage deployments than a simple file server.

Security features include IAM policies, OIDC and SSO integration, server-side encryption, and a built-in key management system. RustFS supports Vault and AWS KMS backends for production KMS deployments.

RustFS also includes a web-based management console for administration and object management. Kubernetes Helm charts are available for container-orchestrated deployments.

Beyond S3, RustFS provides additional protocols and integrations, including OpenStack Swift, Keystone authentication, SFTP, FTPS, and WebDAV. Some of these capabilities are enabled through optional build features.

Download RustFS 1.0.1 - Software Mirrors

RustFS 1.0.1 for Windows

rustfs-windows-x86_64-v1.0.1.zip | 101.35 MB

rustfs-windows-x86_64-latest.zip | 101.35 MB

RustFS 1.0.1 for macOS

rustfs-macos-aarch64-v1.0.1.zip | 84.06 MB

rustfs-macos-aarch64-latest.zip | 84.06 MB

RustFS 1.0.1 for Linux

rustfs-linux-x86_64-musl-v1.0.1.zip | 188.11 MB

rustfs-linux-x86_64-musl-v1.0.1.rpm | 93.33 MB

rustfs-linux-x86_64-musl-v1.0.1.deb | 67.01 MB

rustfs-linux-x86_64-musl-latest.zip | 188.11 MB

rustfs-linux-x86_64-gnu-v1.0.1.zip | 197.26 MB

rustfs-linux-x86_64-gnu-v1.0.1.rpm | 100.84 MB

rustfs-linux-x86_64-gnu-v1.0.1.deb | 71.73 MB

rustfs-linux-x86_64-gnu-latest.zip | 197.26 MB

rustfs-linux-aarch64-musl-v1.0.1.zip | 172.66 MB

rustfs-linux-aarch64-musl-v1.0.1.rpm | 86.09 MB

rustfs-linux-aarch64-musl-v1.0.1.deb | 62.22 MB

rustfs-linux-aarch64-musl-latest.zip | 172.66 MB

rustfs-linux-aarch64-gnu-v1.0.1.zip | 187.57 MB

rustfs-linux-aarch64-gnu-v1.0.1.rpm | 97.74 MB

rustfs-linux-aarch64-gnu-v1.0.1.deb | 69.54 MB

rustfs-linux-aarch64-gnu-latest.zip | 187.57 MB

RustFS 1.0.1 Source Code

RustFS 1.0.1 Source code (zip)

RustFS 1.0.1 Source code (tar.gz)

RustFS 1.0.1 Release Notes:

What's Changed

  • feat(nightly): publish packages as assets of the rolling 'nightly' release (sync from release) by @majinghe in #7593

  • fix(ecstore): stop pruning at nonempty directories by @marshawcoco in #7616

  • fix(replication): close the pre-stable convergence gaps from backlog#2367 by @reatang in #7626

  • feat(console): support a configurable console URL prefix by @overtrue in #7634

  • chore(release): merge release into main for rc.6 by @overtrue in #7638

  • feat: configure the console base path at build time by @cxymds in #7636

  • chore(release): prepare 1.0.0-rc.6 by @overtrue in #7641

  • fix(heal): preserve retryable batch failures during recovery by @overtrue in #7642

  • fix(s3): reject oversize single PUT early and map body errors to 4xx by @reatang in #7635

  • fix(ecstore): make directory mtime fixture portable by @marshawcoco in #7623

  • fix(storage): prevent readiness after native migration failures by @rjregenold in #7652

  • fix(admin): expose OIDC account display fields by @GatewayJ in #7654

  • fix(replication): correct peer joins and remote-state reporting by @jkossis in #7650

  • feat(ci): add fault-tolerance degradation suite to the functional chain by @majinghe in #7663

  • fix(ci): repair functional defaults and chain regression checks by @overtrue in #7664

  • "feat(ci): add fault-tolerance degradation suite to the functional chain" by @majinghe in #7667

  • fix(ci): align security workflow tests with chain by @cxymds in #7679

  • test(kms): cover non-default Vault Transit paths by @hkwi in #7657

  • fix(s3): bound stalled UploadPart request bodies by @cxymds in #7659

  • fix: enforce S3 permissions for recursive force deletion by @cxymds in #7661

  • fix(tables): reject reserved warehouse locations by @GatewayJ in #7671

  • fix(e2e): require a verified server binary for every e2e run by @overtrue in #7687

  • fix(ci): bind nightly lanes to one resolved source by @overtrue in #7688

  • feat(ci): measure queue and execution time by run attempt by @overtrue in #7689

  • fix(ci): verify complete functional chain evidence by @overtrue in #7690

  • fix(kms): classify KMS/SSE error contracts and SSE-S3 headers by @reatang in #7697

  • Collect bounded Connect environment inventory by @overtrue in #7710

  • Add Connect service license commands by @overtrue in #7711

  • Add consent-bound diagnostic scheduling by @overtrue in #7713

  • feat(connect): advertise environment diagnostics by @overtrue in #7714

  • feat(connect): add consent-bound profile exports by @overtrue in #7716

  • feat(connect): add bounded local log capture by @overtrue in #7718

  • feat(connect): add bounded network performance producer by @overtrue in #7719

  • Add bounded local telemetry export commands by @overtrue in #7720

  • Add bounded drive performance command by @overtrue in #7721

  • Add bounded top diagnostic captures by @overtrue in #7722

  • Add client-to-deployment performance diagnostics by @overtrue in #7726

  • Add a local environment inventory command by @overtrue in #7728

  • feat(connect): add bounded object performance diagnostics by @overtrue in #7734

  • Add authenticated inter-node network performance probes by @overtrue in #7739

  • fix(site-replication): keep an operator's bucket-level target to a peer instead of taking it over by @reatang in #7709

  • chore(deps): update flake.lock by @houseme in #7733

  • feat(connect): support explicit enterprise proxies by @overtrue in #7745

  • feat(connect): emit drive unavailable log events by @overtrue in #7747

  • feat(connect): add local inspect export producer by @overtrue in #7750

  • test(connect): cover nested allocator profile stats by @overtrue in #7717

  • docs(security): add presigned copy advisory lesson by @overtrue in #7754

  • fix(ecstore): refuse RMW and reads of unreadable bucket configs by @overtrue in #7759

  • refactor(filemeta): own persisted metadata key authority by @overtrue in #7760

  • Sync network performance protocol fixtures by @overtrue in #7761

  • Sync site replication result fixtures by @overtrue in #7762

  • Sync telemetry producer fixtures by @overtrue in #7763

  • refactor(rio): own trailer source and drop s3s dependency by @overtrue in #7764

  • Deliver diagnostic scheduler receipts to Connect by @overtrue in #7767

  • fix(ecstore): refuse writes on unreadable bucket configs with 503 by @overtrue in #7768

  • feat(connect): add site replication performance producer by @overtrue in #7769

  • refactor(ecstore): read persisted object-metadata keys from the filemeta authority (A3b) by @overtrue in #7770

  • feat(connect): add device license renewal client by @overtrue in #7771

  • feat(connect): add approved artifact relay by @overtrue in #7772

  • fix(connect): export relay CLI types by @overtrue in #7773

  • feat(connect): add device report upload client by @overtrue in #7774

  • feat(connect): add typed telemetry trace source by @overtrue in #7775

  • fix(connect): avoid shadowing replication URL helper by @overtrue in #7777

  • fix(connect): restore site replication test nonce by @overtrue in #7778

  • fix(connect): restore rustfs build after site replication perf producer by @overtrue in #7779

  • fix(rustfs): restore test compilation by @overtrue in #7780

  • feat(connect): sign site replication target pair by @overtrue in #7781

  • refactor(filemeta): own RestoreStatus and drop the s3s dependency (A3c) by @overtrue in #7782

  • feat(connect): add service license relay import by @overtrue in #7784

  • feat(admin): add a gateway key inventory for the S3 stack switch by @overtrue in #7785

  • feat(server): add RUSTFS_S3_STACK with a gateway GetBucketLocation path by @overtrue in #7786

  • revert: remove M1 gateway git dependency until CI can access rustfs/gateway by @overtrue in #7787

  • fix: retry IAM migration quorum failures on startup by @overtrue in #7788

  • fix: retry interrupted uploads through proxies by @overtrue in #7789

  • fix(connect): capture telemetry from server runtime by @overtrue in #7790

  • fix: classify explicit proxy failures by @overtrue in #7791

  • fix: skip IAM migration when legacy volume is absent by @overtrue in #7792

  • fix(release): include CLI in Linux artifacts by @overtrue in #7794

  • fix(release): serialize Linux binary links by @overtrue in #7797

  • feat(connect): expose live lock count snapshots by @overtrue in #7801

  • feat(connect): capture live API activity by @overtrue in #7804

  • feat(connect): collect native Linux thread states by @overtrue in #7806

  • feat(connect): capture live RPC activity by @overtrue in #7807

  • test(connect): verify top.disk release artifacts by @overtrue in #7808

  • test(connect): require native top.disk runner by @overtrue in #7809

  • feat(connect): capture bounded local CPU profiles by @overtrue in #7811

  • ci: retain top disk acceptance archive by @overtrue in #7812

  • fix(connect): observe host traffic in top net by @overtrue in #7814

  • ci: enable CPU profiling in supported release builds by @overtrue in #7815

  • test(connect): verify profile cpu release artifacts by @overtrue in #7818

  • test(connect): retain CPU profile verification key by @overtrue in #7819

  • test(connect): retain CPU profile import bundle by @overtrue in #7820

  • feat(connect): expose object inspect CLI by @overtrue in #7821

  • feat(connect): wrap diagnostic reports for upload by @overtrue in #7822

  • fix(connect): parse inspect paths as paths by @overtrue in #7826

  • feat(connect): verify typed diagnostic jobs by @overtrue in #7827

  • fix(connect): accept KMS report upload authorization by @overtrue in #7828

  • Run signed diagnostic jobs in the RustFS service by @overtrue in #7829

  • fix(connect): emit canonical report manifest time by @overtrue in #7830

  • Upload diagnostic job results through support bundles by @overtrue in #7831

  • fix(connect): emit canonical top envelope time by @overtrue in #7836

  • fix(connect): publish diagnostic producer capabilities by @overtrue in #7837

  • fix(io-metrics): drop the rustfs-common edge by injecting the S3 telemetry observer by @overtrue in #7795

  • fix(replication): count a bodiless 405 as a replicated delete marker by @reatang in #7756

  • fix(kms): refuse key ids that leave the key prefix on the Vault backends by @reatang in #7727

  • Preserve safe profile job failure reasons by @overtrue in #7860

  • Freeze the heartbeat producer capability registry by @overtrue in #7861

  • fix: resume GET body after peer short EOF by @houseme in #7852

  • ci: file scheduled-failure issues in rustfs/backlog by @majinghe in #7847

  • fix(admin): keep the gateway key inventory off the s3s surface by @overtrue in #7817

  • fix(s3): honor presigned UploadPart checksum queries by @overtrue in #7748

  • fix(auth): reject unsigned x-amz headers on header-signed SigV4 requests by @overtrue in #7796

  • fix(table-catalog): map transient lock failures to unavailable by @marshawcoco in #7841

  • Verify profile service jobs on native Linux by @overtrue in #7862

  • Authorize the private Connect acceptance checkout by @overtrue in #7863

  • Run profile service acceptance directly by @overtrue in #7864

  • Retain profile service failure evidence by @overtrue in #7868

  • fix: update dependencies and preserve transport errors by @dependabot[bot] in #7798

  • ci: expect BACKLOG_ISSUE_TOKEN in scheduled alert wiring checks by @majinghe in #7867

  • Pace diagnostic job result redelivery by @overtrue in #7869

  • Execute authenticated top.api service jobs by @overtrue in #7872

  • feat(connect): execute top.locks service jobs by @overtrue in #7874

  • fix(ci): gate Connect acceptance on x86 build job by @overtrue in #7875

  • fix(ci): repair E2E inventory and network CLI coverage by @overtrue in #7871

  • feat(connect): execute performance network jobs by @overtrue in #7877

  • feat(connect): execute bounded drive performance jobs by @overtrue in #7878

  • Preserve the top API service job nonce by @overtrue in #7879

  • feat(connect): execute thread profile service jobs by @overtrue in #7880

  • Execute authenticated top.rpc service jobs by @overtrue in #7881

  • ci: add service diagnostic acceptance workflows by @overtrue in #7882

  • ci: add threads and RPC acceptance workflows by @overtrue in #7883

  • fix(connect): deliver diagnostic results until expiry by @overtrue in #7886

  • feat(connect): export signed environment inventory by @overtrue in #7887

  • fix: recover interrupted GETs and heal operations by @overtrue in #7876

  • fix: keep top locks within its capture window by @overtrue in #7888

  • fix: recover heal after peer boot epoch changes by @overtrue in #7889

  • ci: register the table suite workflow on the default branch by @majinghe in #7893

  • test(ecstore): synchronize causal cleanup observations by @overtrue in #7894

  • fix(ecstore): create markers for repeated versioned deletes by @GatewayJ in #7884

  • Preserve top.locks signed job nonce by @overtrue in #7898

  • fix(ecstore): roll back failed delete marker writes by @overtrue in #7899

  • chore(deps): refresh RustFS tokio tar dependency by @houseme in #7907

  • fix(ci): retain failed functional chain reports and check runners by @majinghe in #7906

  • fix(ci): bound non-performance functional suites to one hour by @majinghe in #7911

  • ci(build): run linux build lanes on sm-standard-4 runners by @majinghe in #7917

  • fix(ecstore): admit transformed small objects inline by plaintext size by @reatang in #7916

  • ci(chain): stop gating all suites on the performance runner by @majinghe in #7924

  • perf(rustfs): skip redundant content-sha256 pass on signed PUTs by @reatang in #7928

  • ci: register the fault-tolerance suite workflow on the default branch by @majinghe in #7929

  • chore(release): merge release into main after 1.0.0 by @overtrue in #7935

  • fix(ecstore): keep decommission multipart on reserved target by @cxymds in #7937

  • fix(heal): match legacy null version during replacement readback by @cxymds in #7933

  • fix(heal): certify metadata health and marker repair receipts by @cxymds in #7932

  • ci(ft): upload the fault-tolerance report to the dashboard by @majinghe in #7939

  • ci: drop dead references to the deleted release branch by @overtrue in #7945

  • build(deps): update dependency versions by @houseme in #7942

  • perf(s3select): accelerate ScanRange record scanning by @GatewayJ in #7934

  • fix(ci): bound the fault-tolerance dashboard upload step by @overtrue in #7948

  • chore(release): prepare 1.0.1 by @overtrue in #7946

  • fix(ecstore): forward quota admission on CopyObject destination writes by @overtrue in #7947

  • feat(tables): support staged table creation by @GatewayJ in #7919

  • refactor(obs): depend on dial9 crate by @houseme in #7949

  • fix(ecstore): reuse metadata read guards during writes by @jkossis in #7941

  • fix(ilm): keep expiry pending gauge balanced and drain overwrite tails by @overtrue in #7944

  • fix(ecstore): keep the single-block bound on every inline candidate by @overtrue in #7954

  • Allow 127.0.0.0/8 as loopback addresses for binding by @aredridel in #7943

  • fix(ecstore): hide and reclaim ancestors of delete residue in prefix listings by @overtrue in #7955

  • fix(readiness): smooth pool metadata timeout flaps by @houseme in #7956

  • fix(heal): prevent MRF starvation of integrity repairs by @houseme in #7963

  • fix(lock): contain slow peer RPC admission storms by @houseme in #7970

  • fix(rebalance): defer retryable source cleanup failures by @cxymds in #7977

  • feat(release): add workspace cargo publish tooling by @houseme in #7973

  • fix(ci): reject incomplete fault-tolerance runs by @GatewayJ in #7961

  • feat(helm): add ingress support for both console and endpoint by @kokorousaki in #7972

  • ci(performance): move the performance suite to its own concurrency group by @majinghe in #7984

  • fix(decommission): keep scanner backlog handoff conflicts recoverable by @cxymds in #7979

  • fix(notify): validate bucket notification config before saving by @cxymds in #7980

  • ci(performance): drop stale shared-lock comment from the performance workflow by @overtrue in #7987

  • fix(scanner): resume and persist checkpoints across leader handoff by @houseme in #7982

  • build(deps): refresh workspace dependencies by @houseme in #7986

  • fix(ecstore): preserve vectored bitrot writes by @houseme in #7981

  • fix(helm): default the ingress backend port and refresh the nix cli hashes by @overtrue in #7990

  • build(deps): bump dial9 to 0.5.1 by @houseme in #7991

  • fix(replication): harden delete marker HEAD convergence by @houseme in #7993

  • docs(operations): add cluster and erasure-coding lifecycle runbook by @overtrue in #7998

  • fix(heal): fail admin heal with unhealthy drives by @cxymds in #7996

  • fix(ecstore): preserve bounded listing completion reason by @houseme in #7994

  • fix(heal): discharge absent durable partial writes by @houseme in #8000

  • feat: expose subscriptions used by event destinations by @cxymds in #8001

  • fix(tier): model R2 as unversioned storage by @cxymds in #8004

  • fix(ecstore): repair buckets left with only an incarnation sidecar by @overtrue in #8008

  • fix(heal): inspect stale members during deep scans by @cxymds in #8009

  • fix(tier): gate opaque version recovery cleanup by @cxymds in #8006

  • fix(release): sort pre-release packages below their final release by @overtrue in #8016

  • fix(ecstore): retry fleet capability probe while the notification system boots by @overtrue in #8017

  • fix(heal): close tail-truncation and stale current-marker gaps by @cxymds in #8019

  • fix: serialize notify runtime module switch reconciliation by @cxymds in #8020

  • fix(scanner): protect single-disk foreground latency by @houseme in #8022

  • test(heal): cover stale current delete marker rejoin by @cxymds in #8021

  • fix(package): preserve service state across upgrades by @majinghe in #8024

  • ci(chain): fall back to auto-testing main HEAD when the pinned harness goes stale by @majinghe in #8026

  • fix(ecstore): allow server-side copy at normal read quorum by @overtrue in #8029

  • fix(get): skip futile resume for single-disk objects by @houseme in #8031

  • chore(deps): update flake.lock by @houseme in #8033

  • docs(security): add encrypted ETag advisory lesson by @overtrue in #8040

  • ci(docker): sync the Docker Hub overview from README.md on release by @Marukome0743 in #8034

  • fix(heal): preserve remote corruption and reject incomplete deep scans by @cxymds in #8032

  • fix(ci): give the chain staleness probe a token that can read auto-testing by @majinghe in #8041

  • fix(heal): restore bucket metadata before replacement completion by @overtrue in #8042

  • fix(decommission): use owned data for source capacity by @cxymds in #8038

  • fix(lifecycle): reject empty expiration actions by @cxymds in #8045

  • fix(obs): default span events to none and gate span list by level by @cxymds in #8047

  • fix: rename admin metrics endpoint to realtime by @cxymds in #8046

  • fix(rebalance): retry fleet proof before start activation by @cxymds in #8049

  • fix(ci): align FT evidence contract with scenario E (44 cases) by @majinghe in #8052

  • fix(ecstore): bound decommission capacity gate waits by @cxymds in #8044

  • test(ci): align FT workflow contract tests with scenario E (44 cases) by @majinghe in #8054

  • fix(ci): accept the testing-sha staleness fallback in chain evidence by @majinghe in #8056

  • fix(s3): emit x-amz-expiration as HTTP-date by @cxymds in #8057

  • fix(obs): support custom OTLP CA bundles by @houseme in #8060

  • feat(ci): on-demand fault-tolerance matrix sweep workflow by @majinghe in #8058

  • fix(ecstore): bound decommission target gate contention by @cxymds in #8061

  • feat(integrity): add inventory, audit, and protected migration by @cxymds in #8065

  • fix(ftps): bound upload memory with multipart streaming by @bolero2 in #8064

  • fix(amqp): emit S3 events directly in notification records by @bolero2 in #8066

  • fix(ci): publish version-tagged preview Docker images by @overtrue in #8068

  • fix(heal): preserve decode repair signals and retry startup quorum by @cxymds in #8067

  • ci(package): build gnu and musl DEB/RPM variants with distinct file names by @majinghe in #8079

  • fix(heal): recreate missing bucket volumes by @cxymds in #8082

  • fix(heal): retry faulty storage disk errors by @cxymds in #8086

  • chore(ci): refresh checkout pin in validated workflows by @houseme in #8083

  • chore(ci): complete action pin and HAProxy upgrades by @houseme in #8090

  • perf(ecstore): parallelize multipart I/O setup and metadata reads by @GatewayJ in #8085

  • docs: update license copyright to RustFS, Inc. by @overtrue in #8097

  • fix(s3): default CopyObject content-type to binary/octet-stream on REPLACE by @TylerHillery in #8073

  • fix(heal): preserve retryable writer failures by @cxymds in #8089

  • feat(connect): sample memory within the running service by @overtrue in #8091

  • fix(connect): preserve diagnostic schedules across restart by @overtrue in #8092

  • test(connect): add scheduler receipt acceptance workflow by @overtrue in #8078

  • fix(ecstore): resume scan_dir past a dash-suffixed sibling directory by @gmelikov in #8071

  • fix(heal): detect stale delete-marker metadata by @cxymds in #8102

  • chore: upgrade workspace dependency releases by @houseme in #8107

  • ci: replace ubuntu-latest runner with sm-standard-2 across workflows by @majinghe in #8112

  • fix(release): defer installation updates until artifacts are live by @overtrue in #8122

  • feat(github): add issue forms with storage support checks by @overtrue in #8123

  • Update bug report storage requirements: allow SAN/JBOD, recommend XFS by @loverustfs in #8125

  • fix(ci): make shared checks portable across runners by @overtrue in #8124

  • ci: run distributed e2e on ubuntu-latest to restore tmpfs mounts by @majinghe in #8128

  • fix(scanner): bound SNSD deep scans and checkpoint cloning by @houseme in #8126

  • feat(ecstore): integrate io_uring backend improvements by @houseme in #8105

  • ci: run the KMS Vault lanes on ubuntu-latest again by @majinghe in #8133

  • ci: align the matrix contract with the 36-combination sweep by @majinghe in #8136

  • fix(ecstore): admit cold bucket metadata at read quorum by @cxymds in #8120

  • fix(storage): weight automatic multipart admission by part size by @overtrue in #8118

  • feat(connect): add bounded health service job by @overtrue in #8139

  • ci: keep gh-dependent release jobs on GitHub-hosted runners by @overtrue in #8137

  • test: add health service acceptance workflow by @overtrue in #8140

  • fix(connect): pace diagnostic network payload sends by @overtrue in #8096

  • test(connect): expose typed drive measurement failure context by @overtrue in #8099

  • fix(scanner): build raw enumeration indexes incrementally by @hkwi in #8114

  • fix(architecture): route health.rs storage imports through storage_api facade by @overtrue in #8143

  • fix(ci): bootstrap release upload CLIs by @overtrue in #8144

  • fix(ci): install GitHub CLI for Connect health acceptance by @overtrue in #8146

  • ci: run the chain orchestration jobs on the smoke-testing runner by @majinghe in #8147

  • fix(ci): validate health binary without file utility by @overtrue in #8157

  • fix(ci): run health acceptance on Docker-capable workers by @overtrue in #8158

  • test(connect): sync heartbeat capability expectations by @cxymds in #8161

  • ci: build linux-aarch64 natively on sm-standard-4-arm and verify every Linux package by @majinghe in #8160

  • fix: admit cold reads and readiness at read quorum by @loverustfs in #8156

  • Generate CPU symbol catalogs from release executables by @overtrue in #8165

  • Use pinned release catalogs for Connect CPU acceptance by @overtrue in #8166

  • Collect bounded metrics from the serving Tokio runtime by @overtrue in #8167

  • fix(scanner): recover after cycle-state persistence failures by @overtrue in #8148

  • feat(connect): capture service runtime profiles over local IPC by @overtrue in #8168

  • ci: default manual builds to artifacts without publishing by @overtrue in #8171

  • ci: verify Top disk in the serving process by @overtrue in #8173

  • fix: collect offline Top disk from the running service by @overtrue in #8174

  • feat(connect): execute signed disk diagnostics in the service by @overtrue in #8177

  • ci(connect): use Node 25 for acceptance workflows by @overtrue in #8179

  • ci: refresh the preview-release contract for the current build workflow by @majinghe in #8178

  • ci(connect): match GNU build runner in acceptance checks by @overtrue in #8180

  • fix: bound restarted-peer stalls on quorum reads and writes by @loverustfs in #8152

  • fix(helm): route Gateway API traffic to the chart service by @overtrue in #8145

  • fix(connect): admit complete release CPU symbol catalogs by @overtrue in #8184

  • fix(ci): verify GNU packages with CPU catalogs by @overtrue in #8186

  • fix(connect): return profile capture result directly by @houseme in #8182

  • fix(ci): repair pool budgets and Connect test failures by @majinghe in #8155

  • fix(ci): verify CPU acceptance identity without gh by @overtrue in #8188

  • fix(ci): run CPU acceptance with Docker by @overtrue in #8189

  • fix(ci): run profile acceptance on Docker runners by @overtrue in #8191

  • fix: map IAM not-found errors to 404 in InfoCannedPolicy and RemoveUser by @qwerprog in #8134

  • fix(admin): report a missing policy or user as 404 NoSuchResource, not 500 InternalError by @Yi-111-a in #8127

  • fix(replication): stop sending versionId query once a target rejects it by @ajax-bakun-n in #8109

  • fix(ecstore): recover remote disks after transient stalls by @overtrue in #8149

  • ci: fail the pool lane when expected step markers are missing by @majinghe in #8190

  • fix(s3): preserve prefix listing pagination and marker metadata by @cxymds in #8181

  • fix(s3): serve bucket websites on dedicated domains by @cxymds in #8183

  • fix(s3): report x-amz-mp-parts-count on GetObject with partNumber by @jubrad in #8115

  • fix(table-catalog): preserve data sequences during file rewrites by @GatewayJ in #8104

  • fix(ci): restore mainline and scheduled test reliability by @overtrue in #8187

  • fix(connect): accept the health-era heartbeat and measured Top windows by @overtrue in #8195

  • fix(s3): make retried CompleteMultipartUpload idempotent by @loverustfs in #8153

  • fix(iam): require an explicit permission for force-delete by @loverustfs in #8154

  • fix: accept catalog files in health service artifact by @overtrue in #8198

  • fix(ci): restore checks and multipart migration retries by @overtrue in #8196

  • fix(notify): persist Docker queue stores and expose open errors by @houseme in #8201

  • fix(test): add missing unavailable_drives field to readiness test initializers by @overtrue in #8200

  • test: stabilize heal timing and improve heartbeat replay coverage by @overtrue in #8150

  • fix(ci): preserve diagnostics for rio storage test failures by @overtrue in #8204

  • fix(heal): retry cancelled internode RPC operations by @overtrue in #8205

  • build(deps): bump the dependencies group with 14 updates by @dependabot[bot] in #8176

  • fix(test): serialize replacement_bucket_metadata heal test under parallel load by @overtrue in #8212

  • fix(ecstore): preserve RPC status when cloning storage errors by @overtrue in #8207

  • fix(tier): reread mutation intents after lock contention by @overtrue in #8209

  • fix(ci): isolate scanner deadline and expose test failure details by @overtrue in #8210

  • fix(ecstore): retain read quota and control reserve test hedging by @overtrue in #8211

  • Capture offline memory profile from the running service by @overtrue in #8214

  • feat(connect): capture offline native threads in service process by @overtrue in #8215

  • fix(ci): preserve cluster startup failure evidence by @overtrue in #8213

  • fix(rpc): keep legacy format reads in their original namespace by @overtrue in #8216

  • fix(connect): secure new offline state roots by @overtrue in #8218

  • feat(connect): capture signed offline service health by @overtrue in #8219

  • fix(test): use expect_err for offline state root rejection by @overtrue in #8220

  • Fix fresh capacity probes for formatted local disks by @overtrue in #8222

  • fix(test): keep bucket disk faults across reconnects by @overtrue in #8224

  • fix(heal): park healthy legacy MRF intents by @houseme in #8225

  • fix(rpc): preserve walk_dir missing-path errors by @houseme in #8226

  • fix(ci): run security chain evidence from the lane's own checkout by @majinghe in #8229

  • feat(connect): capture offline lock metrics in server by @overtrue in #8230

  • fix(test): control clocks in Connect network fixtures by @overtrue in #8228

  • fix(scanner): restart a finished mixed sweep under its requested plan by @overtrue in #8231

  • feat(connect): capture API activity in offline server runtime by @overtrue in #8234

  • feat(connect): capture RPC activity in offline server runtime by @overtrue in #8237

  • feat(connect): capture offline network performance in server by @overtrue in #8240

  • feat(connect): select offline key for client performance by @overtrue in #8242

  • fix(ci): reduce duplicate work and preserve reliable test failures by @overtrue in #8233

  • fix(test): synchronize top-disk fixture writes with sampling by @overtrue in #8243

  • feat: Capture offline CPU profiles in serving process by @overtrue in #8245

  • fix: filter CPU profile samples to reviewed executable symbols by @overtrue in #8248

  • fix: separate CPU profile stack lifetime from accumulator by @overtrue in #8250

  • fix(connect): add non-Unix health runtime fallback by @overtrue in #8247

  • fix(scanner): resume checkpoints across cycle and leader changes by @jkossis in #8252

  • test(heal): cover degraded MRF replay after deletion by @houseme in #8249

  • fix(storage): default new bucket durability to strict by @houseme in #8253

  • fix(release): package stable preview tags without updating channels by @overtrue in #8256

  • fix(ci): stabilize registration and rolling upgrade readiness by @overtrue in #8244

  • fix(tier): keep recovery worker after startup reload failure by @overtrue in #8260

  • fix(heal): finalize durable MRF legacy responsibility lifecycle by @houseme in #8254

  • fix(scanner): serialize pause backlog replica publication by @overtrue in #8264

  • fix(heal): retry contended local metadata CAS by @overtrue in #8267

  • fix(ci): reserve capacity for profile cancellation probe by @overtrue in #8259

  • test(ecstore): isolate dispatch shutdown recovery fixtures by @overtrue in #8265

  • ci(helm): sync README to root of helm repository on release by @KarlEmm in #8263

  • fix(ecstore): purge empty recursive bucket orphans by @houseme in #8261

  • fix(storage): prevent metadata deadlocks and abandoned writes by @overtrue in #8268

  • fix(rio): preserve bounded retries after peer EOF by @overtrue in #8272

  • fix: prevent metadata lock reentry and stabilize CI fixtures by @overtrue in #8257

  • fix(scanner): expose pause backlog replica diagnostics by @houseme in #8258

  • fix(usage): reconcile stale counters after lifecycle expiration by @pederbe in #8108

  • fix(usage): recover historical counters with generation fencing by @houseme in #8273

  • test(scanner): verify checkpoint takeover and repair dispatch by @houseme in #8275

  • fix(obs): distinguish allocator counters from live memory by @houseme in #8274

  • [release/1.0.1] Gate multipart copy through write admission by @houseme in #8284

  • Gate multipart copy through write admission by @houseme in #8283

  • fix: add UploadPart OOM validation guardrails by @houseme in #8287

  • fix(s3): queue bucket operations and restore strict Clippy checks by @houseme in #8290

  • fix(scanner): diagnose and verify pause backlog recovery by @houseme in #8293

  • fix(storage): preserve rollback history and terminate ListParts by @overtrue in #8311

New Contributors

  • @aredridel made their first contribution in #7943

  • @kokorousaki made their first contribution in #7972

  • @Marukome0743 made their first contribution in #8034

  • @bolero2 made their first contribution in #8064

  • @TylerHillery made their first contribution in #8073

  • @gmelikov made their first contribution in #8071

  • @qwerprog made their first contribution in #8134

  • @Yi-111-a made their first contribution in #8127

  • @jubrad made their first contribution in #8115

  • @KarlEmm made their first contribution in #8263

  • @pederbe made their first contribution in #8108

Full Changelog: 1.0.0...1.0.1

Performance and Compatibility

RustFS is built in Rust and is designed around high performance and efficient resource usage. Its distributed architecture allows storage capacity to scale across multiple nodes and drives.

S3 compatibility is one of its biggest advantages. The project maintains a compatibility matrix for supported S3 functionality, allowing users to evaluate whether their existing applications can work with RustFS. This is particularly useful for applications originally designed around Amazon S3 or other S3-compatible storage systems.

RustFS also positions itself as an alternative for MinIO deployments. However, compatibility should not be interpreted as complete drop-in compatibility. The project currently marks MinIO on-disk compatibility as preview functionality, and its documentation specifically notes that MinIO-encrypted objects cannot be read by RustFS. Existing MinIO installations should therefore be migrated through supported S3-based workflows rather than assuming the underlying storage can simply be reused.

The project supports both single-node and distributed deployments. Its documentation also places specific restrictions on topology expansion, so administrators should plan the initial storage layout carefully before building a cluster.

System Requirements

For Docker deployments, the official container runs as the rustfs user with UID/GID 10001:10001. Host-mounted directories therefore need appropriate ownership or permissions.

Pros and Cons

Pros

Cons

How to Install

RustFS provides several installation methods, including Docker, Docker Compose, native installation, Nix, and other deployment options.

For a simple Docker deployment, create persistent data and log directories, ensure they are writable by the RustFS runtime user, and start the official container with ports for the S3 API and web console.

After starting the service, the web console can be accessed through port 9001 while the S3-compatible service uses port 9000.

For production deployments, the official Docker Compose configuration provides additional observability components, while Kubernetes users can deploy RustFS using the available Helm charts.

When migrating from another S3-compatible platform, test the application's S3 API compatibility and use S3-based migration rather than relying on direct access to another product's underlying storage format.

Final Verdict

RustFS is one of the more interesting open-source alternatives for users looking for S3-compatible object storage outside the traditional MinIO ecosystem. Its Rust implementation, Apache 2.0 license, distributed architecture, encryption, replication, IAM, lifecycle management, and broad protocol support give it a strong feature set.

Its biggest advantage is that it is not merely a lightweight S3 gateway. RustFS aims to provide a complete object-storage platform capable of handling serious distributed workloads.

The main concern is maturity. Because the project is still developing rapidly, compatibility and operational behavior should be validated against the applications and storage topology you intend to use. MinIO users should also be particularly careful not to assume that existing on-disk data can simply be pointed at RustFS.

For new S3-compatible deployments, especially where an Apache-licensed and Rust-based storage platform is desirable, RustFS is a compelling option.

Comments on RustFS 1.0.1