Оригинал: 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.
Требования к инсталляции
- Linux-сервер на базе Debian 13, доступный по белому IP из интернета;
- установленный Docker Engine;
- домены
rustfs.r4ven.meиrustfs-console.r4ven.me, указывающие на белый IP сервера; - привилегированный доступ к системе.
Установка S3-хранилища RustFS
Подключаемся к серверу по SSH и переходим на root:
ssh ivan@rustfs.r4ven.me
sudo -i📝 Файлы проекта храним по пути
/etc/compose, данные приложения — в Docker volume.
Создаём директорию проекта и ограничиваем доступ:
mkdir -vp /etc/compose/rustfs && cd /etc/compose/rustfs
chmod 700 /etc/composeСоздаём compose-файл:
vim ./compose.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-файл:
vim ./.envНаполняем:
# 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 — быть доступны снаружи.
Задаём «логин» и генерируем «пароль»:
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Запускаем стек:
docker compose up -d && docker compose logs -fПроверяем:
docker compose ps
docker volume ls | grep -E "rustfs|caddy"
ls -lR /var/lib/docker/volumes/caddy/_data/caddy/Настраиваем автозапуск через systemd:
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
EOFchmod 600 ./rustfs.service
ln -s $(realpath ./rustfs.service) /etc/systemd/system
systemctl daemon-reload
systemctl enable --now rustfs
systemctl status rustfsТеперь сервисом rustfs можно управлять через systemctl:
systemctl stop rustfs
systemctl start rustfs
systemctl restart rustfs
systemctl status rustfsНастройка RustFS
Открываем в браузере адрес консоли:
https://rustfs-console.r4ven.meУвидим окно входа. Для входа используем данные, сгенерированные ранее:
grep -E 'RUSTFS_ACCESS_KEY|RUSTFS_SECRET_KEY' /etc/compose/rustfs/.envСоздание бакетов
📝 Bucket в S3 — это контейнер для объектов (файлов), аналог папки верхнего уровня, в которой настраиваются права доступа, версии и политики хранения.
На вкладке «Браузер» → «Создать бакет». Задаём имя (например, app1), устанавливаем квоту и нажимаем «Создать».
Создание реквизитов доступа
Хорошим тоном считается использование отдельной учётной записи для операций с бакетами через API.
«Пользователи» → «Добавить пользователя». Указываем имя (backup), задаём пароль, в разделе «Политика» выбираем readwrite, «Отправить».
Затем «Редактировать» напротив нового пользователя → вкладка «Ключи доступа» → «Добавить ключи доступа». Указываем имя, описание, при желании — срок действия. «Отправить».
Появится окно с ключом доступа и секретным ключом — обязательно сохраните их, повторно посмотреть будет нельзя. В примере:
- Ключ доступа:
haRQaZRE9OGlUULAE2EQ - Секретный ключ:
QkgSFIG03saT2l7tnIF7OSUuxIwmKlx6RabFOs9i
Проверка работы S3 с помощью Rclone
📝 rclone — консольная утилита для работы с облачными и S3-совместимыми хранилищами: копирование, синхронизация, монтирование, управление файлами между локальной системой и удалёнными хранилищами (S3, MinIO, RustFS, Google Drive, OneDrive и десятками других). Часто используется как аналог
rsyncдля облаков.
Устанавливаем и создаём конфиг (подставьте свои endpoint, access_key_id, secret_access_key):
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Проверяем доступ:
rclone lsd rustfs:Создаём «директорию» в бакете и копируем туда tar-архив содержимого /etc:
tar -czf - /etc | rclone rcat rustfs:app1/rclone/backup_etc_$(date '+%F').tar.gz
rclone ls rustfs:app1/rclone📝 Почему tar-архив, а не прямое копирование? Обычное копирование
rcloneплохо работает с символическими ссылками, поэтому в связке с ним часто используютtar.
Восстановление из S3:
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 (подставьте свои значения):
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-файл оболочки:BASHecho 'source ~/.config/restic/env' >> ~/.bashrc
Инициализируем репозиторий и делаем бэкап /etc (уже без tar):
restic init
restic backup /etc
restic stats
restic snapshotsСодержимое репозитория:
restic ls latest | lessВосстановление из последней копии:
restic restore latest --target /tmp/restore/restic
ls -l /tmp/restore/resticПослесловие
Мы настроили собственное S3-совместимое хранилище RustFS за обратным прокси Caddy. Для небольшого личного сервера, бэкапов, тестовых бакетов и внутренних сервисов — отличный вариант 👍.
Проект RustFS ещё молодой, поэтому стоит следить за обновлениями и использовать в проде с чуть большей осторожностью, чем тот же MinIO.
Помните: админы делятся на два типа — те, кто делает бэкапы, и те, кто обязательно будет их делать.