SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-10-28

Установка MinIO на Ubuntu 24.04: пошаговое руководство

Разверните собственное S3-хранилище на VPS. В статье описана настройка MinIO через systemd, создание пользователя, работа с mc и интеграция с restic для резервных копий.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

Что дает использование MinIO в качестве self-hosted объектного хранилища

MinIO — это self-hosted объектное хранилище, поддерживающее API Amazon S3. Укажите restic или S3 SDK на ваш сервер, измените один параметр endpoint, и этого будет достаточно для повседневных операций чтения, записи, листинга объектов и создания presigned-ссылок. Однако совместимость не означает полную идентичность. Например, MinIO не реализует списки контроля доступа (ACL) Amazon, и разработчики заявили, что не планируют этого делать. Поэтому приложению, зависящему от поведения ACL, потребуется нечто большее, чем просто новый endpoint. В этом руководстве описывается развертывание одноузловой конфигурации на Ubuntu 24.04: бинарный файл, собранный из проверенных исходных кодов, выделенный системный пользователь, systemd-юнит, не содержащий учетных данных root в файле конфигурации, и бакет для резервных копий restic.

S3 (simple storage service) — это HTTP API, а не файловая система. Вы выполняете PUT объекта в бакет по определенному ключу, а затем получаете его обратно через GET. В стандартном бакете невозможна частичная запись или переименование. Исключение составляют directory buckets в S3 Express One Zone от Amazon, которые поддерживают вызовы append и rename, но это лишь один класс хранилища, и данное руководство на него не опирается. Инструменты резервного копирования предпочитают стандартную модель, так как объект либо был доставлен целиком, либо не был доставлен вовсе.

Один узел хранит одну копию ваших данных. Это компромисс, на который вы идете. Вы получаете S3-endpoint под своим контролем по цене VPS, но при этом берете на себя все задачи, которые раньше выполнял облачный провайдер: от замены вышедшего из строя диска до обновления серверного ПО. В разделе ближе к концу четко описано, когда такой компромисс оправдан.

Состояние MinIO Community Edition в октябре 2026 года

Прочитайте этот раздел перед тем, как приступать к работе, так как ситуация недавно изменилась. В мае 2025 года MinIO удалила функции администрирования из веб-консоли в версии Community Edition. В браузере остался только файловый менеджер объектов, поэтому управление бакетами и ключами доступа теперь осуществляется через клиент командной строки mc.

Позднее в 2025 году MinIO прекратила публикацию предварительно скомпилированных бинарных файлов для сообщества. В README проекта указано, что Community Edition распространяется только в исходном коде, а с апреля 2026 года репозиторий minio/minio был переведен в архив с уведомлением THIS REPOSITORY IS NO LONGER MAINTAINED. Старый сервер загрузок также перестал предоставлять файлы для сообщества. По состоянию на 20 октября 2026 года по каждому пути dl.min.io, который это руководство использовало для загрузки бинарного файла сервера, клиента и их контрольных сумм, сервер отвечает 410 Gone, что является намеренным удалением, а не сбоем. Единственный бинарный файл mc, который все еще находится на этом сервере, — это AIStor Client по пути /aistor/mc/release/, относящийся к коммерческой линейке продуктов. Страница загрузки на min.io теперь содержит AIStor Server, AIStor Client, AIStor SDK и несколько дополнений AIStor, а также бесплатную версию AIStor, которая, согласно описанию, предназначена для разработчиков, исследователей и небольших организаций, использующих автономные развертывания; версии для сообщества там нет.

Исходный код по-прежнему доступен, и он новее, чем последний бинарный файл. Финальный релиз для сообщества — RELEASE.2025-10-15T17-29-55Z, опубликованный 16 октября 2025 года как обновление безопасности: он исправляет повышение привилегий через обход политики сессии в сервисных аккаунтах и STS, и примечания к релизу рекомендуют всем пользователям немедленно обновиться. Последний скомпилированный бинарный файл был собран в сентябре 2025 года, поэтому он не получил этого исправления. В данном руководстве выполняется компиляция октябрьского релиза, и, поскольку репозиторий находится в архиве, это последнее исправление, которое получит Community Edition.

Этот факт определяет содержание остальной части руководства. Именно поэтому MinIO здесь слушает адрес 127.0.0.1 и выходит в интернет только через контролируемый вами прокси-сервер.

Установка бинарного файла MinIO и проверка загрузки

MinIO написан на языке Go, и README от разработчика предлагает сборку с помощью одной команды go install, для которой требуется Go 1.24 или новее. Сначала установите Go из официального архива tarball. На 20 октября 2026 года текущий стабильный релиз на go.dev/dl — это go1.27.3, выпущенный 19 октября 2026 года с исправлением безопасности в пакете crypto/x509. Хэш ниже соответствует значению, опубликованному на этой странице для архива linux-amd64. Если вы выбираете более новую версию Go, возьмите её хэш с той же страницы. Флаг -f заставляет curl завершаться с ошибкой при получении HTTP-ошибки вместо сохранения страницы с ошибкой под указанным вами именем; именно так пользователи распаковывают 404-страницу и удивляются, почему она не является архивом.

cd /tmp
GOVER=go1.27.3
curl -fsSL "https://go.dev/dl/$GOVER.linux-amd64.tar.gz" -o go.tar.gz

Сравните два хэша, и сравнивайте только хэши.

published=65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40
downloaded=$(sha256sum go.tar.gz | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

Чётко понимайте, что доказывает эта проверка. Совпадение доказывает, что загрузка завершена и файл не был повреждён или изменён при передаче. Это не доказывает, что разработчик заслуживает доверия. Это другая проблема, и ни одна команда sha256sum её не решает.

sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

Теперь соберите финальный релиз сообщества от имени обычного пользователя. go install проверяет каждый загружаемый модуль, включая исходный код самого MinIO, по публичной базе контрольных сумм Go на sum.golang.org, поэтому подмена или изменение модуля остановит сборку с ошибкой безопасности вместо создания бинарного файла.

go install github.com/minio/minio@RELEASE.2025-10-15T17-29-55Z
sudo install -o root -g root -m 755 ~/go/bin/minio /usr/local/bin/minio
minio --version
go version -m /usr/local/bin/minio | head -n 3

minio --version выводит DEVELOPMENT.GOGET там, где раньше было имя релиза, потому что go install не применяет флаги сборки, которые разработчик использует для маркировки своих бинарных файлов. go version -m считывает информацию о модуле, которую Go встраивает в каждый бинарный файл, а строка mod github.com/minio/minio указывает коммит, который вы собрали. Permission denied в этом выводе означает, что режим неверный, а command not found означает, что /usr/local/bin отсутствует в вашем PATH. Если на VPS не хватает памяти для компиляции, выполните ту же команду go install на другой машине с Linux той же архитектуры и скопируйте полученный бинарный файл.

Создание системного пользователя и каталога данных

MinIO принимает загрузки из сети, поэтому его не следует запускать от имени root. Создайте для него учетную запись без домашнего каталога и без оболочки входа в систему.

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio

-r создает системную учетную запись с UID ниже 1000, что исключает её из диапазона, используемого для обычных пользователей. -M пропускает создание домашнего каталога, так как учетной записи, которая никогда не входит в систему, он не требуется. Проверьте результат с помощью id minio-user, а также stat -c '%U %a' /var/lib/minio, которая должна вывести minio-user 750.

Каталог данных должен быть доступен этому пользователю не только для чтения, но и для записи. При первом запуске MinIO создает каталог .minio.sys внутри тома для хранения собственной конфигурации, поэтому, если владельцем каталога является root, MinIO завершит работу при запуске с сообщением, заканчивающимся на permission denied. Это же правило применимо к любому сервису, который вы запускаете таким образом, и в использовании учетных записей с минимальными привилегиями на VPS это подробно описано.

Размещение учетных данных root в файле окружения

Учетные данные root предоставляют доступ ко всем бакетам, поэтому их нельзя хранить в файле юнита, который доступен для чтения всем пользователям. Сначала создайте файл с нужными правами доступа, а затем запишите в него данные. Это гарантирует, что пароль не окажется в файле, доступном для чтения, даже на короткое время.

sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio

tee усекает существующий файл, а не создает его заново, поэтому права доступа остаются 600, а владельцем остается root. Это сделано намеренно. systemd считывает EnvironmentFile от имени root до того, как понижает привилегии до User=. Это означает, что сервисной учетной записи не нужно иметь права на чтение собственных учетных данных. После запуска сервиса проверьте его работу с помощью sudo -u minio-user cat /etc/default/minio. Эта команда должна вывести Permission denied.

Перед запуском MinIO полезно знать о двух особенностях его поведения. Если в окружении отсутствуют MINIO_ROOT_USER и MINIO_ROOT_PASSWORD, MinIO не отказывается запускаться. Он стартует с учетными данными по умолчанию minioadmin:minioadmin — это первая пара, которую пробует любой сканер, при этом сервис выглядит полностью работоспособным. Пароль короче 8 символов, напротив, отклоняется: MinIO завершает работу при запуске с ошибкой о неверных учетных данных, так как ключ доступа должен содержать не менее 3 символов, а секретный ключ — не менее 8.

MINIO_VOLUMES — это путь к данным, а MINIO_OPTS содержит флаги. Привязка к 127.0.0.1 означает, что пока никто за пределами этого VPS не может получить доступ к S3 API, что является правильной настройкой по умолчанию. Вы откроете доступ позже, осознанно, через прокси с установленным сертификатом.

Создание systemd-юнита

Создайте файл /etc/systemd/system/minio.service:

[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Перед EnvironmentFile отсутствует символ -, и это осознанное решение, а не опечатка. С тире systemd игнорирует отсутствие файла и все равно запускает MinIO, поэтому удаленный файл или ошибка в пути приведут к тому, что сервер будет молча запущен на minioadmin:minioadmin. Без тире отсутствие файла приведет к ошибке юнита еще до запуска MinIO, и journalctl -u minio покажет Failed to load environment files: No such file or directory. Юнит, который отказывается запускаться, заметить гораздо проще, чем сервер, который тихо принимает пароль по умолчанию.

Параметры $MINIO_VOLUMES и $MINIO_OPTS намеренно не заключены в кавычки, так как systemd разделяет переменные без кавычек по пробелам на отдельные аргументы. Именно так четыре слова в MINIO_OPTS превращаются в четыре аргумента для minio server. LimitNOFILE=65536 увеличивает лимит дескрипторов файлов, так как каждое открытое соединение и каждый открытый файл данных требуют по одному дескриптору, а значения по умолчанию в 1024 не хватает при нагрузке.

sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/live

is-active должен вывести active, а эндпоинт проверки состояния должен ответить 200. journalctl -u minio -n 20 --no-pager показывает API-адрес, на котором слушает сервер. Если юнит постоянно перезапускается, systemd сдается и записывает в лог Start request repeated too quickly, что означает, что MinIO завершает работу при каждой попытке: причина указана в строках выше этого сообщения, поэтому читайте лог снизу вверх.

Для большей изоляции добавьте ProtectSystem=full и ProtectHome=true в секцию [Service]. Оба параметра требуют пространств имен монтирования (mount namespaces) от ядра хоста. В контейнерной виртуализации, использующей общее ядро хоста, такой как OpenVZ или LXC, они могут вызвать ошибку, и юнит сообщит о status=226/NAMESPACE. Удалите эти две строки, и он запустится. Сам юнит является обычным, а в статье systemd services and timers on a VPS описаны остальные директивы.

Установка mc и проверка цикла обмена данными

Клиент MinIO — это mc. Не устанавливайте его с помощью apt install mc. Этот пакет является Midnight Commander, файловым менеджером, не имеющим отношения к MinIO.

dl.min.io по-прежнему предоставляет бинарный файл mc, но не сообщества. Старый путь сообщества, https://dl.min.io/client/mc/release/linux-amd64/mc, отвечает 410 Gone. То, что MinIO предлагает там сейчас, — это AIStor Client по адресу https://dl.min.io/aistor/mc/release/linux-amd64/mc, на который ссылается справочник AIStor CLI и описывает его как имеющий эксклюзивную функциональность для лицензированных развертываний AIStor Server. В этом справочнике ничего не говорится об использовании его с сервером сообщества, поэтому данное руководство остается верным клиенту сообщества. Репозиторий minio/mc находится в архиве с июля 2026 года, поэтому соберите его последний релиз, RELEASE.2025-08-13T08-35-41Z, с помощью того же инструментария Go. База данных контрольных сумм также охватывает этот файл для загрузки.

go install github.com/minio/mc@RELEASE.2025-08-13T08-35-41Z
sudo install -o root -g root -m 755 ~/go/bin/mc /usr/local/bin/mc

Зарегистрируйте сервер как псевдоним, затем переместите объект через него.

MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txt

mc ls должен вывести список hello.txt с указанием размера, а mc cat должен вывести hello object storage. Этот цикл обмена данными является реальным доказательством работоспособности сервера, так как он выполняет те же подписанные S3-запросы, что и любой другой клиент. mc admin info local выводит статус сервера, если вам нужно второе мнение.

Выполните еще одну проверку сейчас, пока хранилище еще пустое.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

Эта команда должна завершиться ошибкой. Если она выполняется успешно, файл окружения не был передан процессу, и ваш сервер работает с учетными данными по умолчанию. Исправьте это, прежде чем что-либо еще будет взаимодействовать с машиной.

mc хранит псевдонимы в ~/.mc/config.json в виде открытого текста, поэтому эти учетные данные находятся в домашнем каталоге того, кто выполнил команду. Запуск mc от имени sudo помещает учетные данные root в /root/.mc/config.json. Храните псевдоним root только в одной учетной записи администратора и предоставляйте каждому приложению собственный ключ.

Предоставление доступа к одному объекту через presigned URL

Presigned URL — это обычная HTTPS-ссылка с приложенной подписью и сроком действия. Любой, у кого есть эта ссылка, может получить данный объект без учетной записи и без клиента.

mc share download --expire 12h local/backups/hello.txt

Вывод содержит X-Amz-Signature и X-Amz-Expires в строке запроса. Две вещи в этом могут удивить. Ссылка строится на основе эндпоинта из алиаса, который вы использовали, поэтому алиас на 127.0.0.1 создает ссылку, которую может открыть только эта машина: создайте второй алиас на ваше публичное доменное имя для ссылок, которые планируете отправлять. Кроме того, нет кнопки отзыва для отдельной ссылки. Подпись остается действительной до истечения срока ее действия или до удаления/изменения ключа, которым она была подписана. Для ссылки, подписанной с использованием root-учетных данных, это означает необходимость их ротации, поэтому короткий срок действия является практическим способом контроля. Семь дней — это максимум, который позволяет формат подписи S3.

Предоставление restic собственного ключа и бакета

Корневые учетные данные позволяют читать и удалять любой бакет, поэтому задача резервного копирования не должна их использовать. Создайте бакет, политику с ограничением доступа только к этому бакету и пользователя, у которого нет других прав.

mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::restic"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::restic/*"]
    }
  ]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backup

В MinIO есть встроенная политика readwrite, которая позволила бы сократить настройку на одну команду, но она предоставляет полный доступ ко всем бакетам на сервере. В приведенной выше политике имя бакета указано дважды намеренно: один раз как arn:aws:s3:::restic, чтобы работало перечисление содержимого бакета, и один раз как arn:aws:s3:::restic/* для объектов внутри него. В S3 бакет и его объекты — это разные ресурсы, поэтому политика, указывающая только на один из них, приведет к ошибке, которая выглядит как неисправность клиента.

Проверьте ограничение, прежде чем доверять ему.

mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backups

Первая команда ls выполняется успешно, а вторая завершается ошибкой Access Denied. Политика, которую вы не протестировали, — это лишь предположение.

Теперь укажите restic путь к бакету. restic считывает учетные данные S3 из стандартных переменных окружения AWS, поэтому отдельный файл учетных данных для restic не требуется.

sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshots

restic init запрашивает пароль репозитория. Этот пароль шифрует репозиторий, поэтому MinIO хранит только зашифрованные данные, и потеря пароля означает потерю резервной копии. Задача, запущенная через systemd timer, не имеет терминала для ввода пароля, поэтому для запланированного резервного копирования установите RESTIC_PASSWORD_FILE в файл с правами доступа 600.

Одно правило размещения важнее любой из команд выше. Репозиторий restic на том же VPS, что и защищаемые данные, спасает только от случайного rm и ни от чего больше. Узел MinIO должен быть на другой машине, желательно в другом регионе. В статье резервное копирование restic на VPS рассматриваются вопросы планирования и хранения резервных копий сверх этого.

Завершение TLS с помощью nginx

MinIO работает на localhost, поэтому nginx выступает в качестве публичного интерфейса. Сначала получите сертификат, как описано в получении сертификатов Let's Encrypt с помощью certbot и nginx, а затем используйте этот блок server.

server {
    listen 443 ssl;
    server_name s3.example.com;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        proxy_pass http://127.0.0.1:9000;
    }
}

Некоторые из этих строк критически важны. client_max_body_size 0 снимает стандартное ограничение размера тела запроса в 1 МБ, из-за которого любые загрузки большего объема отклоняются с ошибкой 413 Request Entity Too Large еще до того, как запрос попадет в MinIO. proxy_request_buffering off передает поток загрузки напрямую, так как по умолчанию nginx сохраняет весь запрос во временный файл, из-за чего для большого объекта требуется вдвое больше места на диске. proxy_set_header Host $http_host — тонкий момент: S3-подпись включает заголовок Host, поэтому прокси, который его перезаписывает, приводит к ошибке SignatureDoesNotMatch для каждого запроса, хотя в access log запрос выглядит как обычный входящий.

Также укажите MinIO его публичное имя, чтобы генерируемые им ссылки указывали на прокси, а не на localhost.

echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minio

Настройки межсетевого экрана остаются минимальными. Разрешите SSH и HTTPS, а для портов 9000 и 9001 не создавайте никаких правил, так как адрес, привязанный к 127.0.0.1, недоступен с других машин независимо от настроек firewall. В основах работы с ufw на VPS приведены соответствующие команды.

Когда достаточно одноузлового MinIO и когда требуется настоящий S3

Под одноузловым развертыванием здесь понимается использование одного диска, поэтому в такой конфигурации отсутствуют четность и вторая копия данных, а надежность каждого объекта ограничена надежностью одного диска VPS. Собственная документация MinIO, которая с момента закрытия публичного портала в октябре 2025 года существует только в виде исходного кода в репозитории minio/docs, определяет автономное развертывание как решение для начальной разработки и тестирования и указывает, что MinIO не рекомендует использовать его в промышленной эксплуатации. Блокировку объектов (object locking) можно включить для бакета, но на одном VPS она лишь предотвращает удаление через S3 API. Любой пользователь с правами root на машине все равно может удалить файлы на диске, поэтому не стоит гарантировать кому-либо неизменяемую политику хранения (immutable retention policy) при такой настройке.

Это решение хорошо подходит в качестве цели для restic на втором VPS в другом регионе, а также как S3-эндпоинт для разработки и CI-артефактов, где потеря бакета означает лишь необходимость повторной сборки. Оно также приемлемо для пользовательских загрузок в небольшом приложении, если вы сами отвечаете за план восстановления и уже протестировали процедуру восстановления данных.

Выбирайте управляемый S3, если контракт или регулятор требуют наличия блокировки объектов или мультирегиональной надежности, либо если вы не хотите быть тем, кому звонят в 03:00 из-за того, что на диске закончилось место. «Замороженный» код — еще одна веская причина. По состоянию на 20 октября 2026 года community-версия переведена в архив и больше не поддерживается, а ее последний релиз, RELEASE.2025-10-15T17-29-55Z, является тем самым, который рассматривается в данном руководстве. Никакие ошибки после него исправляться не будут, поэтому использование этой версии означает либо принятие этого факта, либо переход на коммерческую линейку MinIO AIStor или другое self-hosted хранилище, сравнение которых приведено в альтернативах self-hosted MinIO.

Стоит обозначить одну границу, так как вопрос возникает часто. Объектное хранилище — это не база данных. В стандартном бакете каждая операция записи заменяет объект целиком, и даже вызов append, добавленный Amazon для S3 Express One Zone, лишь дописывает данные в конец, поэтому работа с «живым» SQL-файлом в S3-бакете будет медленной и небезопасной. Храните базу данных на локальном диске, а в бакет делайте резервные копии: в статье запуск SQLite в production на VPS описано такое разделение.

Типовые сбои и соответствующие сообщения

Юнит завершается сразу после systemctl enable --now. Прочитайте journalctl -u minio -n 30 --no-pager. Сообщение Failed to load environment files: No such file or directory означает, что файл /etc/default/minio отсутствует или в юните указан неверный путь к нему. Сообщение, заканчивающееся на permission denied, означает, что у сервисной учетной записи нет прав на запись в каталог данных; убедитесь, что команда stat -c '%U' /var/lib/minio/data выводит minio-user.

minioadmin:minioadmin всё ещё выполняет вход. Файл окружения не был передан процессу. Убедитесь, что юнит содержит EnvironmentFile=/etc/default/minio, выполните sudo systemctl daemon-reload, а затем перезапустите сервис. MinIO считывает корневые учетные данные только при запуске, поэтому редактирование файла без перезапуска не применит изменения.

Address already in use при запуске. Порт 9000 занят другим процессом. Найдите его с помощью sudo ss -ltnp | grep :9000, прежде чем менять порт MinIO.

Загрузка файлов размером более 1 МБ через прокси завершается ошибкой. nginx вернул 413 Request Entity Too Large, и запрос не дошел до MinIO. Установите client_max_body_size 0 в блоке server.

SignatureDoesNotMatch. Либо указан неверный секретный ключ, либо промежуточный узел между клиентом и MinIO изменил заголовок Host, который входит в подпись запроса.

RequestTimeTooSkewed. Неверно настроено время на клиенте или сервере. Каждый подписанный S3-запрос содержит временную метку, и MinIO, как и Amazon S3, отклоняет запрос с подписанным заголовком, если его метка отличается от системного времени более чем на 15 минут. Для предподписанных ссылок проверяется срок их действия. Проверьте timedatectl и убедитесь, что синхронизация времени активна.

Access Denied для бакета, который существует. Ключ ограничен другим бакетом. Выведите текущие разрешенные действия с помощью mc admin policy info local restic-rw и сравните имя бакета в строках ресурсов.

FAQ

Достаточно ли MinIO на одном узле для реальных резервных копий?

Это приемлемый вариант в качестве цели для restic, если он запущен на отдельной машине, отличной от той, где хранятся исходные данные. Однако это не должно быть вашей единственной копией. Развертывание на одном диске не обеспечивает избыточности, поэтому внутри MinIO нет второй копии данных. Если диск VPS выйдет из строя, объекты будут потеряны. Храните вторую копию в другом месте и хотя бы раз выполните восстановление из обоих источников, чтобы убедиться в работоспособности процесса.

Почему sha256sum -c выдает ошибку при проверке контрольной суммы MinIO?

Вы столкнетесь с этим файлом только в ранее сохраненных копиях, так как dl.min.io ответил на 410 Gone для всех сообщественных бинарных файлов и файлов контрольных сумм по состоянию на 20 октября 2026 года. Метка после хеша внутри файла указывает на релиз, например minio.RELEASE.2025-09-07T16-13-09Z, в то время как скачанный файл обычно называется minio. sha256sum -c ищет файл с именем, указанным внутри файла контрольной суммы, не находит его и сообщает о No such file or directory и WARNING: 1 listed file could not be read. Сам файл скачан корректно. Сравнивайте строки хешей напрямую и игнорируйте метку, так как она не несет никакой функции безопасности.

Куда исчезла веб-консоль администратора MinIO?

В мае 2025 года MinIO удалила функции администрирования из консоли сообщественной версии, оставив в веб-интерфейсе только браузер объектов. Управление бакетами и пользователями теперь осуществляется через клиент mc с помощью команд, таких как mc admin user add и mc admin policy attach. Это штатный способ работы в сообщественной версии, а не временное решение, поэтому данное руководство выполняет все операции через командную строку.

Как указать restic использовать MinIO в качестве S3-бэкенда?

Установите AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY в значения ключа доступа MinIO и его секретного ключа, затем используйте строку репозитория вида s3:https://s3.example.com/restic, где последний элемент пути — это имя бакета. Сначала создайте бакет с помощью mc mb, так как ключ, ограниченный одним бакетом, не имеет прав на создание новых бакетов. restic шифрует все данные собственным паролем репозитория перед загрузкой, поэтому MinIO хранит только зашифрованный текст и не имеет доступа к вашим файлам.

Обязательно ли запускать MinIO за nginx?

TLS (transport layer security) необходим всегда, когда клиент находится на другой машине. Без него каждый объект передается по сети в открытом виде вместе с идентификатором ключа доступа и подписью запроса. Сам секретный ключ никогда не покидает клиент, так как S3-подпись вычисляется локально, но любой участник на пути следования трафика может прочитать ваши данные или повторно отправить перехваченный запрос, пока его временная метка остается валидной. Прокси на 443 порту с сертификатом от certbot — самый простой способ обеспечить TLS, при этом обновление сертификатов остается вне зоны ответственности MinIO. MinIO также может самостоятельно терминировать TLS, если указать --certs-dir на директорию с public.crt и private.key, но в этом случае сервисной учетной записи потребуется доступ на чтение к обновленному приватному ключу, что требует дополнительных настроек при том же результате.

Была ли эта статья полезной?

#minio#s3#object-storage#self-hosted#vps