Skip to main content

RustFS Object Storage

RustFS is a high-performance distributed object storage written in Rust, Apache 2.0 licensed, and 100% S3 protocol compatible. With the MinIO repository archived and moving to closed source/AGPL, bytedesk added RustFS as an object storage backend in October 2026 — same port layout as MinIO (API 9000 / Console 9001), same path-style URLs, and the app side switches over with zero code changes.

Relationship to MinIO

RustFS and MinIO are fully equivalent options in bytedesk: identical upload pipeline, configuration style, and APIs — only the endpoint and credentials differ. Existing MinIO deployments keep working (see Object Storage (MinIO)); RustFS is recommended for new deployments.

Features​

  • Full S3 compatibility: bytedesk talks to RustFS through a standard S3 client. Bucket creation, public-read policy, upload, download, presigned URLs, and delete have all been verified end-to-end
  • Local storage by default: when the object storage switch is off, uploads stay on the app's local disk — nothing changes
  • Shared storage for multi-instance deployments: multiple app servers share the same file store
  • Full data ownership: RustFS runs on your own servers under the commercial-friendly Apache 2.0 license

Prerequisites​

RequirementDescription
DockerDocker installed on the server
RustFS serviceStarted via the launch script (step 1 below)
App switchbytedesk.storage.provider=s3 (or legacy bytedesk.minio.enabled=true)

How to enable (administrator)​

Step 1: Start the RustFS service​

cd deploy/docker

# Start with middleware
./start.sh middleware rustfs

# Or with the full app stack
./start.sh all rustfs

After startup:

  • RustFS Console: http://127.0.0.1:19001 (sign in with RUSTFS_ACCESS_KEY / RUSTFS_SECRET_KEY from .env)
  • S3 API: http://127.0.0.1:19000
Port conflict

RustFS and MinIO use the same host ports (19000/19001) and cannot run simultaneously; run docker stop minio-bytedesk before switching.

Step 2: Update .env​

# Append to .env (new namespace recommended)
BYTEDESK_STORAGE_PROVIDER=s3
BYTEDESK_STORAGE_ENDPOINT=http://bytedesk-rustfs:9000
BYTEDESK_STORAGE_ACCESS_KEY=rustfsadmin
BYTEDESK_STORAGE_SECRET_KEY=rustfsadmin
BYTEDESK_STORAGE_BUCKET_NAME=bytedesk

Or use the legacy namespace (backward compatible, equivalent):

BYTEDESK_MINIO_ENABLED=true
BYTEDESK_MINIO_ENDPOINT=http://bytedesk-rustfs:9000
# Use the RustFS access/secret credentials

Step 3: Restart bytedesk​

On restart, bytedesk automatically creates the bucket (default bytedesk) and sets it to public read; uploaded files are then stored in RustFS.

Source-run configuration​

When running from source, configure in starter/src/main/resources/properties/<profile>/minio.properties:

bytedesk.storage.provider=s3
bytedesk.storage.endpoint=http://127.0.0.1:19000
bytedesk.storage.access-key=rustfsadmin
bytedesk.storage.secret-key=rustfsadmin
bytedesk.storage.bucket-name=bytedesk

Credentials​

  • Defaults are rustfsadmin / rustfsadmin (access and secret identical) — change them in production
  • Constraints: access key 5–20 chars, secret key 8–40 chars, alphanumeric recommended (special characters may break authentication)

By default the bucket is set to public read (bytedesk.storage.public-read=true, matching MinIO behavior). For a private bucket:

bytedesk.storage.public-read=false
# Presigned URL validity in days; SigV4 protocol caps it at 7
bytedesk.storage.presigned-expiry-days=7

File URLs then become presigned links (valid up to 7 days) with no dependency on the bucket policy. Note: once a presigned URL expires, direct links inside historical messages stop working until re-fetched.

Migrating from MinIO​

  1. Stop MinIO: docker stop minio-bytedesk
  2. Start RustFS: ./start.sh all rustfs
  3. Migrate existing data (either tool works):
    • rc mirror (rustfs-cli client, Tier 1 support for RustFS)
    • mc mirror (MinIO client, Tier 2 support for RustFS)
  4. Point the app endpoint to http://bytedesk-rustfs:9000 and restart bytedesk

FAQ​

Q: Can I still access historical MinIO files after switching to RustFS? A: Not directly — those files remain in the MinIO volume. Migrate the data first (rc mirror / mc mirror), or mount and copy the MinIO volume.

Q: Can RustFS and MinIO run at the same time? A: Not with the default port layout (port conflict). To run both, change the host port mapping of one of them.

Q: What happens when a presigned URL expires? A: Presigned URLs last at most 7 days (SigV4 protocol limit). Re-fetch the download link via the upload record API, or switch the bucket to public-read mode.

这页文档对您有帮助吗?