# RustFS

S3-compatible object storage server written in Rust.

- Replaces: [Amazon S3](https://openlogs.fyi/alternatives/amazon-s3)
- Summary: Paid object storage services, such as Amazon S3.
- Stack: Rust (language)
- Deployment: docker_compose
- License: Apache-2.0 (osi) [source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md), read 2026-10-22)
- 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.
- Requirements: not stated
- Repository: [rustfs/rustfs](https://github.com/rustfs/rustfs)

## Install

1. Docker with the Compose plugin and git ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md))

   ```text
   A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.
   ```

2. Get the source at commit 1e36e18 ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md))

   ```bash
   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
   ```

3. The compose file in the checkout: docker-compose-simple.yml (shown here for reading) ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/docker-compose-simple.yml))

   ```yaml
   # 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:
   ```

4. What the compose file check ran with ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md))

   ```text
   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.
   ```

5. Start it ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md))

   ```bash
   docker compose -f docker-compose-simple.yml up -d
   ```

6. Open the app ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/docker-compose-simple.yml))

   ```text
   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. ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/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. ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/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. ([source](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/docker-compose-simple.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 45
- Stars: 35251, forks: 1609
- Last push: 2026-10-22 (0 days ago)
- Latest release: 1.0.3 on 2026-10-17 (5 days ago)

## Sources

- [Repository: https://github.com/rustfs/rustfs](https://github.com/rustfs/rustfs)
- [License: https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/LICENSE](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/LICENSE)
- [Business model: https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/README.md)
- [Compose file: https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/docker-compose-simple.yml](https://github.com/rustfs/rustfs/blob/1e36e18265d8d9f2183d75ac15d6049d87783ff7/docker-compose-simple.yml)

---
Canonical: https://openlogs.fyi/tools/rustfs  
Last updated: 2026-10-22
