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

Хранилища объектов – средства хранения неструктурированных фрагментов данных, которые позволяют получить к ним доступ по HTTP API – стали неотъемлемой частью современных технологий.

Читайте также: Ускорение доставки статического контента с помощью CDN

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

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

Данный мануал научит вас:

  • Устанавливать Minio на сервер Ubuntu 18.04 и настраивать его как сервис systemd (читайте мануал Основы Systemd: управление сервисами и журналирование).
  • Создавать сертификаты SSL/TLS от Let’s Encrypt для защиты взаимодействия между сервером и клиентом.
  • Работать с сервером и управлять им с помощью интерфейса браузера Minio по HTTPS.

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу.
  • FRDN (в этом мануале мы будем использовать условный домен your_domain).
  • DNS-запись А для minio-server.your_domain, направленная на адрес IPv4 хранилища объектов.
    • Опционально: если вы хотите, чтобы к хранилищу был доступ по IPv6, создайте аналогичную запись АААА.

1: Установка и настройка сервера Minio

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

Мы установим сервер через предварительно скомпилированный двоичный файл, а затем настроим наш сервер Minio.

Сначала войдите на свой виртуальный сервер. Вместо 8host укажите имя вашего пользователя, а вместо your_server_ip IP-адрес вашего сервера Ubuntu 18.04:

ssh 8host@your_server_ip

Если вы давно не обновляли индекс пакетов, обновите его сейчас:

sudo apt update

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

wget https://dl.min.io/server/minio/release/linux-amd64/minio

Вы получите подобный вывод:

--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. Используйте следующую команду, чтобы сделать файл исполняемым:

sudo chmod +x minio

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

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

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

sudo useradd -r minio-user -s /sbin/nologin

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

Затем измените владельца двоичного файла Minio, передав права собственности пользователю minio:

sudo chown minio-user:minio-user /usr/local/bin/minio

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

sudo mkdir /usr/local/share/minio

Передайте права собственности на этот каталог пользователю minio:

sudo chown minio-user:minio-user /usr/local/share/minio

Большинство конфигурационных файлов сервера хранятся в каталоге /etc. Создайте в нем конфигурационный файл Minio:

sudo mkdir /etc/minio

Сделайте пользователя minio-user владельцем этого файла.

sudo chown minio-user:minio-user /etc/minio

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

sudo 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-адрес и порт, к которым привяжется Minio. Если IP-адрес не указан, Minio привяжется к каждому адресу на сервере, включая localhost и все IP-адреса, связанные с Docker. Поэтому здесь рекомендуется все же указать конкретный IP-адрес. Порт по умолчанию 9000 можно изменить, если хотите.

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

Итак, вы установили Minio и настроили важные переменные среды. Далее мы создадим системный сервис для этого сервера.

2: Создание сервиса systemd для Minio

На этом этапе мы настроим сервис systemd для управления сервером Minio.

Сначала загрузите официальный файл сервиса Minio, используя следующую команду:

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

Вы получите такой вывод:

% 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 перед его использованием, откройте его в текстовом редакторе и просмотрите его содержимое:

nano 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 \"${MINIO_VOLUMES}\" ]; 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 ${project.name}-${project.version} (${project.name})

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

После просмотра сценария закройте текстовый редактор.

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

sudo mv minio.service /etc/systemd/system

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

sudo systemctl daemon-reload

Теперь включите сервис Minio, чтобы добавить его в автозагрузку:

sudo systemctl enable minio

Появится следующий вывод:

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

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

3: Запуск сервера Minio

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

Сначала запустите сервер Minio:

sudo systemctl start minio

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

sudo systemctl status minio

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

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 "${MINIO_VOLUMES}" ]; 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  в брандмауэре. Добавьте такое правило:

sudo ufw allow 9000

Включите брандмауэр:

sudo ufw enable

Вы получите такой вывод:

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

Нажмите y и Enter, чтобы согласиться. Затем вы получите следующий вывод:

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:

sudo ufw allow 80

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

sudo ufw allow 443

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

sudo ufw status verbose

Вы получите такой вывод:

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, вам сначала нужно добавить его в свой список репозиториев.

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

sudo apt install software-properties-common

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

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

sudo add-apt-repository universe

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

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

sudo add-apt-repository ppa:certbot/certbot

Вы получите:

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, чтобы продолжить.

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

sudo apt update

И установите certbot:

sudo apt install certbot

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

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

sudo certbot certonly --standalone -d minio-server.your_domain

Опция —standalone означает, что этот сертификат предназначен для встроенного автономного веб-сервера.

Читайте также: Автоматическое извлечение SSL-сертификатов Let’s Encrypt с помощью Certbot в Ubuntu 18.04

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

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:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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, чтобы согласиться.

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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:

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

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

sudo cp /etc/letsencrypt/live/minio-server.your_domain_name/privkey.pem /etc/minio/certs/private.key

Затем сделайте то же самое для fullchain.pem, назвав новый файл public.crt:

sudo cp /etc/letsencrypt/live/minio-server.your_domain_name/fullchain.pem /etc/minio/certs/public.crt

Теперь сделайте владельцем файлов private.key и public.crt пользователя minio-user:

sudo chown minio-user:minio-user /etc/minio/certs/private.key
sudo chown minio-user:minio-user /etc/minio/certs/public.crt

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

sudo systemctl restart minio

Сертификаты 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.

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

Затем вам будет предоставлен пользовательский интерфейс Minio. Чтобы создать новую корзину, в которой вы сможете хранить объекты, нажмите красную кнопку + в правом нижнем углу интерфейса, это вызовет две дополнительные желтые кнопки.

Нажмите кнопку Create bucket и введите название новой корзины в диалоговое окно, затем нажмите Enter, чтобы сохранить свой ответ. Теперь у вас есть корзина для хранения объектов.

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

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

Заключение

Теперь у вас есть собственный сервер для хранения объектов Minio, к которому вы можете подключиться по защищенному соединению через веб-интерфейс. При желании вы можете рассмотреть возможность использования настольных клиентов Minio для FreeBSD, Linux, Mac и Windows в качестве альтернативного способа управления хранилищем объектов.

Более подробную информацию о Minio можно найти в документации проекта.

Tags: , , ,