One place for hosting & domains

      хранения

      Использование типа данных MySQL BLOB для хранения изображений с PHP в Ubuntu 18.04


      Автор выбрал Girls Who Code для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Большие двоичные объекты (BLOB) — это тип данных MySQL для хранения двоичных данных, таких как изображения, мультимедийные файлы и файлы PDF.

      При создании приложений, для которых требуются тесно связанные базы данных, где изображения нужно синхронизировать с другими данными (например, портал сотрудников, база данных студентов или финансовое приложение), будет полезно хранить изображения, например, фотографии паспортов и подписей студентов, в базе данных MySQL вместе с другой связанной информацией.

      Для этой цели будет полезен тип данных MySQL BLOB. Такой подход к программированию устраняет необходимость создания отдельной файловой системы для хранения изображений. Такая схема также обеспечивает централизацию базы данных, делая ее более портативной и безопасной за счет изоляции данных от файловой системы. Создавать резервные копии также будет проще, поскольку для этого достаточно будет создать один файл дампа MySQL, где будут храниться все ваши данные.

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

      В этом обучающем модуле мы используем тип данных MySQL BLOB для сохранения изображений в коде PHP в Ubuntu 18.04.

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

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

      Шаг 1 — Создание базы данных

      Для начала создайте тестовую базу данных для своего проекта. Для этого подключитесь к серверу через SSH и запустите следующую команду для входа на сервер MySQL с привилегиями root:

      Введите пароль пользователя root для вашей базы данных MySQL и нажмите ENTER, чтобы продолжить.

      Затем запустите следующую команду для создания базы данных. В этом обучающем модуле мы назовем базу данных test_company:

      • CREATE DATABASE test_company;

      После создания базы данных вы увидите следующее:

      Output

      Query OK, 1 row affected (0.01 sec)

      Затем создайте учетную запись test_user на сервере MySQL и обязательно замените PASSWORD на надежный пароль:

      • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Вывод должен выглядеть так:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, выполните команду:

      • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

      Вы должны увидеть следующее:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Очистите таблицу прав доступа, чтобы СУБД MySQL перезагрузила разрешения:

      На экран должно быть выведено следующее:

      Output

      Query OK, 0 rows affected (0.01 sec)

      Мы подготовили базу данных test_company и пользователя test_user. Теперь мы можем перейти к созданию таблицы products для сохранения образцов продуктов. Позднее мы используем эту таблицу для вставки и получения записей, чтобы продемонстрировать работу объектов MySQL BLOB.

      Выполните выход из сервера MySQL:

      Снова войдите в систему под учетными данными созданного пользователя test_user:

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

      После выбора базы данных test_company MySQL выведет на экран следующее:

      Output

      Database changed

      Затем создайте таблицу products, запустив команду:

      • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

      Эта команда создает таблицу с именем products. В таблице имеется четыре столбца:

      • product_id: в этом столбце используется тип данных BIGINT, за счет чего обеспечивается поддержка больших списков продуктов, где может содержаться до 2⁶³-1 элементов. Вы пометили столбец как PRIMARY KEY для уникальной идентификации продуктов. Чтобы MySQL обрабатывала генерирование новых идентификаторов для вставленных столбцов, вы использовали ключевое слово AUTO_INCREMENT.

      • product_name: в этом столбце хранятся названия продуктов. Мы использовали тип данных VARCHAR, поскольку это поле обычно обрабатывает не более 50 бувенно-числовых символов. Предел в 50 символов — это гипотетическое значение, используемое для целей этого обучающего модуля.

      • price: для демонстрационных целей мы добавили в таблицу products столбец price для хранения информации о розничной цене продуктов. Поскольку некоторые продукты могут иметь значения с плавающей запятой (например, 23.69, 45.36, 102.99), мы использовали тип данных DOUBLE.

      • product_image: в этом столбце данные типа BLOB используются для хранения двоичных данных изображений продуктов.

      Мы использовали для таблицы InnoDB, СИСТЕМУ ХРАНЕНИЯ, поддерживающую широкий набор функций, включая транзакции MySQL. После выполнения этой команды для создания таблицы products вы увидите на экране следующее:

      Output

      Query OK, 0 rows affected (0.03 sec)

      Выполните выход с сервера MySQL:

      Вы увидите следующее

      Output

      Bye

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

      Шаг 2 — Создание скриптов PHP для подключения к базе данных и ее заполнения

      На этом шаге мы создадим скрипт PHP для подключения к базе данных MySQL, созданной нами на шаге 1. Этот скрипт подготовит три образца продуктов и вставит их в таблицу products.

      Для создания кода PHP откройте новый файл в текстовом редакторе:

      • sudo nano /var/www/html/config.php

      Введите в файл следующую информацию и замените PASSWORD паролем пользователя test_user, созданным на шаге 1:

      /var/www/html/config.php

      <?php
      
      define('DB_NAME', 'test_company');
      define('DB_USER', 'test_user');
      define('DB_PASSWORD', 'PASSWORD');
      define('DB_HOST', 'localhost');
      
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      
      

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

      В этом файле мы использовали четыре константы PHP для подключения к базе данных MySQL, созданной на шаге 1:

      • DB_NAME : эта константа хранит название базы данных test_company.

      • DB_USER : эта переменная хранит имя пользователя test_user.

      • DB_PASSWORD : эта константа хранит ПАРОЛЬ MySQL для учетной записи test_user.

      • DB_HOST: сервер, где располагается база данных. В данном случае мы используем сервер localhost.

      Следующая строка в вашем файле инициирует объект данных PHP (PDO) и выполняет подключение к базе данных MySQL:

      ...
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      ...
      

      Ближе к концу файла мы зададим пару атрибутов PDO:

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: этот атрибут предписывает PDO выдать исключение, которое можно зарегистрировать для целей отладки.
      • ATTR_EMULATE_PREPARES, false: эта опция повышает безопасности, предписывая СУБД MySQL выполнять подготовку вместо PDO.

      Мы добавим файл /var/www/html/config.php в два скрипта PHP для вставки и получения записей, которые мы сейчас создадим.

      Вначале создайте скрипт PHP /var/www/html/insert_products.php для вставки записей в таблицу products:

      • sudo nano /var/www/html/insert_products.php

      Затем добавьте следующую информацию в файл /var/www/html/insert_products.php:

      /var/www/html/insert_products.php

      <?php
      
      require_once 'config.php';
      
      $products = [];
      
      $products[] = [
                    'product_name' => 'VIRTUAL SERVERS',
                    'price' => 5,
                    'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MANAGED KUBERNETES',
                    'price' => 30,
                    'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MySQL DATABASES',
                    'price' => 15,
                    'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
                    ];
      
      $sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";
      
      foreach ($products as $product) {
          $stmt = $pdo->prepare($sql);
          $stmt->execute($product);
      }
      
      echo "Records inserted successfully";
      

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

      Вы добавили файл config.php в верхней части файла. Это первый файл, который вы создали для определения переменных базы данных и подключения к базе данных. Также этот файл инициирует объект PDO и сохраняет его в переменной $pdo.

      Далее вы создали массив данных о продуктах, которые нужно вставить в базу данных. Помимо значений product_name и price, подготовленных в виде текстовых и числовых значений соответственно, данный скрипт использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

      Затем вы подготовили выражение SQL и использовали выражение PHP foreach{...} для вставки каждого продукта в базу данных.

      Для выполнения файла /var/www/html/insert_products.php запустите его в окне браузера, используя следующий URL. Замените your-server-IP публичным IP-адресом вашего сервера:

      http://your-server-IP/insert_products.php
      

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

      Сообщение об успешной вставке записей в базу данных

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

      Шаг 3 — Отображение информации о продуктах из базы данных MySQL

      Мы разместили в базе данных информацию о продуктах и их ихображения. Теперь мы создадим еще один скрипт PHP, который будет запрашивать и выводить информацию о продуктах в таблице HTML в браузере.

      Для создания файла введите следующее:

      • sudo nano /var/www/html/display_products.php

      Затем введите в файл следующую информацию:

      /var/www/html/display_products.php

      <html>
        <title>Using BLOB and MySQL</title>
        <body>
      
        <?php
      
        require_once 'config.php';
      
        $sql = "SELECT * FROM products";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        ?>
      
        <table border="1" align = 'center'> <caption>Products Database</caption>
          <tr>
            <th>Product Id</th>
            <th>Product Name</th>
            <th>Price</th>
            <th>Product Image</th>
          </tr>
      
        <?php
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo '<tr>';
            echo '<td>' . $row['product_id'] . '</td>';
            echo '<td>' . $row['product_name'] . '</td>';
            echo '<td>' . $row['price'] . '</td>';
            echo '<td>' .
            '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
            . '</td>';
            echo '</tr>';
        }
        ?>
      
        </table>
        </body>
      </html>
      

      Сохраните изменения в файле и закройте его.

      Здесь мы опять использовали файл config.php для подключения к базе данных. Затем мы подготовили и выполнили команду SQL, используя PDO для извлечения всех элементов из таблицы products с помощью команды SELECT * FROM products.

      Затем мы создали таблицу HTML и заполнили ее данными о продуктах, используя выражение PHP while() {...}. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) отправляет запрос в базу данных и сохраняет результат в переменной $row как многомерный массив, который затем отображается как столбец таблицы HTML с использованием синтаксиса $row['column_name'].

      Изображения из столбца product_image заключены в теги <img src = "">. Мы использовали атрибуты width и height для уменьшения ширины и высоты изображений, чтобы они поместились в столбце таблицы HTML.

      Чтобы конвертировать данные, хранящиеся в объекте типа BLOB, обратно в изображения, мы использовали встроенную функцию PHP base64_encode и следующий синтаксис схемы URI данных:

      data:media_type;base64, base_64_encoded_data
      

      В данном случае image/png — это значение параметра media_type (тип файла), а закодированная строка Base64 из столбца product_image — это данные base_64_encoded_data.

      Выполните в браузере файл display_products.php, введя следующий адрес:

      http://your-server-IP/display_products.php
      

      Запустив в браузере файл display_products.php, вы увидите таблицу HTML со списком продуктов и связанных с ними изображений.

      Список продуктов из базы данных MySQL

      Это подтверждает, что скрипт PHP для извлечения изображений из базы данных MySQL работает ожидаемым образом.

      Заключение

      В этом обучающем модуле мы использовали тип данных MySQL BLOB для хранения и вывода изображений в коде PHP в Ubuntu 18.04. Мы увидели основные преимущества хранения изображений в базе данных по сравнению с их хранением в файловой системе. В число этих преимуществ входят портативность, безопасность и удобство резервного копирования. Эта технология будет вам полезна, если вы создаете приложение, для которого требуется хранить информацию и изображения вместе, например, студенческий портал или базу данных сотрудников.

      Дополнительную информацию о поддерживаемых типах данных в MySQL можно найти в руководстве по типам данных MySQL. Если вас интересуют дополнительные материалы по MySQL и PHP, пройдите следующие обучающие модули:



      Source link

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


      Автор выбрал фонд Open Internet/Free Speech для получения пожертвования в рамках программы Write for DOnations.

      Введение

      От облачных решений для резервного копирования данных до обеспечивающих бесперебойную работу сетей доставки контента (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 с официального веб-сайта:

      • wget https://dl.min.io/server/minio/release/linux-amd64/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 ожидает его найти:

      • sudo mv minio /usr/local/bin

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

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

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

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

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

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

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

      • sudo mkdir /usr/local/share/minio

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

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

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

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

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

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

      • sudo nano /etc/default/minio

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

      /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 "${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 и юнит-файлами.

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

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

      • sudo mv minio.service /etc/systemd/system

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

      • sudo systemctl daemon-reload

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

      • sudo systemctl enable minio

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

      Output

      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

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

      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 "${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 на указанном порту. В этом обучающем модуле мы используем порт 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:

      • 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

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

      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:

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

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

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

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

      • 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

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

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

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

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

      Экран входа 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 можно найти на сайте с документацией проекта. Если вы хотите узнать больше о хранении объектов, ознакомьтесь с нашими обучающими модулями по хранению объектов.



      Source link