OpenLogs

All tools

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)

Read from github.com/rustfs/rustfs/blob/1e36e18/LICENSE

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

rustfs/rustfs

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

Config check passed docker compose config exited 0 on this exact file on 2026-10-22.
docker-compose-simple.yml Version 1
# 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

  1. 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.

  2. 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
  3. 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.

  4. 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.

  5. Start it (github.com/rustfs/rustfs/blob/1e36e18/README.md)
    docker compose -f docker-compose-simple.yml up -d
  6. 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

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)