Что такое minio
Перейти к содержимому

Что такое minio

  • автор:

MinIo для самых маленьких

MinIO — прекрасное решение, когда надо легко и просто организовать объектное хранилище. Элементарная настройка, множество платформ и хорошая производительность сделали своё дело на ниве народной любви. Так что у нас не было другого пути, как месяц назад заявить о совместимости Veeam Backup & Replication и MinIO. Включая такую важную функцию, как Immutability. На самом деле у MinIO есть целый раздел в документации, посвящённый нашей интеграции.

Поэтому сегодня мы поговорим о том, как:

  • Настроить MinIO очень быстро.
  • Настроить MinIO чуть менее быстро, но значительно качественней.
  • Использовать его в качестве Archive Tier для масштабируемого репозитория Veeam SOBR.

Что ты такое?

Краткая вводная для тех, кто не сталкивался с MinIO. Это опенсорсное объектное хранилище, совместимое с Amazon S3 API. Выпускается под лицензией Apache v2 и придерживается философии спартанского минимализма.

То есть у него нет развесистого GUI с дашбордами, графиками и многочисленными меню. MinIO просто запускает свой сервер одной командой, на котором можно просто хранить данные, используя всю мощь S3 API. Но надо заметить, что простота эта может быть обманчива, когда речь заходит об используемых ресурсах. RAM и CPU поглощаются на отлично, но о причинах будет ниже. И, к слову сказать, такие комбайны, как FreeNAS и TrueNAS под капотом используют именно MinIO.

На этом введение можно и заканчивать.

Настройка MinIO очень быстро

Настройка его настолько быстра, что мы рассмотрим её для Windows и Linux. Есть варианты и для докера, и для кубернетиса, и даже для макоси, но смысл везде будет одинаковый.

Итак, в случае Windows идём на официальный сайт https://min.io/download#/windows и качаем последнюю версию. Там же наблюдаем инструкцию по запуску:

 minio.exe server F:\Data 

И там же ссылка на чуть более развёрнутый Quick start guide. Инструкции не верить смысла нет, поэтому запускаем и получаем примерно такой ответ.

На этом всё! Хранилище работает и можно начинать с ним работать. Я не шутил, когда говорил, что MinIO — это минимализм и просто работает. Если пройти по предложенной при запуке ссылке, то максимум доступных там функций — это создать бакет. И можно начинать писать данные.

Для любителей линуксов всё остаётся не менее простым. Простейшая инструкция:

 wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio ./minio server /data

Результат будет неотличим от виденного ранее.

Настройка MinIO чуть более осмысленная

Как мы понимаем, предыдущий абзац — это баловство для тестовых целей. И, скажем честно, именно для тестирования MinIO у нас используется очень широко, в чём нам совершнно не стыдно признаться. Конечно, оно работает, но дальше тестовых стендов выносить такое стыдно. Поэтому берём в руки напильник и начинаем доводить до ума.

HTTPS

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

  • Создаём сертификат
  • В случае Windows кладём его в C:\Users\%User%\.minio\certs
  • В случае Linux в $/.minio/certs
  • Перезапускаем сервер
  • Создаём ключи: openssl ecparam -genkey -name prime256v1 | openssl ec -out private.key
  • Создаём сертификат по ключу: openssl req -new -x509 -days 3650 -key private.key -out public.crt
  • Копируем private.key и public.crt в папку, указанную выше
  • Перезапускаем MinIO

Включаем MinIO Erasure Coding

Сперва пара слов о сабже. В двух словах: это программная защита данных от повреждения и потери. Как рейд, только намного надёжней. Если классический RAID6 может позволить себе потерять два диска, то MinIO спокойно переживает потерю половины. Более детально технология описана в официальном гайде. Но если взять самую суть, то это реализация кодов Рида-Соломона: вся информация хранится в виде блоков данных, к которым есть блоки чётности. И вроде это всё уже было сделано много раз, только есть важное «но»: мы можем явно указывать соотношение блоков чётности к блокам данных для хранимых объектов.
Хотите 1:1? Пожалуйста!
Хотите 5:2? Без проблем!

Очень важная функция, если вы используете сразу несколько нод и хотите найти свой собственный баланс между максимальной безопасностью данных и затраченных ресурсов. Из коробки MinIO использует формулу N/2 (где N — общее количество дисков), т.е. делит ваши данные между N/2 дисками данных и N/2 дисками четности. Переводя на человеческий: можно потерять половину дисков и восстановить данные. Это соотношение задаётся через Storage Class, позволяя вам самостоятельно выбрать, что важнее: надёжность или ёмкость.

В гайде приведён такой пример: предположим, что у вас инсталляция на 16 дисков и вам надо сохранить файл размером 100 Мб. Если используются настройки по умолчанию (8 дисков под данные, 8 под блоки чётности), то файл в итоге займёт практически двойной объём т.е. 200 Мб. Если отношение дисков будет 10/6, то понадобится 160 Мб. 14/2 — 114 Мб.

Другое важное отличие от рейдов: в случае выпадения дисков MinIO будет работать на уровне объектов, восстанавливая один за другим, не останавливая работу всей системы. В то время как обычный рейд будет вынужден восстанавливать весь volume, что займёт непредсказуемое количество времени. На памяти автора дисковая полка, которая после выпадения двух дисков ушла на пересчёт на полторы недели. Было весьма неприятно.

И, важное замечание: MinIO делит все диски для Erasure Coding на сэты от 4х до 16ти дисков, используя максимально возможный размер сэта. И в дальнейшем, один элемент информации будет храниться только в пределах одного сэта.

Звучит всё это очень здорово, но насколько сложной будет настройка? Давайте посмотрим. Берём команду для запуска и просто перечисляем диски, на которых нужно создать хранилище. Если всё сделано верно, то в репорте увидим количество задействованных дисков. И совет, что негоже на один хост добавлять сразу половину дисков, ибо это к потере данных.

c:\minio>minio.exe server F:\ G:\ H:\ I:\ J:\ K:\

Далее для управления и настройки MinIO сервера нам потребуется агент, скачать который можно всё там же с официального сайта.

Чтобы не стирать пальцы, каждый раз набирая адрес и ключи доступа (да и небезопасно это), удобно при первом запуске сразу создать alias по формуле mc alias set [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]

mc alias set veeamS3 https://172.17.32.52:9000 YOURS3ACCESSKEY YOURSECERTKE

Или же можно сразу добавить ваш хост:

mc config host add minio-veeam https://minio.jorgedelacruz.es YOURS3ACCESSKEY YOURSECERTKEY

А потом создадим immutable бакет красивой командой

mc mb --debug -l veeamS3/immutable mc: PUT /immutable/ HTTP/1.1 Host: 172.17.32.52:9000 User-Agent: MinIO (windows; amd64) minio-go/v7.0.5 mc/2020-08-08T02:33:58Z Content-Length: 0 Authorization: AWS4-HMAC-SHA256 Credential=minioadmin/20200819/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-bucket-object-lock-enabled;x-amz-content-sha256;x-amz-date, Signature=**REDACTED** X-Amz-Bucket-Object-Lock-Enabled: true X-Amz-Content-Sha256: UNSIGNED-PAYLOAD X-Amz-Date: 20200819T092241Z Accept-Encoding: gzip mc: HTTP/1.1 200 OK Content-Length: 0 Accept-Ranges: bytes Content-Security-Policy: block-all-mixed-content Date: Wed, 19 Aug 2020 09:22:42 GMT Location: /immutable Server: MinIO/RELEASE.2020-08-16T18-39-38Z Vary: Origin X-Amz-Request-Id: 162CA0F9A3A3AEA0 X-Xss-Protection: 1; mode=block mc: Response Time: 253.0017ms

—debug позволяет видеть не просто итоговое сообщение, а более развёрнутую информацию.

-l значит —with-lock, что значит immutable

Если теперь вернуться в веб интерфейс, то там появится наш новый бакет.

На данный момент это всё. Мы создали защищенное хранилище и готовы переходить к интеграции с Veeam.

Можно ещё удостовериться, что всё работает на отлично:

c:\minio>mc admin info veeamS3 ● 172.17.32.52:9000 Uptime: 32 minutes Version: 2020-08-16T18:39:38Z Network: 1/1 OK Drives: 6/6 OK 0 B Used, 1 Bucket, 0 Objects 6 drives online, 0 drives offline

MinIO и Veeam

Внимание! Если по какой-то из невероятных причин вы хотите работать через HTTP, то по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Veeam\Veeam Backup and Replication\ создайте DWORD ключ SOBRArchiveS3DisableTLS. Выставите его значение в 1 и помните, что мы такое поведение решительно не одобряем и никому не советуем.

Внимание ещё раз! Если из-за какого-то недоразумения вы продолжаете использовать Windows 2008 R2, то при попытке подключить MinIO к Veeam вы скорее всего получите примерно такую ошибку: Failed to establish connection to Amazon S3 endpoint. Лечится это официальным патчем от Microsoft.

Ну что же, с приготовлениями закончено, давайте откроем интерфейс VBR и перейдём на вкладку Backup Infrastructure, где вызовем мастер добавления нового репозитория.

Само собой, интересует нас Object storage, а именно S3 Compatible. В открывшемся визарде задаём имя, проходим шаги с указанием адреса и учётной записи. Если требуется, то не забываем указать гейт, через который будут проксироваться запросы к хранилищу.

После чего выбираем бакет, папку и ставим галочку Make recent backups immutable. Или не ставим. Но раз уж мы сделали хранилище с поддержкой этой функции, то грех будет не воспользоваться.

Next > Finish и наслаждаемся результатом.

Теперь надо добавить его к SOBR репозиторию в качестве Capacity Tier. Для этого или создаём новый, или редактируем имеющийся. Нас интересует шаг Capacity Tier.

Здесь нам надо выбрать, по какому сценарию мы будем работать. Все варианты довольно хорошо описаны в другой статье, так что не буду повторяться

А по завершении работы мастера будут автоматически запущены задания на копирование или перенос бекапов. Но если в ваши планы не входит так сразу выдать нагрузку на все системы, то обязательно задайте допустимые интервалы для работы по кнопке Window.

И, само собой, можно сделать отдельные Backup Copy задания. Некоторые считают, что так даже удобнее, так как они несколько более прозрачны и предсказуемы для пользователя, не желающего вникать в подробности работы капасити тира. А подробностей там хватает, так что ещё раз рекомендую соответствующую статью по ссылке выше.

И напоследок — ответ на коварный вопрос: что же будет, если всё же взять и попробовать удалить бекап из Immutable стораджа?

На этом на сегодня всё. По верной традиции, ловите список полезных топиков по теме:

  • Мануал Using MinIO with Veeam
  • Пример по использовани MinIO вместе с Veeam Backup for Office 365.
  • Общий мануал по настройке S3 стораджей в Veeam.
  • Ветка на нашем форуме про S3 хранилища.

Зачем и как хранить объекты на примере MinIO

Наша биг дата проанализировала Telegram-чаты, форумы и разговоры в кулуарах IT-мероприятий и пометила объектные хранилища как инструмент, который ещё не все осмеливаются использовать в своих проектах. Хочу поделиться с вами своим опытом в формате статьи-воркшопа. Если вы пока не знакомы с этой технологией и паттернами её применения, надеюсь, эта статья поможет вам начать использовать её в своих проектах.

Зачем вообще говорить о хранении объектов?

С недавних пор я работаю Golang-разработчиком в Ozon. У нас в компании есть крутая команда админов и релиз-инженеров, которая построила инфраструктуру и CI вокруг неё. Благодаря этому я даже не задумываюсь о том, какие инструменты использовать для хранения файлов и как это всё поддерживать.

Но до прихода в Ozon я сталкивался с довольно интересными кейсами, когда хранение разных данных (документов, изображений) было организовано не самым изящным образом. Мне попадались SFTP, Google Drive и даже монтирование PVC в контейнер!

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

TL;DR

Объектное хранилище – это дополнительный слой абстракции над файловой системой и хостом, который позволяет работать с файлами (получать доступ, хранить) через API.

Объектное хранилище может помочь вам в кейсах, когда необходимо хранить файлы пользователей в ваших приложениях, складывать статику и предоставлять доступ к ней через Ingress или хранить кеши вашего CI.

Все материалы к статье (исходники, конфиги, скрипты) лежат вот в этой репе.

Что такое объектное хранилище

Хранить данные нашего приложения можно различными способами, от хранения данных просто на диске до блоба в нашей БД (если она это поддерживает, конечно). Но будет такое решение оптимальным? Часто есть нефункциональные требования, которые нам хотелось бы реализовать: масштабируемость, простота поддержки, гибкость. Тут уже хранением файлов в БД или на диске не обойтись. В этих случаях, например, масштабирование программных систем, в которых хранение данных построено на работе с файловой системой хоста, оказывается довольно проблематичной историей.

И на помощь приходят те самые объектные хранилища, о которых сегодня и пойдёт речь. Объектное хранилище – это способ хранить данные и гибко получать к ним доступ как к объектам (файлам). В данном контексте объект – это файл и набор метаданных о нём.

Стоит ещё упомянуть, что в объектных хранилищах нет такого понятия, как структура каталогов. Все объекты находятся в одном «каталоге» – bucket. Структурирование данных предлагается делать на уровне приложения. Но никто не мешает назвать объект, например, так: objectScope/firstObject.dat .

Основное преимущество хранения данных в объектах – это возможность абстрагирования системы от технических деталей. Нас уже не интересует, какая файловая (или тем более операционная) система хранит наши данные. Мы не привязываемся к данным какими-то конкретными способами их представления, которые нам обеспечивает платформа.

В этой статье мы не будем сравнивать типы объектных хранилищ, а обратим наше внимание на класс S3-совместимых стораджей, на примере MinIO. Выбор обусловлен тем, что MinIO имеет низкий порог входа (привет, Ceph), а ещё оно Kubernetes Native, что бы это ни значило.

На мой взгляд, MinIO – это самый доступный способ начать использовать технологию объектного хранения данных прямо сейчас: его просто развернуть, легко управлять и его невозможно забыть. На протяжении долгого времени MinIO может удовлетворять таким требованиям, как доступность, масштабируемость и гибкость.

Вообще S3-совместимых решений на рынке много. Всегда есть, из чего выбрать, будь то облачные сервисы или self-hosted-решения. В общем случае мы всегда можем перенести наше приложение с одной платформы на другую (да, у некоторых провайдеров есть определённого рода vendor lock-in, но это уже детали конкретных реализаций).

Disclaimer: под S3 я буду иметь в виду технологию (S3-совместимые объектные хранилища), а не конкретный коммерческий продукт. Цель статьи – показать на примерах, как можно использовать такие решения в своих приложениях.

Кейс 1: прокат самокатов

В рамках формата статьи-воркшопа знакомиться с S3 в общем и с MinIO в частности мы будем на практике.

На практике часто возникает вопрос хранения и доступа к контенту, который генерируется или обрабатывается вашим приложением. Правильно выбранный подход может обеспечить спокойный сон и отсутствие головной боли, когда придёт время переносить или масштабировать наше приложение.

Давайте перейдём к кейсу. Представим, что мы пишем сервис для проката самокатов и у нас есть user story, когда клиент фотографирует самокат до и после аренды. Хранить медиаматериалы мы будем в объектном хранилище.

Для начала развернём наше хранилище.

Самый быстрый способ развернуть MinIO – это наш любимчик Docker, само собой.

С недавнего времени Docker – не такая уж и бесплатная штука, поэтому в репе на всякий случай есть альтернативные манифесты для Podman.

Запускать «голый» контейнер из терминала – нынче моветон, поэтому начнём сразу с манифеста для docker-compose.

# docker-compose.yaml version: '3.7' services: minio: image: minio/minio:latest command: server --console-address ":9001" /data/ ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: ozontech MINIO_ROOT_PASSWORD: minio123 volumes: - minio-storage:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 volumes: minio-storage:

Сохраняем манифест и делаем $ docker-compose up в директории с манифестом.

Теперь мы можем управлять нашим хранилищем с помощью web-ui. Но это не самый удобный способ для автоматизации процессов (например, для создания пайплайнов в CI/CD), поэтому сверху ещё поставим CLI-утилиту:

$ go get github.com/minio/mc

И да, не забываем про export PATH=$PATH:$(go env GOPATH)/bin.

Cоздадим алиас в mc (залогинимся):

$ mc alias set minio http://localhost:9000 ozontech minio123

Теперь создадим bucket – раздел, в котором мы будем хранить данные нашего пользователя (не стоит ассоциировать его с папкой). Это скорее раздел, внутри которого мы будем хранить данные.

Назовем наш бакет “usersPhotos”:

$ mc mb minio/usersPhot

$ mc ls minio > [0B] usersPhotos

Теперь можно приступать к реализации на бэке. Писать будем на Golang. MinIO любезно нам предоставляет пакетик для работы со своим API.

Disclaimer: код ниже – лишь пример работы с объектным хранилищем; не стоит его рассматривать как набор best practices для использования в боевых проектах.

Начнём с подключения к хранилищу:

func (m *MinioProvider) Connect() error < var err error m.client, err = minio.New(m.url, &minio.Options< Creds: credentials.NewStaticV4(m.user, m.password, ""), Secure: m.ssl, >) if err != nil < log.Fatalln(err) >return err >

Теперь опишем ручку добавления медиа:

func (s *Server) uploadPhoto(w http.ResponseWriter, r *http.Request) < // Убеждаемся, что к нам в ручку идут нужным методом if r.Method != "POST" < w.WriteHeader(http.StatusMethodNotAllowed) return >// Получаем ID сессии аренды, чтобы знать, в каком контексте это фото rentID, err := strconv.Atoi(r.Header.Get(HEADER_RENT_ID)) if err != nil < logrus.Errorf("Can`t get rent id: %v\n", err) http.Error(w, "Wrong request!", http.StatusBadRequest) return >// Забираем фото из тела запроса src, hdr, err := r.FormFile("photo") if err != nil < http.Error(w, "Wrong request!", http.StatusBadRequest) return >// Получаем информацию о сессии аренды session, err := s.database.GetRentStatus(rentID) if err != nil < logrus.Errorf("Can`t get session: %v\n", err) http.Error(w, "Can`t upload photo!", http.StatusInternalServerError) return >// Складываем данные в объект, который является своего рода контрактом // между хранилищем изображений и нашей бизнес-логикой object := models.ImageUnit < Payload: src, PayloadSize: hdr.Size, User: session.User, >defer src.Close() // Отправляем фото в хранилище img, err := s.storage.UploadFile(r.Context(), object) if err != nil < logrus.Errorf("Fail update img in image strorage: %v\n", err) http.Error(w, "Can`t upload photo!", http.StatusInternalServerError) return >// Добавляем запись в БД с привязкой фото к сессии err = s.database.AddImageRecord(img, rentID) if err != nil < logrus.Errorf("Fail update img in database: %v\n", err) http.Error(w, "Can`t upload photo!", http.StatusInternalServerError) >>
func (m *MinioProvider) UploadFile(ctx context.Context, object models.ImageUnit) (string, error) < // Получаем «уникальное» имя объекта для загружаемого фото imageName := samokater.GenerateObjectName(object.User) _, err := m.client.PutObject( ctx, UserObjectsBucketName, // Константа с именем бакета imageName, object.Payload, object.PayloadSize, minio.PutObjectOptions, ) return imageName, err

Нам надо как-то разделять фото до и после, поэтому мы добавим записи в базу данных:

func (s *PGS) AddImageRecord(img string, rentID int) error < // Получаем информацию о сессии аренды rent, err := s.GetRentStatus(rentID) if err != nil < logrus.Errorf("Can`t get rent record in db: %v\n", err) return err >// В зависимости от того, были загружены фото до начала аренды // или после её завершения, добавляем запись в соответствующее поле в БД if rent.StartedAt.IsZero() < return s.updateImages(rent.ImagesBefore, img, update_images_before, rentID) >return s.updateImages(rent.ImagesAfter, img, update_images_after, rentID) >

Ну и сам метод обновления записи в БД:

func (s *PGS) updateImages(old []string, new, req string, rentID int) error < // Добавляем в список старых записей // новую запись об изображении old = append(old, new) new = strings.Join(old, ",") _, err := s.db.Exec(req, new, rentID) if err != nil < logrus.Errorf("Can`t update image record in db: %v\n", err) >return err >

Также мы могли бы напрямую через сервис вытаскивать и отдавать фото по запросу. Выглядело бы это примерно так:

func (s *Server) downloadPhoto(w http.ResponseWriter, r *http.Request) < if r.Method != "GET" < w.WriteHeader(http.StatusMethodNotAllowed) return >rentID := r.URL.Query()["rid"][0] if rentID == "" < http.Error(w, "Can`t get rent-id from request", http.StatusBadRequest) >img, err := s.storage.DownloadFile(r.Context(), rentID) if err != nil < logrus.Errorf("Cant`t get image from image-storage: %v\n", err) http.Error(w, "Can`t get image", http.StatusBadRequest) >s.sendImage(w, img.Payload) >

Ну и само получение файла из хранилища:

func (m *MinioProvider) DownloadFile(ctx context.Context, image string) (models.ImageUnit, error) < reader, err := m.client.GetObject( ctx, UserObjectsBucketName, image, minio.GetObjectOptions<>, ) if err != nil < logrus.Errorf("Cant`t get image from image-storage: %v\n", err) >defer reader.Close() return models.ImageUnit<>, nil >

Но мы можем и просто проксировать запрос напрямую в MinIO, так как у нас нет причин этого не делать (на практике такими причинами могут быть требования безопасности или препроцессинг файлов перед передачей пользователю). Делать это можно, обернув всё в nginx:

server < listen 8080; underscores_in_headers on; proxy_pass_request_headers on; location / < proxy_pass http://docker-samokater; >location /samokater < proxy_pass http://docker-minio-api; >> server < listen 9090; location / < proxy_pass http://docker-minio-console; proxy_redirect off; >>

Получать ссылки на изображения мы будем через ручку rent_info:

func (s *Server) rentInfo(w http.ResponseWriter, r *http.Request) < if r.Method != "GET" < w.WriteHeader(http.StatusMethodNotAllowed) return >rentID, err := strconv.Atoi(r.Header.Get(HEADER_RENT_ID)) if err != nil < logrus.Errorf("Can`t get rent id: %v\n", err) http.Error(w, "Wrong request!", http.StatusBadRequest) return >session, err := s.database.GetRentStatus(rentID) if err != nil < logrus.Errorf("Can`t get session: %v\n", err) http.Error(w, "Can`t rent info!", http.StatusInternalServerError) return >// Обогащаем поля ссылками на изображения session = enrichImagesLinks(session) s.sendModel(w, session) >

И сам метод обогащения:

func enrichImagesLinks(session models.Rent) models.Rent < for i, image := range session.ImagesBefore < session.ImagesBefore[i] = fmt.Sprintf("%s/%s", ImageStorageSVCDSN, image) >for i, image := range session.ImagesAfter < session.ImagesAfter[i] = fmt.Sprintf("%s/%s", ImageStorageSVCDSN, image) >return session >

Упакуем всё в docker-compose.yaml:

version: '3.7' services: minio: image: minio/minio:latest container_name: minio restart: unless-stopped command: server --console-address ":9001" /data/ ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: ozontech MINIO_ROOT_PASSWORD: minio123 volumes: - minio-storage:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 networks: - app-network samokater: image: samokater:latest container_name: samokater build: context: ./ dockerfile: samokater.Dockerfile restart: unless-stopped ports: - 8080:8080 networks: - app-network environment: SERVERPORT: :8080 DBPATH: user=postgres password=devpass dbname=postgres host=db port=5432 sslmode=disable MINIOHOST: minio:9000 MINIOUSER: ozontech MINIOPASS: minio123 depends_on: - db - minio initDB: image: mingration:latest container_name: init environment: DBPATH: user=postgres password=devpass dbname=postgres host=db port=5432 sslmode=disable build: context: ./ dockerfile: mingration.Dockerfile networks: - app-network depends_on: - db db: container_name: db image: postgres restart: always environment: POSTGRES_PASSWORD: devpass volumes: - pg-storage:/var/lib/postgresql/data ports: - 5432:5432 networks: - app-network nginx: image: nginx-custom:latest build: context: ./ dockerfile: nginx.Dockerfile restart: unless-stopped tty: true container_name: nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8000:80 - 443:443 networks: - app-network depends_on: - samokater networks: app-network: driver: bridge volumes: minio-storage: pg-storage:

Протестируем работу нашего приложения:

# Создаём сессию аренды $ curl -i -X POST --header 'user_id:100' http://localhost:8080/api/v1/rent HTTP/1.1 200 OK # Добавляем пару фото до начала аренды $ curl -i -X POST --header 'rent_id:8674665223082153551' --form photo=@/Users/ktikhomirov/image_1.png http://localhost:8080/api/v1/upload_photo --insecure HTTP/1.1 200 OK # Начинаем сессию аренды $ curl -i -X POST http://localhost:8080/api/v1/rent_start -H "Content-Type: application/json" -d '' HTTP/1.1 200 OK # Завершаем сессию аренды $ curl -i -X POST http://localhost:8080/api/v1/rent_stop -H "Content-Type: application/json" -d '' HTTP/1.1 200 OK # Добавляем фото после завершения аренды $ curl -i -X POST --header 'rent_id:8674665223082153551' --form photo=@/Users/ktikhomirov/image_2.png http://localhost:8080/api/v1/upload_photo --insecure # Получаем информацию об аренде curl -i -X GET -H "rent_id:8674665223082153551" http://localhost:8080/api/v1/rent_info HTTP/1.1 200 OK <"ID":100,"Name":"","StartedAt":"2021-10-21T08:10:31.536028Z","CompletedAt":"2021-10-21T08:19:33.672493Z","ImagesBefore":["http://127.0.0.1:8080/samokater/100/2021-10-21T15:15:24.png","http://127.0.0.1:8080/samokater/100/2021-10-21T08:06:15.png"],"ImagesAfter":["http://127.0.0.1:8080/samokater/100/2021-10-21T08:21:06.png"],"RentID":8674665223082153551>

Изображение полученное при переходе по URL от ответа сервиса

Кейс 2: хранение и раздача фронта

Ещё одна довольно популярная задача, для решения которой можно использовать объектные хранилища, – хранение и раздача фронта. Объектные хранилища пригодятся нам тут, когда захотим повысить доступность нашего фронта или удобнее им управлять. Это актуально, например, если у нас несколько проектов и мы хотим упростить себе жизнь.

Небольшая предыстория. Однажды я встретил довольно интересную практику в компании, где в месяц релизили по несколько лендингов. В основном они были написаны на Vue.js, изредка прикручивался API на пару простеньких ручек. Но моё внимание больше привлекло то, как это всё деплоилось: там царствовали контейнеры с nginx, внутри которых лежала статика, а над всем этим стоял хостовый nginx, который выполнял роль маршрутизатора запросов. Как тебе такой cloud-native-подход, Илон? В качестве борьбы с этим монстром мной было предложено обмазаться кубами, статику держать внутри MinIO, создавая для каждого лендинга свой бакет, а с помощью Ingress уже всё это проксировать наружу. Но, как говорится, давайте не будем говорить о плохом, а лучше сделаем!

Представим, что перед нами стоит похожая задача и у нас уже есть Kubernetes. Давайте туда раскатаем MinIO Operator. Стоп, почему нельзя просто запустить MinIO в поде и пробросить туда порты? А потому, что MinIO-Operator любезно сделает это за нас, а заодно построит High Availability-хранилище. Для этого нам всего лишь надо три столовые ложки соды. воспользоваться официальной документацией.

Для простоты установки мы вооружимся смузи Krew, который всё сделает за нас:

$ kubectl krew update

$ kubectl krew install minio

$ kubectl minio init

Теперь надо создать tenant. Для этого перейдём в панель управления. Чтобы туда попасть, прокинем прокси:
$ kubectl minio proxy -n minio-operator

После прокидывания портов до нашего оператора мы получим в вывод терминала JWT-токен, с которым и залогинимся в нашей панели управления:

Интерфейс управления тенантами

Далее нажимаем на кнопку «Добавить тенант» и задаём ему имя и неймспейс:

Интерфейс настройки тенанта

После нажатия на кнопку «Создать» мы получим креденшиалы, которые стоит записать в какой-нибудь Vault:

Теперь для доступа к панели нашего кластера хранилищ, поднимем прокси к сервису minio-svc и его панели управления:

# Поднимаем прокси к дашборду minio-svc kubectl -n minio-operator port-forward service/minio-svc-console 9090:9090 # Поднимаем прокси к API minio-svc kubectl -n minio-operator port-forward service/minio-svc-hl 9000:9000

И вуаля! У нас есть высокодоступный отказоустойчивый кластер MinIO. Давайте прикрутим его к нашему GitLab CI и сделаем .gitlab_ci, чтобы в пару кликов деплоить фронт.

Вот так у нас будет выглядеть джоба для CI/CD на примере GitLab CI (целиком конфиг лежит в репе):

# gitlab-ci deploy-front: stage: deploy image: minio/mc script: # Логинимся в MinIO - mc config host add --insecure deploy $CI_OBJECT_STORAGE $CI_OBJECT_STORAGE_USER $CI_OBJECT_STORAGE_PASSWORD # И всё собранное ранее переносим в наш бакет - mc cp dist/* deploy/static --insecure -c -r dependencies: - build-front

Для того чтобы отдавать статику, добавим Ingress-манифест:

# static.yaml --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: example-static labels: app.kubernetes.io/name: example-static app.kubernetes.io/version: "latest" annotations: cert-manager.io/cluster-issuer: letsencrypt-worker kubernetes.io/ingress.class: nginx kubernetes.io/tls-acme: "true" nginx.ingress.kubernetes.io/proxy-body-size: 100m nginx.ingress.kubernetes.io/secure-backends: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: tls: - hosts: - "domain.ru" secretName: ssl-letsencrypt-example rules: - host: "domain.ru" http: paths: - backend: serviceName: minio-svc servicePort: 9000 path: /(.+) pathType: Prefix

А если вдруг потребуется доступ из других неймспейсов, то мы можем создать ресурс ExternalName:

--- apiVersion: v1 kind: Service metadata: name: minio-svc namespace: deploy spec: ports: - port: 9000 protocol: TCP targetPort: 9000 sessionAffinity: None type: ExternalName

Вместо вывода

Объектные хранилища – это класс инструментов, которые позволяют наделить систему высокодоступным хранилищем данных. Во времена cloud-native это незаменимый помощник в решении многих задач. Да, на практике могут случаться кейсы, в которых использование объектного хранения данных будет избыточным, но вряд ли это можно считать поводом совсем игнорировать этот инструментарий в других своих проектах.

Отдельно я бы посоветовал обратить внимание на S3-совместимые решения, если вы занимаетесь машинным обучением или BigData и у вас есть потребность в хранении большого количества медиаданных для их последующей обработки.

Рассмотренное в статье MinIO – это не единственный достойный инструмент, который позволяет работать с данной технологией. Существуют решения на основе Ceph и Riak CS и даже S3 от Amazon. У всех инструментов свои плюсы и минусы.

Желаю вам успехов в создании и масштабировании ваших приложений и надеюсь, что объектные хранилища вам будут в этом помогать!

Делитесь в комментариях о вашем опыте работы с объектными хранилищами и задавайте вопроы!

MinIO

Высокопроизводительный пакет программно-определяемых объектных хранилищ MinIO позволяет клиентам создавать облачную инфраструктуру данных для машинного обучения, аналитики и рабочих нагрузок данных приложений

Описание

Minio — это популярный сервер хранения объектов с открытым исходным кодом, совместимый с облачным хранилищем Amazon S3.

Особенности Minio

  • MinIO — самый быстрый в мире сервер хранения объектов. Со скоростью чтения / записи 183 ГБ / с и 171 ГБ / с на стандартном оборудовании объектное хранилище может работать в качестве основного уровня хранилища для разнообразного набора рабочих нагрузок, начиная от Spark, Presto, TensorFlow, H2O.ai, а также в качестве замены. для Hadoop HDFS.
  • В MinIO масштабирование начинается с одного кластера, который может быть объединен с другими кластерами MinIO для создания глобального пространства имен, охватывающего несколько центров обработки данных, если это необходимо. Это одна из причин, по которой более половины компаний из списка Fortune 500 используют MinIO.
  • MinIO является полностью открытым исходным кодом под лицензией Apache V2 и Стандартной общественной лицензией Affero версии 3 (AGPLv3). Это означает, что клиенты MinIO свободны от замков, свободны проверять, свободны вводить новшества, свободны изменять и свободно распространять. Разнообразие развертываний сделало программное обеспечение более надежным, чем проприетарное программное обеспечение.
  • API Amazon S3 является стандартом де-факто в мире объектных хранилищ. MinIO — это де-факто стандарт совместимости с S3, он был одним из первых, кто принял API, и первым, кто добавил поддержку S3 Select.
  • MinIO можно установить и настроить за считанные минуты. Количество вариантов конфигурации и вариантов сведено к минимуму, что приводит к почти нулевым задачам системного администрирования и меньшему количеству путей к сбоям.

Настройка сервера хранения объектов с помощью Minio в Ubuntu 18.04

Настройка сервера хранения объектов с помощью Minio в Ubuntu 18.04

От облачных решений для резервного копирования данных до обеспечивающих бесперебойную работу сетей доставки контента (CDN), возможность хранения неструктурированных больших бинарных объектов (blob) с возможностью доступа к этим объектам через HTTP API, известное как хранилище объектов, являются неотъемлемой частью современной технологической среды.

Minio — это популярный сервер хранения объектов с открытым исходным кодом, совместимый с облачным хранилищем Amazon S3. Приложения, которые были настроены для связи с Amazon S3, могут также быть настроены для связи с Minio, что позволяет Minio служить жизнеспособной альтернативой S3, если вам потребуется более эффективный контроль сервера хранилища объектов. Служба может хранить неструктурированные данные, такие как фото, видео, файлы журнала, резервные копии и образы контейнеров/виртуальных машин, и даже может предоставить один сервер хранения объектов, объединяющий в пул множество дисков, размещенных на разных серверах.

Minio написана на языке Go, имеет клиент командной строки и интерфейс браузера и поддерживает простую службу очереди для расширенного протокола организации очереди сообщений (AMQP), Elasticsearch, Redis, NATS, и PostgreSQL. По всем этим причинам знакомство с настройкой сервера хранения объектов Minio может обеспечить большую гибкость и практическую пользу для вашего проекта.

В этом обучающем руководстве вы:

  • Установите сервер Minio на вашем сервере Ubuntu 18.04 и настроите службу systemd .
  • Настроите сертификат SSL/TLS с помощью Let’s Encrypt для безопасной коммуникации между сервером и клиентом.
  • Получите доступ к интерфейсу браузера Minio через HTTPS для использования и администрирования сервера.

Предварительные требования

Для данного обучающего руководства вам потребуется следующее:

  • Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 18.04, включая пользователя sudo без прав root и брандмауэр.
  • Зарегистрированное полное доменное имя. Вы можете приобрести его на Namecheap или получить бесплатно на Freenom. В этом обучающем руководстве ваш домен будет представлен как your_domain ​​​ .
  • Следующие записи DNS, настроенные для вашего сервера Minio. Вы можете воспользоваться нашей документацией для записей DNS, чтобы узнать, как добавлять их в дроплет DigitalOcean.
    • Запись A с именем вашего сервера (например, minio-server.your_domain ), которая указывает на IPv4-адрес вашего сервера объектов.
    • (Опционально) Если вы хотите, чтобы ваш сервер был доступен через IPv6, вам потребуется запись AAAA с именем вашего сервера, указывающая на IPv6-адреса сервера объектов.

    Шаг 1 — Установка и настройка сервера Mino

    Вы можете установить сервер Minio, скомпилировав исходный код или использовав бинарный файл. Чтобы выполнить установку с помощью исходного кода, вам потребуется наличие установленного Go 1.12​​​ в вашей системе.

    На этом шаге вы выполните установку сервера с помощью предварительно скомпилированного бинарного файла, а затем настроите сервер Minio.

    Во-первых, выполните вход на ваш сервер, заменив sammy ​​​ на ваше имя пользователя и your_server_ip ​​​ на IP-адрес вашего сервера Ubuntu 18.04:

    Если вы не обновляли базу данных пакетов за последнее время, обновите ее:

    Затем загрузите бинарный файл сервера Minio с официального веб-сайта:

    Вы получите примерно следующий результат:

    Output
    --2019-08-27 15:08:49-- https://dl.min.io/server/minio/release/linux-amd64/minio Resolving dl.min.io (dl.min.io). 178.128.69.202 Connecting to dl.min.io (dl.min.io)|178.128.69.202|:443. connected. HTTP request sent, awaiting response. 200 OK Length: 44511616 (42M) [application/octet-stream] Saving to: ‘minio’ minio 100%[===================>] 42.45M 21.9MB/s in 1.9s 2019-08-27 15:08:51 (21.9 MB/s) - ‘minio’ saved [44511616/44511616]

    После завершения загрузки файл с именем minio будет находиться в вашей рабочей директории. Используйте следующую команду, чтобы получить исполняемый файл:

    Теперь переместите файл в каталог /usr/local/bin , где скрипт запуска Minio systemd ожидает его найти:

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

    По соображениям безопасности рекомендуется избегать запуска сервера Minio с правами root. Это позволит ограничить ущерб, который может быть нанесен системе при нарушении безопасности. Поскольку скрипт systemd , который вы будете использовать в шаге 2, ищет учетную запись и группу с именем minio-user , создайте нового пользователя с этим именем:

    В этой команде вы использовали флаг -s для настройки /sbin/nologin в качестве оболочки для minio-user . Это оболочка, которая не позволяет пользователю выполнять вход, в чем нет необходимости для minio-user .

    Далее передайте право владения для двоичного файла Minio пользователю minio-user​​​ :

    Затем вам необходимо создать директорию, в которой Minio будет хранить файлы. Это место будет местом хранения бакетов, которые вы будете использовать позднее для организации объектов, которые вы храните на вашем сервере Minio. В этом обучающем модуле будет использоваться имя каталога minio :

    Передайте пользователю minio-user право владения этим каталогом:

    Большинство файлов конфигурации сервера хранятся в каталоге /etc , поэтому именно здесь необходимо создать ваш файл конфигурации:

    Передайте пользователю minio-user право владения этим каталогом:

    Используйте Nano или ваш любимый текстовый редактор для создания файла среды, необходимого для изменения конфигурации по умолчанию:

    После открытия файла добавьте следующие строки, чтобы задать несколько важных переменных среды в файле среды:

    /etc/default/minio

    MINIO_ACCESS_KEY="minio" MINIO_VOLUMES="/usr/local/share/minio/" MINIO_OPTS="-C /etc/minio --address your_server_ip:9000" MINIO_SECRET_KEY="miniostorage" 

    Давайте рассмотрим эти переменные и значения, которые вы задали:

    • MINIO_ACCESS_KEY : данная переменная задает ключ доступа, который вы будете использовать для доступа к пользовательскому интерфейсу браузера Minio.
    • MINIO_SECRET_KEY : данная переменная задает закрытый ключ, который вы будете использовать для передачи учетных данных для входа в интерфейс Minio. В этом обучающем модуле мы будем использовать значение miniostorage , но мы рекомендуем выбрать другой, более сложный пароль для обеспечения безопасности вашего сервера.
    • MINIO_VOLUMES : данная переменная определяет директорию хранения, которую вы создали для ваших бакетов.
    • MINIO_OPTS : эта переменная определяет, где и как сервер обслуживает данные. Флаг -C указывает Minio каталог конфигурации, который следует использовать, а флаг --address указывает IP-адрес и порт для привязки. Если IP-адрес не указан, Minio будет привязываться к любому адресу, заданному на сервере, включая localhost и любые связанные с Docker IP-адреса, поэтому мы рекомендуем напрямую указать IP-адрес здесь. Если хотите, вы можете изменить используемый по умолчанию порт 9000 .

    Сохраните и закройте файл среды после внесения изменений.

    Вы установили Minio и задали значения для ряда важных переменные среды. Далее вам нужно настроить запуск сервера в качестве системной услуги.

    Шаг 2 — Установка скрипта запуска Systemd Minio

    На этом шаге вы настроите сервер Minio для управления им в качестве службы systemd .

    Во-первых, загрузите официальный файл дескриптора службы Minio с помощью следующей команды:

      curl-O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

    Вы получите примерно следующий результат:

    Output
    % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 835 100 835 0 0 6139 0 --:--:-- --:--:-- --:--:-- 6139

    После завершения загрузки файл с именем minio.service будет находиться в вашей рабочей директории.

    Чтобы проверить содержимое файла minio.service перед применением, откройте его в текстовом редакторе:

    В результате вы получите следующий вывод:

    /etc/systemd/system/minio.service

    [Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] WorkingDirectory=/usr/local/ User=minio-user Group=minio-user EnvironmentFile=/etc/default/minio ExecStartPre=/bin/bash -c "if [ -z \"$\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES # Let systemd restart this service always Restart=always # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=65536 # Disable timeout logic and wait until process is stopped TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target # Built for $-$ ($) 

    Этот юнит-файл службы запускает сервер Minio с помощью пользователя minio-user , которого вы создали ранее. Также он имплементирует переменные среды, которые вы задали на последнем шаге, и настраивает автоматический запуск сервера. Дополнительную информацию о юнит-файлах systemd можно найти в нашем руководстве Знакомство с юнитами Systemd и юнит-файлами.

    После изучения содержания скрипта закройте текстовый редактор.

    Systemd требует, чтобы юнит-файлы хранились в каталоге конфигурации systemd , поэтому нужно переместить файл minio.service в этот каталог:

    Затем запустите следующую команду, чтобы перезагрузить все юниты systemd:

    Затем активируйте запуск Minio при загрузке:

    Результат будет выглядеть следующим образом:

    Output
    Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.

    Теперь, когда скрипт systemd установлен и настроен, пришло время для запуска сервера.

    Шаг 3 — Запуск сервера Minio

    На этом шаге вы запустите сервер и измените настройки брандмауэра, чтобы разрешить доступ через интерфейс браузера.

    Запустите сервер Minio:

    Затем проверьте статус Minio, IP-адрес, к которому он привязан, использование памяти и многое другое, воспользовавшись следующей командой:

    Результат будет выглядеть следующим образом:

    Output
    ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-12-09 21:54:02 UTC; 46s ago Docs: https://docs.min.io Process: 3405 ExecStartPre=/bin/bash -c if [ -z "$" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=0/SUCCES Main PID: 3407 (minio) Tasks: 7 (limit: 1152) CGroup: /system.slice/minio.service └─3407 /usr/local/bin/minio server -C /etc/minio --address your_server_IP:9000 /usr/local/share/minio/ Dec 09 21:54:02 cart-Minion-Object-1804-1 systemd[1]: Started MinIO. Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Endpoint: http://your_server_IP:9000 Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Browser Access: Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: http://your_server_IP:9000 .

    Затем активируйте доступ через брандмауэр для сервера Minio на указанном порту. В этом обучающем модуле мы используем порт 9000 .

    Затем активируйте брандмауэр:

    Результат будет выглядеть следующим образом:

    Output
    Command may disrupt existing ssh connections. Proceed with operation (y|n)?

    Нажмите y и ENTER для подтверждения. Вы получите следующий результат:

    Output
    Firewall is active and enabled on system startup

    Теперь Minio готов принимать трафик, но перед подключением к серверу вам нужно защитить коммуникации, установив сертификат SSL/TLS.

    Шаг 4 — Обеспечение защиты доступа к серверу Minio с помощью сертификата TLS

    На этом шаге вы обеспечите безопасность доступа к серверу Minio с помощью закрытого ключа и публичного сертификата, полученного от центра сертификации (CA), в нашем случае это будет Let’s Encrypt​​​. Для получения бесплатного сертификата SSL вы будете использовать Certbot.

    Во-первых, разрешите доступ HTTP и HTTPS через брандмауэр. Для этого откройте порт 80 , используемый для HTTP:

    Затем откройте порт 443 для HTTPS:

    После добавления этих правил проверьте статус брандмауэра с помощью следующей команды:

    Вы получите примерно следующий результат:

    Output
    Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 9000 ALLOW IN Anywhere 443 ALLOW IN Anywhere 80 ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6) 9000 (v6) ALLOW IN Anywhere (v6) 443 (v6) ALLOW IN Anywhere (v6) 80 (v6) ALLOW IN Anywhere (v6)

    Команда подтверждает, что порты 80 и 443 открыты, и гарантирует, что ваш сервер принимает запросы из Интернета.

    Далее вам нужно установить Certbot. Поскольку Certbot использует отдельный репозиторий PPA, вам нужно будет добавить его в список репозиториев перед установкой Certbot, как показано ниже:

    В рамках подготовки к добавлению репозитория PPA необходимо сначала установить software-properties-common , пакет для управления PPA:

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

    Теперь добавьте репозиторий Universe:

    Этот репозиторий содержит бесплатное программное обеспечение с открытым исходным кодом, поддерживаемое сообществом Ubuntu, но официально не поддерживаемое Canonical, разработчиками Ubuntu. Здесь мы найдем репозиторий Certbot.

    Затем необходимо добавить репозиторий Certbot:

    Результат будет выглядеть следующим образом:

    Output
    This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s). More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot Press [ENTER] to continue or ctrl-c to cancel adding it

    Нажмите ENTER , чтобы продолжить.

    Затем обновите список пакетов:

    Теперь вы можете использовать certbot для получения нового сертификата SSL.

    Поскольку Ubuntu 18.04 еще не поддерживает автоматическую установку, вам придется использовать команду certonly и --standalone для получения сертификата:

    --standalone означает, что этот сертификат используется для встроенного автономного веб-сервера. Дополнительную информацию по этому вопросу можно найти в нашем руководстве Использование автономного режима Certbot для получения SSL-сертификатов Let’s Encrypt в Ubuntu 18.04.

    Результат будет выглядеть следующим образом:

    Output
    Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

    Добавьте адрес электронной почты и нажмите ENTER .

    После этого Certbot попросит вас зарегистрироваться с помощью Let’s Encrypt:

    Output
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel:

    Введите A и нажмите ENTER , чтобы согласиться.

    Теперь вам нужно ответить, хотите ли вы поделиться своим адресом электронной почты с Electronic Frontier Foundation:

    Output
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o:

    После того как вы ответите Y или N ​​​, ваши открытый и закрытый ключи будут сгенерированы и сохранены в каталоге /etc/letsencrypt/live/minio-server. your_domain_name .

    Затем скопируйте эти два файла ( privkey.pem и fullchain.pem ) в каталог certs в папке конфигурации сервера Minio. В этом обучающем модуле данная папка имеет адрес /etc/minio . Используйте следующую команду для копирования privkey.pem и переименования файла private.key :

    Выполните те же действия для fullchain.pem , указав для результата имя public.crt​​​ .

    Теперь измените права владения файлов на minio-user . Сначала сделайте это для private.key :

    А затем для public.crt​​​ :

    Перезапустите сервер Minio, чтобы он узнал о сертификате и начал использовать HTTPS:

    Сертификаты Let’s Encrypt действительны только 90 дней. Это сделано для стимулирования пользователей к автоматизации процесса обновления сертификатов. Пакет Certbot, установленный автоматически, добавляет скрипт обновления в директорию /etc/cron.d . Этот скрипт запускается дважды в день и будет автоматически запускать любой сертификат, до истечения срока которого осталось менее 30 дней.

    После этого подключение Minio можно считать защищенным, а ваш сертификат SSL/TLS будет автоматически обновляться. На следующем шаге вы подключитесь к Minio через браузер для использования сервера.

    Шаг 5 — Безопасное подключение к веб-интерфейсу Minio с помощью HTTPS

    На этом шаге вы сможете безопасно подключиться к веб-интерфейсу Minio через HTTPS, а затем создать бакеты и загрузить в них объекты.

    Получите доступ к веб-интерфейсу, указав в адресной строке браузера https://minio-server. your_domain : 9000 .

    Вы увидите экран входа на сервер Minio:

    Экран входа Minio

    Теперь выполните вход в главный интерфейс, введя свои учетные данные. Для Access Key​​​ введите MINIO_ACCESS_KEY​​​ из файла среды /etc/default/ minio в шаге 1. Для Secret Key введите MINIO_SECRET_KEY из того же файла. После ввода учетных данных нажмите круглую кнопку со стрелкой непосредственно под полями для ввода.

    После этого вы попадете в пользовательский интерфейс Minio. Для создания нового бакета, в котором вы будете хранить объекты, нажмите светло-красную кнопку +​​ в правом нижнем углу интерфейса, чтобы отобразить две дополнительные желтые кнопки.

    Главный интерфейс Minio

    Нажмите среднюю желтую кнопку и введите имя вашего нового бакета в окне запроса и нажмите ENTER , чтобы сохранить ваш ответ. Ваш новый бакет готов к использования в качестве хранилища.

    Примечание: когда вы будете называть ваш бакет, убедитесь, что имя содержит только строчные буквы, числа или дефис. Minio ограничивает соглашения по именованию бакетов для соответствия стандартам AWS S3.

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

    К данному моменту вы получили общее представление о базовом веб-интерфейсе для создания бакетов и загрузки объектов.

    Заключение

    Теперь у вас есть собственный сервер для хранения объектов Minio, к которому вы можете безопасно подключиться через веб-интерфейс, используя сертификат Let’s Encrypt SSL/TLS. Также вы можете рассмотреть настольные клиенты Minio для FreeBSD, Linux, Mac и Windows в качестве альтернативного способа использования и администрирования вашего сервера для хранения объектов.

    Если вы хотите увеличить объем хранилища Minio сверх объема дисков вашего сервера, вы можете использовать службу блочного хранилища DigitalOcean для добавления к серверу тома, за счет чего размер хранилища увеличивается (максимум до 80 ТБ).

    Дополнительную информацию о Minio можно найти на сайте с документацией проекта. Если вы хотите узнать больше о хранении объектов, ознакомьтесь с нашими обучающими модулями по хранению объектов.

    Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *