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.
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
| Requirement | Description |
|---|---|
| Docker | Docker installed on the server |
| RustFS service | Started via the launch script (step 1 below) |
| App switch | bytedesk.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 withRUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEYfrom.env) - S3 API:
http://127.0.0.1:19000
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)
Private-bucket mode (presigned links)
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
- Stop MinIO:
docker stop minio-bytedesk - Start RustFS:
./start.sh all rustfs - 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)
- Point the app endpoint to
http://bytedesk-rustfs:9000and 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.