RustFS
S3-compatible object storage server written in Rust.
- Replaces
-
Paid object storage services, such as Amazon S3.
All open-source alternatives to Amazon S3
- Difficulty
-
Difficulty: Medium
2 services, 5 volume mounts, no env values to set, no elevated host access. Heuristic score 3 of 11: medium. A source checkout is needed, so the rating is at least medium.
- Stack
Rust (language)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
Apache-2.0(OSI-approved open source) - Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/rustfs/rustfs/blob/1e36e18/README.md, read on .
- Repository
GitHub stats
- Stars
- 35,251
- Forks
- 1,609
- Open issues and pull requests
- 45
- Last push
- 2026-10-22
- Latest release
- 1.0.3
- Released
- 2026-10-17
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as Apache-2.0.
Compose file
# Copyright 2024 RustFS Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
services:
# RustFS main service
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs-server
depends_on:
volume-permission-helper:
condition: service_completed_successfully
security_opt:
- "no-new-privileges:true"
ports:
- "9000:9000" # S3 API port
- "9001:9001" # Console port
environment:
- RUSTFS_VOLUMES=/data/rustfs{0...3}
- RUSTFS_ADDRESS=0.0.0.0:9000
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
- RUSTFS_CONSOLE_ENABLE=true
- RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
- RUSTFS_ACCESS_KEY=rustfsadmin # CHANGEME
- RUSTFS_SECRET_KEY=rustfsadmin # CHANGEME
- RUSTFS_OBS_LOGGER_LEVEL=info
- RUSTFS_OBS_LOG_DIRECTORY=/app/logs
# Optional TLS:
# - mount your cert directory to /opt/tls
# - set RUSTFS_TLS_PATH=/opt/tls
# - when TLS is enabled, health checks automatically switch to HTTPS
# Keep strict disk topology checks enabled by default.
# For local testing only, set `RUSTFS_UNSAFE_BYPASS_DISK_CHECK=true` explicitly.
- RUSTFS_UNSAFE_BYPASS_DISK_CHECK=${RUSTFS_UNSAFE_BYPASS_DISK_CHECK:-false}
volumes:
- rustfs_data_0:/data/rustfs0
- rustfs_data_1:/data/rustfs1
- rustfs_data_2:/data/rustfs2
- rustfs_data_3:/data/rustfs3
- logs:/app/logs
networks:
- rustfs-network
restart: unless-stopped
healthcheck:
# Default behavior:
# - HTTP when RUSTFS_TLS_PATH is unset
# - HTTPS when RUSTFS_TLS_PATH is set
# - loopback TLS uses `-k` unless strict host+CA values are provided
#
# Strict TLS example:
# - set RUSTFS_HEALTHCHECK_HOST to a SAN-covered hostname
# - optionally set RUSTFS_HEALTHCHECK_CA (defaults to /opt/tls/ca.crt when present)
test:
[
"CMD",
"sh", "-ec",
"host=\"$${RUSTFS_HEALTHCHECK_HOST:-127.0.0.1}\"; scheme=\"http\"; set -- -fsS; \
if [ -n \"$${RUSTFS_TLS_PATH:-}\" ]; then \
scheme=\"https\"; \
ca_path=\"$${RUSTFS_HEALTHCHECK_CA:-}\"; \
if [ -z \"$${ca_path}\" ] && [ -f /opt/tls/ca.crt ]; then ca_path=/opt/tls/ca.crt; fi; \
case \"$${host}\" in 127.0.0.1|localhost) strict_host=false ;; *) strict_host=true ;; esac; \
if [ \"$${strict_host}\" = true ] && [ -n \"$${ca_path}\" ]; then \
set -- \"$${@}\" --cacert \"$${ca_path}\" --resolve \"$${host}:9000:127.0.0.1\" --resolve \"$${host}:9001:127.0.0.1\"; \
else \
set -- \"$${@}\" -k; \
fi; \
fi; \
curl \"$${@}\" \"$${scheme}://$${host}:9000/health\" && \
curl \"$${@}\" \"$${scheme}://$${host}:9001/rustfs/console/health\""
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# RustFS volume permissions fixer service
volume-permission-helper:
image: alpine
volumes:
- rustfs_data_0:/data/rustfs0
- rustfs_data_1:/data/rustfs1
- rustfs_data_2:/data/rustfs2
- rustfs_data_3:/data/rustfs3
- logs:/app/logs
command: >
sh -c "
chown -R 10001:10001 /data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3 /app/logs &&
echo 'Volume Permissions fixed' &&
exit 0
"
# Permission baseline:
# - default RustFS runtime user is 10001:10001
# - alternatively, run rustfs service with host-matched `user: \"<uid>:<gid>\"`
restart: "no"
networks:
rustfs-network:
volumes:
rustfs_data_0:
rustfs_data_1:
rustfs_data_2:
rustfs_data_3:
logs:
From the app's own repository: github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml.
Compose file from rustfs/rustfs, used inside a checkout of that repository (documented setup B).
Install
- Docker with the Compose plugin and git (github.com/rustfs/rustfs/blob/1e36e18/README.md)
A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.
- Get the source at commit 1e36e18 (github.com/rustfs/rustfs/blob/1e36e18/README.md)
git init rustfs cd rustfs git remote add origin https://github.com/rustfs/rustfs.git git fetch --depth 1 origin 1e36e18265d8d9f2183d75ac15d6049d87783ff7 git checkout FETCH_HEAD - The compose file in the checkout: docker-compose-simple.yml (shown here for reading) (github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml)
Use the compose file shown above.
- What the compose file check ran with (github.com/rustfs/rustfs/blob/1e36e18/README.md)
The compose file check ran in a checkout of rustfs/rustfs at 1e36e18265d8d9f2183d75ac15d6049d87783ff7 (a sparse checkout: only the top-level files). The README tells the reader to use the docker-compose-simple.yml file in the root directory of the repository.
- Start it (github.com/rustfs/rustfs/blob/1e36e18/README.md)
docker compose -f docker-compose-simple.yml up -d - Open the app (github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml)
Open http://localhost:9001. The compose file publishes host port 9001 for the rustfs service. The compose file marks port 9001 as the console port and port 9000 as the S3 API port.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- Some images use the latest tag or no tag. Images without a pinned version: rustfs: rustfs/rustfs:latest, volume-permission-helper: alpine (no tag). A later pull can get a different version. (github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml, checked 2026-10-22)
- The compose file has placeholder values. Lines with a CHANGEME comment set: RUSTFS_ACCESS_KEY, RUSTFS_SECRET_KEY. (github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 9000 (rustfs), 9001 (rustfs). A port without a host address listens on all host network interfaces. (github.com/rustfs/rustfs/blob/1e36e18/docker-compose-simple.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 45
- Last push: 2026-10-22 (0 days before this page was built)
- Latest release: 1.0.3 on 2026-10-17 (5 days before this page was built)