Оригинал: RustFS — Установка и настройка S3-совместимого хранилища — Иван Чёрный, 13 июня 2026. Лицензия CC BY-NC-SA 4.0 . Публикуется с сохранением авторства и лицензии.

Вводные данные

В этой статье рассмотрим установку и базовую настройку RustFS — S3-совместимого объектного хранилища, которое поднимем на Linux-сервере с помощью Docker Compose.

Задача: получить свой S3-endpoint, веб-консоль, валидное HTTPS-подключение (через Caddy + Let’s Encrypt) и проверить, что всё это работает с утилитами rclone и restic.

📝 RustFS позиционируется разработчиками как альтернатива печально известному MinIO.

Требования к инсталляции

Установка S3-хранилища RustFS

Подключаемся к серверу по SSH и переходим на root:

BASH
ssh ivan@rustfs.r4ven.me

sudo -i
Нажмите, чтобы развернуть и увидеть больше

📝 Файлы проекта храним по пути /etc/compose, данные приложения — в Docker volume.

Создаём директорию проекта и ограничиваем доступ:

BASH
mkdir -vp /etc/compose/rustfs && cd /etc/compose/rustfs

chmod 700 /etc/compose
Нажмите, чтобы развернуть и увидеть больше

Создаём compose-файл:

BASH
vim ./compose.yaml
Нажмите, чтобы развернуть и увидеть больше

Наполняем:

YAML
---
# https://github.com/rustfs/rustfs
# https://caddyserver.com/docs/running#docker-compose

volumes:
  rustfs:
    name: rustfs
  caddy:
    name: caddy

services:
  rustfs:
    image: docker.io/rustfs/rustfs:1.0.0-beta.8
    container_name: rustfs
    restart: unless-stopped
    stop_grace_period: 30s
    cpus: 1
    mem_limit: 1G
    hostname: rustfs
    user: "root:root"
    env_file: ./.env
    healthcheck:
      test:
        ["CMD", "sh", "-c", "curl -f http://127.0.0.1:9000/health && curl -f http://127.0.0.1:9001/rustfs/console/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    expose:
      - "9000" # S3 API port
      - "9001" # Console port
    volumes:
      - rustfs:/data/
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

  caddy:
    image: docker.io/caddy:2.9.1-alpine
    depends_on:
      rustfs:
        condition: service_healthy
    container_name: caddy
    restart: unless-stopped
    stop_grace_period: 30s
    cpus: 1
    mem_limit: 512M
    hostname: caddy
    env_file: ./.env
    environment:
      TZ: Europe/Moscow
    configs:
      - source: caddy_config
        target: /etc/caddy/Caddyfile
    command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
    healthcheck:
      test: ["CMD", "sh", "-c", "wget --no-verbose --tries=1 --spider https://${RUSTFS_DOMAIN}:443/health && wget --no-verbose --tries=1 --spider https://${RUSTFS_CONSOLE_DOMAIN}:443/rustfs/console/auth/login"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    ports:
      - "80:80/tcp"
      - "443:443/tcp"
      - "443:443/udp"
    volumes:
      - caddy:/data/
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

configs:
  caddy_config:
    content: |
      {
          email ${ACME_EMAIL}
          admin off
      }

      ${RUSTFS_DOMAIN} {
          reverse_proxy rustfs:9000

          header {
              Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
              X-Content-Type-Options "nosniff"
              X-Frame-Options "DENY"
              Referrer-Policy "no-referrer"
          }
      }

      ${RUSTFS_CONSOLE_DOMAIN} {
          reverse_proxy rustfs:9001

          header {
              Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
              X-Content-Type-Options "nosniff"
              X-Frame-Options "DENY"
              Referrer-Policy "no-referrer"
          }
      }
Нажмите, чтобы развернуть и увидеть больше

Файл описывает два сервиса: rustfs и caddy.

📝 Caddy — современный веб-сервер и обратный прокси с автоматическим получением и продлением TLS-сертификатов, простой декларативной конфигурацией и встроенной поддержкой HTTP/2, HTTP/3, балансировки и проксирования. Часто используется как более простой в настройке аналог Nginx.

Создаём env-файл:

BASH
vim ./.env
Нажмите, чтобы развернуть и увидеть больше

Наполняем:

INI
# https://docs.rustfs.com/installation/docker/#complete-parameter-configuration-example

TZ=Europe/Moscow

ACME_EMAIL=kar-kar@r4ven.me
RUSTFS_DOMAIN=rustfs.r4ven.me
RUSTFS_CONSOLE_DOMAIN=rustfs-console.r4ven.me

# RUSTFS_UID="root"
# RUSTFS_GID="root"
# RUSTFS_VOLUMES=/data/rustfs{0..3} # Define 4 storage volumes
RUSTFS_ADDRESS=0.0.0.0:9000
RUSTFS_CONSOLE_ENABLE=true
RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
RUSTFS_CORS_ALLOWED_ORIGINS=https://rustfs-console.r4ven.me
RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=https://rustfs-console.r4ven.me
RUSTFS_ACCESS_KEY=
RUSTFS_SECRET_KEY=
RUSTFS_OBS_LOGGER_LEVEL=info
Нажмите, чтобы развернуть и увидеть больше

☝️ Значения RUSTFS_ACCESS_KEY и RUSTFS_SECRET_KEY будут использоваться как логин и пароль для авторизации в веб-консоли RustFS.

Caddyfile отдельным файлом не создаём — Docker Compose передаёт его в контейнер через параметр configs, а переменные окружения подставляет при обработке compose-файла. Сертификаты Let’s Encrypt Caddy хранит в volume caddy.

☝️ Для выпуска сертификатов DNS-записи RUSTFS_DOMAIN и RUSTFS_CONSOLE_DOMAIN должны указывать на адрес вашего сервера, а порты 80/tcp и 443/tcp — быть доступны снаружи.

Задаём «логин» и генерируем «пароль»:

BASH
sed -iE "s/^RUSTFS_ACCESS_KEY=.*/RUSTFS_ACCESS_KEY=ivan/" ./.env

sed -iE "s/^RUSTFS_SECRET_KEY=.*/RUSTFS_SECRET_KEY=$(openssl rand -hex 32)/" ./.env
Нажмите, чтобы развернуть и увидеть больше

Запускаем стек:

BASH
docker compose up -d && docker compose logs -f
Нажмите, чтобы развернуть и увидеть больше

Проверяем:

BASH
docker compose ps

docker volume ls | grep -E "rustfs|caddy"

ls -lR /var/lib/docker/volumes/caddy/_data/caddy/
Нажмите, чтобы развернуть и увидеть больше

Настраиваем автозапуск через systemd:

BASH
cat > ./rustfs.service << EOF
[Unit]
Description=RustFS S3 service
Requires=docker.service
After=docker.service

[Service]
Restart=always
RestartSec=5
User=root
Group=root
WorkingDirectory=/etc/compose/rustfs
ExecStart=/usr/bin/docker compose up --remove-orphans
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target
EOF
Нажмите, чтобы развернуть и увидеть больше
BASH
chmod 600 ./rustfs.service

ln -s $(realpath ./rustfs.service) /etc/systemd/system

systemctl daemon-reload

systemctl enable --now rustfs

systemctl status rustfs
Нажмите, чтобы развернуть и увидеть больше

Теперь сервисом rustfs можно управлять через systemctl:

BASH
systemctl stop rustfs
systemctl start rustfs
systemctl restart rustfs
systemctl status rustfs
Нажмите, чтобы развернуть и увидеть больше

Настройка RustFS

Открываем в браузере адрес консоли:

PLAINTEXT
https://rustfs-console.r4ven.me
Нажмите, чтобы развернуть и увидеть больше

Увидим окно входа. Для входа используем данные, сгенерированные ранее:

BASH
grep -E 'RUSTFS_ACCESS_KEY|RUSTFS_SECRET_KEY' /etc/compose/rustfs/.env
Нажмите, чтобы развернуть и увидеть больше

Создание бакетов

📝 Bucket в S3 — это контейнер для объектов (файлов), аналог папки верхнего уровня, в которой настраиваются права доступа, версии и политики хранения.

На вкладке «Браузер» → «Создать бакет». Задаём имя (например, app1), устанавливаем квоту и нажимаем «Создать».

Создание реквизитов доступа

Хорошим тоном считается использование отдельной учётной записи для операций с бакетами через API.

«Пользователи» → «Добавить пользователя». Указываем имя (backup), задаём пароль, в разделе «Политика» выбираем readwrite, «Отправить».

Затем «Редактировать» напротив нового пользователя → вкладка «Ключи доступа» → «Добавить ключи доступа». Указываем имя, описание, при желании — срок действия. «Отправить».

Появится окно с ключом доступа и секретным ключом — обязательно сохраните их, повторно посмотреть будет нельзя. В примере:

Проверка работы S3 с помощью Rclone

📝 rclone — консольная утилита для работы с облачными и S3-совместимыми хранилищами: копирование, синхронизация, монтирование, управление файлами между локальной системой и удалёнными хранилищами (S3, MinIO, RustFS, Google Drive, OneDrive и десятками других). Часто используется как аналог rsync для облаков.

Устанавливаем и создаём конфиг (подставьте свои endpoint, access_key_id, secret_access_key):

BASH
apt install -y rclone

mkdir -vp ~/.config/rclone

cat > ~/.config/rclone/rclone.conf << EOF
[rustfs]
type = s3
provider = Minio
endpoint = https://rustfs.r4ven.me
access_key_id = haRQaZRE9OGlUULAE2EQ
secret_access_key = QkgSFIG03saT2l7tnIF7OSUuxIwmKlx6RabFOs9i
EOF
Нажмите, чтобы развернуть и увидеть больше

Проверяем доступ:

BASH
rclone lsd rustfs:
Нажмите, чтобы развернуть и увидеть больше

Создаём «директорию» в бакете и копируем туда tar-архив содержимого /etc:

BASH
tar -czf - /etc | rclone rcat rustfs:app1/rclone/backup_etc_$(date '+%F').tar.gz

rclone ls rustfs:app1/rclone
Нажмите, чтобы развернуть и увидеть больше

📝 Почему tar-архив, а не прямое копирование? Обычное копирование rclone плохо работает с символическими ссылками, поэтому в связке с ним часто используют tar.

Восстановление из S3:

BASH
mkdir -vp /tmp/restore/rclone

# Архив одним файлом
rclone copy rustfs:app1/rclone/backup_etc_2026-06-16.tar.gz /tmp/restore/rclone

# Сразу разархивировать
rclone cat rustfs:app1/rclone/backup_etc_2026-06-16.tar.gz | tar -xzf - -C /tmp/restore/rclone

ls -l /tmp/restore/rclone
Нажмите, чтобы развернуть и увидеть больше

Проверка работы S3 с помощью Restic

📝 restic — программа для резервного копирования, создающая дедуплицированные, зашифрованные и версионированные бэкапы. Хранит копии локально, по SFTP или в S3-совместимых хранилищах, позволяя восстанавливать данные из снапшотов на любой момент времени.

Параметры restic задаются в переменных окружения. Установим и сохраним их в файл env (подставьте свои значения):

BASH
apt install -y restic

mkdir -vp ~/.config/restic

cat > ~/.config/restic/env << EOF
export AWS_ACCESS_KEY_ID="haRQaZRE9OGlUULAE2EQ"  
export AWS_SECRET_ACCESS_KEY="QkgSFIG03saT2l7tnIF7OSUuxIwmKlx6RabFOs9i"  
export AWS_DEFAULT_REGION="us-east-1"  
export RESTIC_REPOSITORY="s3:https://rustfs.r4ven.me/app1/restic"
export RESTIC_PASSWORD="12345678"
EOF

source ~/.config/restic/env
Нажмите, чтобы развернуть и увидеть больше

📝 В RESTIC_PASSWORD указывается пароль, которым шифруются файлы репозитория.

💡 Можно добавить экспорт в *rc-файл оболочки:

BASH
echo 'source ~/.config/restic/env' >> ~/.bashrc
Нажмите, чтобы развернуть и увидеть больше

Инициализируем репозиторий и делаем бэкап /etc (уже без tar):

BASH
restic init

restic backup /etc

restic stats

restic snapshots
Нажмите, чтобы развернуть и увидеть больше

Содержимое репозитория:

BASH
restic ls latest | less
Нажмите, чтобы развернуть и увидеть больше

Восстановление из последней копии:

BASH
restic restore latest --target /tmp/restore/restic

ls -l /tmp/restore/restic
Нажмите, чтобы развернуть и увидеть больше

Послесловие

Мы настроили собственное S3-совместимое хранилище RustFS за обратным прокси Caddy. Для небольшого личного сервера, бэкапов, тестовых бакетов и внутренних сервисов — отличный вариант 👍.

Проект RustFS ещё молодой, поэтому стоит следить за обновлениями и использовать в проде с чуть большей осторожностью, чем тот же MinIO.

Помните: админы делятся на два типа — те, кто делает бэкапы, и те, кто обязательно будет их делать.

Используемые материалы

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/rustfs-s3-storage/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша