446 lines
55 KiB
HTML
446 lines
55 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
|
||
<head>
|
||
<title>Кластер MinIO</title>
|
||
<meta name="generator" content="Help+Manual" />
|
||
<meta name="keywords" content="" />
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="description" content="В статье рассматривается пример развёртывания MinIO в качестве объектного хранилища S3 для программного комплекса ELMA365." />
|
||
<meta name="picture" content="" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:title" content="Cправка по Low-code платформе ELMA365" />
|
||
<meta property="og:url" content="https://elma365.com/ru/help" />
|
||
<meta property="og:image" content="" />
|
||
<meta property="og:site_name" content="ELMA365" />
|
||
<link rel="icon" href="favicon.png" type="image/png" />
|
||
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
||
<link rel="stylesheet" href="./jquery-ui.min.css" />
|
||
<link rel="stylesheet" href="default.css" />
|
||
<link rel="stylesheet" href="./search-yandex.css" />
|
||
<link rel="stylesheet" href="./article.css" />
|
||
<link rel="stylesheet" href="./glossary.css" />
|
||
<link rel="stylesheet" href="./theme.css" />
|
||
|
||
<script type="text/javascript" src="jquery.js"></script>
|
||
<script type="text/javascript" src="helpman_settings.js"></script>
|
||
<script type="text/javascript" src="helpman_topicinit.js"></script>
|
||
|
||
<script type="text/javascript" src="highlight.js"></script>
|
||
<script type="text/javascript">
|
||
$(document).ready(function(){highlight();});
|
||
</script>
|
||
</head>
|
||
|
||
<body>
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-M6ETBEC1R9"></script><script>window.dataLayer=window.dataLayer || []; function gtag(){dataLayer.push(arguments);}gtag('js', new Date()); gtag('config', 'G-M6ETBEC1R9');</script>
|
||
<script>!function(e,t,c,n,r,a,m){e.ym=e.ym||function(){(e.ym.a=e.ym.a||[]).push(arguments)},e.ym.l=1*new Date;for(var s=0;s<document.scripts.length;s++)if(document.scripts[s].src===n)return;a=t.createElement(c),m=t.getElementsByTagName(c)[0],a.async=1,a.src=n,m.parentNode.insertBefore(a,m)}(window,document,"script","https://mc.yandex.ru/metrika/tag.js"),ym(83179930,"init",{clickmap:!0,trackLinks:!0,accurateTrackBounce:!0,webvisor:!0})</script><noscript><div><img alt=""src=https://mc.yandex.ru/watch/83179930 style=position:absolute;left:-9999px></div></noscript>
|
||
|
||
<header class="header elma-365">
|
||
<div class="container">
|
||
<a class="header__logo" href="https://elma365.com/ru/help">
|
||
<img src="./logo.svg" alt="header logo">
|
||
</a>
|
||
<!-- <div class="hero__search-form" id="search-panel">
|
||
<form class="search-form" onsubmit="ym(83179930,'reachGoal','poisk')">
|
||
<label class="search-form__label">
|
||
<span id="reset-search" class="search__icon"></span>
|
||
<input class="search-form__input" type="text">
|
||
</label>
|
||
<input class="search-form__submit" type="submit" value="Submit">
|
||
</form>
|
||
</div> -->
|
||
|
||
<div class="hero__search-form" id="search-panel"> <form class="search-form"> <label class="search-form__label"> <span id="reset-search" class="search__icon"></span> <input class="search-form__input" type="text"> </label> <input class="search-form__submit" type="submit" value="Submit"> </form> </div>
|
||
<div class="hero__search">
|
||
<a href="#" id="search-icon" class="hero__search-icon">
|
||
<img src="search-icon-white.svg" alt="search string">
|
||
</a>
|
||
<a href="#" id="side-menu-icon" class="hero__side-icon">
|
||
<img src="side_menu.svg" alt="side menu">
|
||
</a>
|
||
</div>
|
||
<div class="header__navi">
|
||
|
||
<ul class="header__list"><li><span class="solution-select"><span class="solution-select__selected"></span><svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L3.5 3.5L6 1" stroke="white" stroke-linecap="round" stroke-linejoin="round"/></svg><ul class="solution-select__list"><li><a class="project-link" href="https://elma365.com/ru/help/platform/get-trial.html">Платформа</a></li><li><a class="project-link" href="https://elma365.com/ru/help/ecm/ecm-functions.html">ECM</a></li><li><a class="project-link" href="https://elma365.com/ru/help/crm/crm_overview.html">CRM</a></li><li><a class="project-link" href="https://elma365.com/ru/help/service/service-functions.html">Service</a></li><li><a class="project-link" href="https://elma365.com/ru/help/projects/projects-functions.html">Проекты</a></li><li><a class="project-link" href="https://elma365.com/ru/help/business_solutions/-elma365-store.html">Бизнес-решения</a></li></ul></span></li><li><a href="https://api.elma365.com/ru/"target="_blank">API</a></li><li><a href="https://tssdk.elma365.com/"target="_blank">SDK</a></li><li><a href="https://community.elma365.com/" target="_blank">Community</a></li><li><a href="https://elma-academy.com/ru/" target="_blank">Академия</a></li><li><a href="https://elma365.com/ru/" target="_blank">Сайт ELMA365</a></li></ul>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</header>
|
||
|
||
|
||
|
||
|
||
<main class="main container">
|
||
|
||
<aside class="sidebar" id="sidebar">
|
||
<div class="sidebar__header">
|
||
<a class="header__logo" href="https://elma365.com/ru/help">
|
||
<img src="./logo-light.svg">
|
||
</a>
|
||
<span class="sidebar__close elma-365-close" id="close"></span>
|
||
</div>
|
||
<div class="sidebar__wrapper" id="side-menu">
|
||
|
||
</div>
|
||
</aside>
|
||
|
||
<article class="article" id="article">
|
||
<div class="article-inner">
|
||
<div class="content">
|
||
<header class="article__header">
|
||
<div class="article__bread" style="display:flex; gap:10px;">
|
||
<span id="subcategory" class="search-res__item-category search-res__item-category_subcategory subcategory article__badge"></span>
|
||
|
||
<div class="topic__breadcrumbs">
|
||
<p><a href="elma365-on-premises.html">ELMA365 On-Premises</a> > <a href="infrastructure-preparation.html">Подготовка инфраструктуры</a> > Базы данных > Отказоустойчивая инфраструктура / Кластер MinIO</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Кластер MinIO</span></h1>
|
||
</div>
|
||
|
||
</header>
|
||
<section class="article__content">
|
||
<div class="scroll-top-inner">
|
||
<a href="#h1-article" class="scroll-top"></a>
|
||
</div>
|
||
<!-- Placeholder for topic body. -->
|
||
<p class="p_Normal">В статье рассматривается пример развёртывания MinIO в качестве объектного хранилища S3 для программного комплекса ELMA365.</p>
|
||
<p class="p_Normal">Рекомендуемой топологией MinIO для ELMA365 является <a href="https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html" target="_blank" class="weblink">Multi-Node Multi-Drive</a> (MNMD) или Distributed/Распределённая конфигурация.</p>
|
||
<p class="p_Normal">MinIO в конфигурации MNMD поддерживает <a href="https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html#minio-ec-parity" target="_blank" class="weblink">erasure coding</a>. Это позволяет допустить потерю до половины узлов или дисков в кластере, при этом продолжая обслуживать операции чтения. Используйте калькулятор <a href="https://min.io/product/erasure-code-calculator?ref=docs" target="_blank" class="weblink">Erasure Code Calculator</a> при планировании и проектировании кластера MinIO.</p>
|
||
<p class="p_Normal">Минимальная конфигурация MNMD, поддерживающая <a href="https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html#minio-ec-parity" target="_blank" class="weblink">erasure coding</a>, состоит из четырёх нод (серверов) по четыре диска в каждой. Соберите ноды в один <span style="font-weight: bold;">server pool</span>, при этом в MinIO нужно: </p>
|
||
<ul style="">
|
||
<li class="p_Normal">использовать последовательно пронумерованные имена хостов;</li><li class="p_Normal">использовать нотации расширения <code><b>{x...y}</b></code> для обозначения последовательного ряда хостов при создании пула серверов; </li><li class="p_Normal">использовать нотации расширения <code><b>{x...y}</b></code> для обозначения последовательного ряда дисков; </li><li class="p_Normal">чтобы порядок физических дисков оставался постоянным при перезапусках, чтобы заданная точка монтирования всегда указывала на один и тот же отформатированный диск.</li></ul>
|
||
<p class="p_Normal">Установка состоит из нескольких этапов:</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" class="p_Normal"><a href="minio-cluster.html#preparation-node" class="topiclink">Подготовка нод (серверов)</a>.</li><li value="2" class="p_Normal"><a href="minio-cluster.html#preparation-disk" class="topiclink">Подготовка дисков</a>.</li><li value="3" class="p_Normal"><a href="minio-cluster.html#installation-minlo" class="topiclink">Установка MinIO</a>.</li><li value="4" class="p_Normal"><a href="minio-cluster.html#installation-minlo-client" class="topiclink">Установка MinIO Client</a>.</li><li value="5" class="p_Normal"><a href="minio-cluster.html#creation-user-group" class="topiclink">Создание пользователя и группы minio-user</a>.</li><li value="6" class="p_Normal"><a href="minio-cluster.html#creation-file-systemd" class="topiclink">Создание файла сервиса для systemd</a>.</li><li value="7" class="p_Normal"><a href="minio-cluster.html#creation-file-minlo" class="topiclink">Создание файла окружения для MinIO</a>.</li><li value="8" class="p_Normal"><a href="minio-cluster.html#service-start-minlo" class="topiclink">Запуск сервиса MinIO</a>.</li><li value="9" class="p_Normal"><a href="minio-cluster.html#connection-setup-minlo" class="topiclink">Настройка подключения к MinIO</a>.</li><li value="10" class="p_Normal"><a href="minio-cluster.html#creation-bucket" class="topiclink">Создание бакета</a>.</li><li value="11" class="p_Normal"><a href="minio-cluster.html#cors" class="topiclink">Настройка CORS</a>.</li><li value="12" class="p_Normal"><a href="minio-cluster.html#config-haproxy" class="topiclink">Конфигурация HAProxy (блок s3minio)</a>.</li><li value="13" class="p_Normal"><a href="minio-cluster.html#connection" class="topiclink">Подключение к MinIO в ELMA365</a>.</li></ol>
|
||
<h2 class="p_Heading2"><a id="preparation-node" class="hmanchor"></a><span class="f_Heading2">Шаг 1. Подготовка нод (серверов) </span></h2>
|
||
<p class="p_Normal">Создайте четыре ноды (сервера) с последовательно пронумерованными именами хостов:</p>
|
||
<ul style="">
|
||
<li class="p_Normal"><span style="font-weight: bold;">minio1.example.com</span>;</li><li class="p_Normal"><span style="font-weight: bold;">minio2.example.com</span>;</li><li class="p_Normal"><span style="font-weight: bold;">minio3.example.com</span>;</li><li class="p_Normal"><span style="font-weight: bold;">minio4.example.com</span>. </li></ul>
|
||
<p class="p_Normal">Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в <code><b>/etc/hosts</b></code>.</p>
|
||
<h2 class="p_Heading2"><a id="preparation-disk" class="hmanchor"></a><span class="f_Heading2">Шаг 2. Подготовка дисков</span></h2>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" class="p_Normal">На каждой ноде создайте четыре каталога для монтирования четырёх дисков:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo mkdir -p /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data1</span><br />
|
||
<span class="f_CodeExample">sudo mkdir -p /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data2</span><br />
|
||
<span class="f_CodeExample">sudo mkdir -p /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data3</span><br />
|
||
<span class="f_CodeExample">sudo mkdir -p /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data4</span></p>
|
||
<p class="p_Normal">Для обеспечения лучшей производительности используйте файловую систему XFS. В MinIO не различаются типы дисков и не используются смешанные типы хранилищ, поэтому на всех нодах должен использоваться одинаковый тип дисков (NVMe, SSD или HDD) с одинаковой ёмкостью, например, N ТБ. </p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Начало внимание </span></p>
|
||
<p class="p_Normal">В MinIO ограничивается размер используемого диска до самого маленького диска в развёртывании. Например, если в развёртывании есть 15 дисков по 10 ТБ и 1 диск по 1 ТБ, в MinIO ёмкость каждого диска ограничится до 1 ТБ.</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Конец внимание</span></p>
|
||
<ol style="list-style-type:upper-roman" start="2">
|
||
<li value="2" class="p_Normal">На каждой ноде подготовьте на дисках файловую систему XFS:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo mkfs.xfs /dev/sdb -L DISK1</span><br />
|
||
<span class="f_CodeExample">sudo mkfs.xfs /dev/sdc -L DISK2</span><br />
|
||
<span class="f_CodeExample">sudo mkfs.xfs /dev/sdd -L DISK3</span><br />
|
||
<span class="f_CodeExample">sudo mkfs.xfs /dev/sde -L DISK4</span></p>
|
||
<ol style="list-style-type:upper-roman" start="3">
|
||
<li value="3" class="p_Normal">На каждой ноде добавьте точки монтирования четырёх дисков в файле <code><b>/etc/fstab</b></code>:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">LABEL=DISK1 /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data1 xfs defaults,noatime 0 2</span><br />
|
||
<span class="f_CodeExample">LABEL=DISK2 /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data2 xfs defaults,noatime 0 2</span><br />
|
||
<span class="f_CodeExample">LABEL=DISK3 /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data3 xfs defaults,noatime 0 2</span><br />
|
||
<span class="f_CodeExample">LABEL=DISK4 /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio/data4 xfs defaults,noatime 0 2</span></p>
|
||
<ol style="list-style-type:upper-roman" start="4">
|
||
<li value="4" class="p_Normal">Проверьте монтирование ранее подготовленных дисков:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo mount -av</span></p>
|
||
<h2 class="p_Heading2"><a id="installation-minlo" class="hmanchor"></a><span class="f_Heading2">Шаг 3. Установка MinIO</span></h2>
|
||
<p class="p_Normal">На каждой ноде загрузите последний стабильный binary-файл MinIO и установите его в систему:</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">wget </span><span class="f_CodeExample">https://dl.min.io/server/minio/release/linux-amd64/minio</span><br />
|
||
<span class="f_CodeExample">chmod +x minio</span><br />
|
||
<span class="f_CodeExample">sudo mv minio /usr/local/bin/</span></p>
|
||
<h2 class="p_Heading2"><a id="installation-minlo-client" class="hmanchor"></a><span class="f_Heading2">Шаг 4. Установка MinIO Client</span></h2>
|
||
<p class="p_Normal">На ноде <span style="font-weight: bold;">minio1.example.com</span> загрузите последний стабильный binary-файл <a href="https://min.io/docs/minio/linux/reference/minio-mc.html" target="_blank" class="weblink">MinIO Client</a> и установите его в систему:</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">wget https://dl.min.io/client/mc/release/linux-amd64/mc</span><br />
|
||
<span class="f_CodeExample">chmod +x mc</span><br />
|
||
<span class="f_CodeExample">sudo mv mc /usr/local/bin/</span></p>
|
||
<h2 class="p_Heading2"><a id="creation-user-group" class="hmanchor"></a><span class="f_Heading2">Шаг 5. Создание пользователя и группы minio-user</span></h2>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" class="p_Normal">На каждой ноде создайте пользователя и группу <span style="font-weight: bold;">minio-user</span>:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo groupadd -r minio-user</span><br />
|
||
<span class="f_CodeExample">sudo useradd -M -r -g minio-user minio-user</span></p>
|
||
<ol style="list-style-type:upper-roman" start="2">
|
||
<li value="2" class="p_Normal">На каждой ноде cоздайте директории для хранения TLS сертификатов, выполнив команду:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo mkdir -p /etc/minio/certs/CAs</span></p>
|
||
<ol style="list-style-type:upper-roman" start="3">
|
||
<li value="3" class="p_Normal">На каждой ноде задайте разрешения на доступ к каталогам, предназначенным для использования в MinIO:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo chown -R minio-user:minio-user /etc/minio</span><br />
|
||
<span class="f_CodeExample">sudo chown -R minio-user:minio-user /</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/minio</span></p>
|
||
<h2 class="p_Heading2"><a id="creation-file-systemd" class="hmanchor"></a><span class="f_Heading2">Шаг 6. Создание файла сервиса для systemd</span></h2>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" class="p_Normal">На каждой ноде загрузите официальный файл сервиса MinIO:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service</span></p>
|
||
<ol style="list-style-type:upper-roman" start="2">
|
||
<li value="2" class="p_Normal">Проверьте содержимое <code><b>minio.service</b></code> перед его использованием и переместите этот файл в каталог конфигурации <code><b>systemd</b></code>:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo mv minio.service /etc/systemd/system</span></p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Начало внимание </span></p>
|
||
<p class="p_Normal">На этом шаге не запускайте <code><b>minio.service</b></code>. </p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Конец внимание </span></p>
|
||
<h2 class="p_Heading2"><a id="creation-file-minlo" class="hmanchor"></a><span class="f_Heading2">Шаг 7. Создание файла окружения для MinIO</span></h2>
|
||
<p class="p_Normal">На каждой ноде создайте файл окружения в <code><b>/etc/default/minio</b></code>. Служба MinIO использует этот файл в качестве источника всех переменных окружения, используемых MinIO и файлом <code><b>minio.service</b></code>. </p>
|
||
<p class="p_Normal">Пример файла окружения в <code><b>/etc/default/minio</b></code>: </p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample"># Set the hosts and volumes MinIO uses at startup</span><br />
|
||
<span class="f_CodeExample"># The command uses MinIO expansion notation {x...y} to denote a</span><br />
|
||
<span class="f_CodeExample"># sequential series.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># The following example covers four MinIO hosts</span><br />
|
||
<span class="f_CodeExample"># with4 drives each at the specified hostname and drive locations.</span><br />
|
||
<span class="f_CodeExample"># The command includes the port that each MinIO server listens on</span><br />
|
||
<span class="f_CodeExample"># (</span><span class="f_CodeExample" style="font-weight: bold;">default</span><span class="f_CodeExample"> 9000)</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">MINIO_VOLUMES="http://minio-server{1...4}.your_domain:9000/var/lib/minio/data{1...4}/minio"</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Set all MinIO server options</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># The following explicitly sets the MinIO Console listen address to</span><br />
|
||
<span class="f_CodeExample"># port 9001 on all network interfaces. The </span><span class="f_CodeExample" style="font-weight: bold;">default</span><span class="f_CodeExample"> behavior is dynamic</span><br />
|
||
<span class="f_CodeExample"># port selection.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">MINIO_OPTS="--certs-dir /etc/minio/certs --console-address :9001"</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">MINIO_REGION="ru-central-1"</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Set the root username. This user has unrestricted permissions to</span><br />
|
||
<span class="f_CodeExample"># perform S3 and administrative API operations on any resource </span><span class="f_CodeExample" style="font-weight: bold;">in</span><span class="f_CodeExample"> the</span><br />
|
||
<span class="f_CodeExample"># deployment.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Defer to your organizations requirements </span><span class="f_CodeExample" style="font-weight: bold;">for</span><span class="f_CodeExample"> superadmin user name.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">MINIO_ROOT_USER=elma365user</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Set the root password</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Use a </span><span class="f_CodeExample" style="font-weight: bold;">long</span><span class="f_CodeExample">, random, unique string that meets your organizations</span><br />
|
||
<span class="f_CodeExample"># requirements </span><span class="f_CodeExample" style="font-weight: bold;">for</span><span class="f_CodeExample"> passwords.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">MINIO_ROOT_PASSWORD=SecretPassword</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># Set to the URL of the load balancer </span><span class="f_CodeExample" style="font-weight: bold;">for</span><span class="f_CodeExample"> the MinIO deployment</span><br />
|
||
<span class="f_CodeExample"># This value *must* match across all MinIO servers. If you </span><span class="f_CodeExample" style="font-weight: bold;">do</span><br />
|
||
<span class="f_CodeExample"># not have a load balancer, set </span><span class="f_CodeExample" style="font-weight: bold;">this</span><span class="f_CodeExample"> value to to any *one* of the</span><br />
|
||
<span class="f_CodeExample"># MinIO hosts </span><span class="f_CodeExample" style="font-weight: bold;">in</span><span class="f_CodeExample"> the deployment as a temporary measure.</span><br />
|
||
<span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample"># MINIO_SERVER_URL="https://minio.example:9000"</span></p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><code><b>MINIO_VOLUMES:</b></code><ul style="list-style-type:circle">
|
||
<li class="p_Normal"><code><b>minio-server{1...4}.your_domain</b></code> — ноды, объединённые в единый пул с нотацией расширения <code><b>{x...y}</b></code>; </li><li class="p_Normal"><code><b>9000</b></code> — порт подключения; </li><li class="p_Normal"><code><b>/var/lib/minio/data{1...4}/minio</b></code> — последовательный ряд дисков с нотацией расширения <code><b>{x...y}</b></code>; </li></ul></li></ul>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><code><b>MINIO_ROOT_USER</b></code> — имя пользователя администратора MinIO;</li></ul>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><code><b>MINIO_ROOT_PASSWORD</b></code> — пароль, в котором рекомендуется использовать не менее 16 символов.</li></ul>
|
||
<p class="p_Normal"><a class="dropdown-toggle" style="font-style: normal; font-weight: normal; color: #000000; background-color: transparent; text-decoration: none;" href="javascript:HMToggle('toggle','TOGGLE0186A1')">Настройка включения TLS/SSL в MinIO</a></p>
|
||
<div id="TOGGLE0186A1" class="dropdown-toggle-body" style="text-align: left; text-indent: 0; padding: 0 0 0 0; margin: 0 0 0 0;"><table style="border:none; border-spacing:0;">
|
||
<tr>
|
||
<td style="vertical-align:top; padding:0; border:none"><p class="p_Normal"> <br />
|
||
Для включения поддержки TLS/SSL в MinIO нужно на каждой ноде:</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" class="p_Normal">В файле окружения <code><b>/etc/default/minio</b></code> изменить протокол с HTTP на HTTPS в параметре <code><b>MINIO_VOLUMES</b></code>.</li></ol>
|
||
<ol style="list-style-type:decimal" start="2">
|
||
<li value="2" class="p_Normal">Положить файл сертификата и файл закрытого ключа в каталог<span style="font-weight: bold;"> </span><code><b>/etc/minio/certs</b></code>.<br />
|
||
<br />
|
||
Все ноды имеют уникальные доменные имена. Сертификаты должны быть выпущены для каждой ноды индивидуально.</li></ol>
|
||
<ol style="list-style-type:decimal" start="3">
|
||
<li value="3" class="p_Normal">Переименовать файл сертификата сервера в <code><b>public.crt</b></code>.</li></ol>
|
||
<ol style="list-style-type:decimal" start="4">
|
||
<li value="4" class="p_Normal">Переименовать файл закрытого ключа в <code><b>private.key</b></code>.</li></ol>
|
||
<ol style="list-style-type:decimal" start="5">
|
||
<li value="5" class="p_Normal">При использовании самоподписанных сертификатов положить файл корневого CA в каталог <code><b>/etc/minio/certs/CAs</b></code>.</li></ol>
|
||
<p class="p_Normal">Подробнее о настройке TLS/SSL в MinIO читайте в официальной документации <span style="font-size: 15px; font-family: 'Segoe UI',Tahoma,Verdana,Arial,sans-serif; background-color: #fcfcfc;"><a href="https://min.io/docs/minio/linux/operations/network-encryption.html" target="_blank" class="weblink">MinIO</a>.</span></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<h2 class="p_Heading2"><a id="service-start-minlo" class="hmanchor"></a><span class="f_Heading2">Шаг 8. Запуск сервиса MinIO</span></h2>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" class="p_Normal">Выполните следующие команды на каждой ноде, чтобы запустить службу MinIO:</li></ol>
|
||
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">sudo systemctl daemon-reload</span><br />
|
||
<span class="f_CodeExample">sudo systemctl enable minio.service</span><br />
|
||
<span class="f_CodeExample">sudo systemctl start minio.service</span></p>
|
||
<ol style="list-style-type:upper-roman" start="2">
|
||
<li value="2" class="p_Normal">Убедитесь в том, что сервис minio запустился и работает без ошибок:</li></ol>
|
||
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">sudo systemctl status minio.service</span><br />
|
||
<span class="f_CodeExample">journalctl -f -u minio.service</span></p>
|
||
<h2 class="p_Heading2"><a id="connection-setup-minlo" class="hmanchor"></a><span class="f_Heading2">Шаг 9. Настройка подключения к MinIO</span></h2>
|
||
<p class="p_Normal">Создайте <code><b>alias</b></code> для minio на ноде <span style="font-weight: bold;">minio-server1.your_domain</span>:</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">/usr/local/bin/mc alias set minio http:</span><span class="f_CodeExample">//minio-server1.your_domain:9000 elma365user SecretPassword</span></p>
|
||
<h2 class="p_Heading2"><a id="creation-bucket" class="hmanchor"></a><span class="f_Heading2">Шаг 10. Создание бакета</span></h2>
|
||
<p class="p_Normal"><span style="font-weight: bold;">Важно</span>: наименование бакета в S3 должно соответствовать формату <code><b>s3elma365*</b></code>.</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало примера</span></p>
|
||
<p class="p_Normal">Примеры наименований для бакетов</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" class="p_Normal"><code><b>s3elma365</b></code>.</li><li value="2" class="p_Normal"><code><b>s3elma365-dev</b></code>.</li><li value="3" class="p_Normal"><code><b>s3elma365-prod</b></code>.</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец примера</span></p>
|
||
<p class="p_Normal">Чтобы создать для работы ELMA365 бакет c наименованием <code><b>s3elma365</b></code>, используйте команду на ноде <span style="font-weight: bold;">minio-server1.your_domain</span>:</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">/usr/local/bin/mc mb -p minio/s3elma365 --region=ru-central-1</span></p>
|
||
<p class="p_Normal"><a class="dropdown-toggle" style="font-style: normal; font-weight: normal; color: #000000; background-color: transparent; text-decoration: none;" href="javascript:HMToggle('toggle','TOGGLE0186A2')">Создание в S3 бакетов для работы ELMA Bot</a></p>
|
||
<div id="TOGGLE0186A2" class="dropdown-toggle-body" style="text-align: left; text-indent: 0; padding: 0 0 0 0; margin: 0 0 0 0;"><table style="border:none; border-spacing:0;">
|
||
<tr>
|
||
<td style="vertical-align:top; padding:0; border:none"><p class="p_Normal"> <br />
|
||
Если вы планируете использовать <a href="elma-bot.html" class="topiclink">ELMA Bot</a>, создайте бакеты:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><code><b>s3elmabot</b></code>;</li><li class="p_Normal"><code><b>s3elmabot</b></code>;</li><li class="p_Normal"><code><b>elmabot-static-files</b></code>.</li></ul>
|
||
<p class="p_Normal">Для создания бакетов выполните следующие команды на ноде <span style="font-weight: bold;">minio-server1.your_domain</span>:</p>
|
||
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample"> </span><br />
|
||
<span class="f_CodeExample">/usr/local/bin/mc mb -p minio/s3elmabot --region=ru-central-1</span><br />
|
||
<span class="f_CodeExample">/usr/local/bin/mc mb -p minio/elmabot-temporary-files --region=ru-central-1</span><br />
|
||
<span class="f_CodeExample">/usr/local/bin/mc mb -p minio/elmabot-static-files --region=ru-central-1</span></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<h2 class="p_Heading2"><a id="cors" class="hmanchor"></a><span class="f_Heading2">Шаг 11. Настройка CORS</span></h2>
|
||
<p class="p_Normal"><span style="font-weight: bold;">Cross-Origin Resource Sharing (CORS)</span> — это инструмент, с помощью которого ограничивается доступ к ресурсам веб-приложения из сторонних доменов. Вы можете определить список доменов, с которых разрешено направлять запросы к приложению ELMA365, а также указать доступные заголовки и методы HTTP. </p>
|
||
<p class="p_Normal">Настройте CORS одним из способов:</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" class="p_Normal"><a href="minio-cluster.html#cors-file" class="topiclink">С помощью файла с конфигурацией CORS</a>.</li><li value="2" class="p_Normal"><a href="minio-cluster.html#cors-via-service" class="topiclink">Через веб-интерфейс сервиса для управления данными</a>, например Yandex Object Storage.</li></ol>
|
||
<h3 class="p_Heading3"><a id="cors-file" class="hmanchor"></a><span class="f_Heading3">Задать настройки CORS в конфигурационном файле</span></h3>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" class="p_Normal">Создайте файл <code><b>cors.xml</b></code> с конфигурацией CORS, например:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample"><?xml version="1.0" encoding="UTF-8"?></span><br />
|
||
<span class="f_CodeExample"><CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"></span><br />
|
||
<span class="f_CodeExample"><CORSRule></span><br />
|
||
<span class="f_CodeExample"><AllowedHeader>*</AllowedHeader></span><br />
|
||
<span class="f_CodeExample"><AllowedMethod>GET</AllowedMethod></span><br />
|
||
<span class="f_CodeExample"><AllowedMethod>PUT</AllowedMethod></span><br />
|
||
<span class="f_CodeExample"><AllowedMethod>HEAD</AllowedMethod></span><br />
|
||
<span class="f_CodeExample"><AllowedMethod>POST</AllowedMethod></span><br />
|
||
<span class="f_CodeExample"><AllowedMethod>DELETE</AllowedMethod></span><br />
|
||
<span class="f_CodeExample"><AllowedOrigin>https://*.elma365.ru</AllowedOrigin></span><br />
|
||
<span class="f_CodeExample"><MaxAgeSeconds>3000</MaxAgeSeconds></span><br />
|
||
<span class="f_CodeExample"></CORSRule></span><br />
|
||
<span class="f_CodeExample"></CORSConfiguration></span></p>
|
||
<p class="p_Normal">Где: </p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><code><b>AllowedHeader</b></code> — заголовки, которые доступны в запросах. Чтобы разрешить все заголовки, используйте символ <code><b>*</b></code>;</li><li class="p_Normal"><code><b>AllowedMethod</b></code> — разрешённые методы HTTP, например <code><b>GET</b></code>, <code><b>POST</b></code>, <code><b>PUT</b></code>, <code><b>DELETE</b></code>, <code><b>HEAD</b></code>;</li><li class="p_Normal"><code><b>AllowedOrigin</b></code> — источники, из которых можно обращаться к ресурсам веб-приложения. Чтобы разрешить доступ с любых доменов, используйте символ <code><b>*</b></code>. Для повышения безопасности рекомендуется указать определённые домены, например <span style="font-weight: bold;">https://*.elma365.ru</span>;</li><li class="p_Normal"><code><b>MaxAgeSeconds</b></code> — для уменьшения количества запросов и улучшения производительности можно сохранять в кеше браузера разрешение на запросы из определённого источника. Оно проверяется в предварительном запросе, который выполняется перед основным. Укажите время в секундах, в течение которого разрешение хранится в кеше и новые предварительные запросы не отправляются.</li></ul>
|
||
<p class="p_Normal">Вы также можете задать в конфигурации CORS параметр <code><b>ExposeHeader</b></code>. В нём определяются заголовки, которые отображаются в ответах на запросы. Не указывайте этот параметр в <span style="font-weight: bold;">.xml</span>-файле, если заголовки в ответах показывать не нужно.</p>
|
||
<ol style="list-style-type:upper-roman" start="2">
|
||
<li value="2" class="p_Normal">Примените настройки CORS к бакету с помощью команды:</li></ol>
|
||
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">/usr/local/bin/mc cors set minio/s3elma365 cors.xml</span></p>
|
||
<ol style="list-style-type:upper-roman" start="3">
|
||
<li value="3" class="p_Normal">Убедитесь, что настройки CORS применены правильно, выполнив команду:</li></ol>
|
||
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">/usr/local/bin/mc cors get minio/s3elma365 --json</span></p>
|
||
<h3 class="p_Heading3"><a id="cors-via-service" class="hmanchor"></a><span class="f_Heading3">Задать конфигурацию CORS через сервис управления данными</span></h3>
|
||
<p class="p_Normal">Вы можете настроить CORS через веб-интерфейс сервиса для управления данными.</p>
|
||
<p class="p_Normal">Пример заполнения параметров CORS в Yandex Object Storage:</p>
|
||
<p class="p_Normal"><img alt="configure-minio-1" width="596" height="505" style="margin:0;width:596px;height:505px;border:none" src="configure-minio-1.png"/></p>
|
||
<p class="p_Normal">Подробнее о том, как настроить CORS читайте в <a href="https://yandex.cloud/ru/docs/storage/operations/buckets/cors" target="_blank" class="weblink">официальной документации Yandex Cloud</a>.</p>
|
||
<h2 class="p_Heading2"><a id="config-haproxy" class="hmanchor"></a><span class="f_Heading2">Шаг 12. Конфигурация HAProxy (блок s3minio)</span></h2>
|
||
<p class="p_Normal">В рамках статьи пользовательский трафик приходит в HAProxy по <code><b>minio.your_domain:9000</b></code> и равномерно балансируется между нодами кластера MinIO.</p>
|
||
<p class="p_Normal">Балансировку нагрузки между нодами кластера MinIO осуществите с помощью HAProxy. Настройте его согласно статье <a href="haproxy-s3-minio.html" class="topiclink">«Конфигурация HAProxy для S3 Minio»</a>.</p>
|
||
<h2 class="p_Heading2"><a id="connection" class="hmanchor"></a><span class="f_Heading2">Шаг 13. Подключение к ELMA365</span></h2>
|
||
<p class="p_Normal">Параметры для подключения к MinIO:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><span style="font-weight: bold;">address</span> — <code><b>minio-server.your_domain:9000</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">bucket</span> — <code><b>s3elma365</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">region</span> — <code><b>ru-central-1</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">access key ID</span> — <code><b>elma365user</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">secret access key</span> — <code><b>SecretPassword</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">upload method</span> — <code><b>PUT</b></code>;</li><li class="p_Normal"><span style="font-weight: bold;">enable SSL</span> — <code><b>No</b></code>.</li></ul>
|
||
<p class="p_Normal">При подключении MinIO с использованием TLS/SSL укажите в <span style="font-weight: bold;">enable SSL </span>значение <code><b>Yes</b></code>.</p>
|
||
|
||
<div class="bottom-nav">
|
||
|
||
<a id="prev-link" class="topic__navi_prev" href="configure-rabbitmq.html">
|
||
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
|
||
class="bottom-nav__link">configure-rabbitmq.html</span>
|
||
</a>
|
||
|
||
|
||
<a id="next-link" class="topic__navi_next" href="discontinued-postgresql-support.html">
|
||
<span class="bottom-nav__link">discontinued-postgresql-support.html</span> <span
|
||
class="bottom-nav__arrow bottom-nav__arrow--next"></span>
|
||
</a>
|
||
|
||
</div>
|
||
<!-- добавляет на страницу строку блок Была ли статья полезной? -->
|
||
<div class="feedback-wrap"><div class="feedback" id="feedback"><span><b>Была ли статья полезной?</b></span><form action="" method="POST" class="feedback-form" id="feedback-form"><div class="feedback__popup feedback__popup-response" id="feedback__popup_thx">Спасибо за ваш отзыв!</div><div id="feedback-success-popup"><div class="wrap"><button type="button" class="feedback-popup-close">×</button><svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_212_2187)"><path d="M22 0.6875C10.2294 0.6875 0.6875 10.2294 0.6875 22C0.6875 33.7706 10.2294 43.3125 22 43.3125C33.7706 43.3125 43.3125 33.7706 43.3125 22C43.3125 10.2294 33.7706 0.6875 22 0.6875ZM22 40.5625C11.8023 40.5625 3.4375 32.3078 3.4375 22C3.4375 11.8024 11.6922 3.4375 22 3.4375C32.1977 3.4375 40.5625 11.6922 40.5625 22C40.5625 32.1976 32.3078 40.5625 22 40.5625ZM34.1713 16.933L18.6613 32.3186C18.257 32.7197 17.604 32.7171 17.203 32.3128L9.82283 24.873C9.42176 24.4686 9.42434 23.8157 9.82867 23.4146L10.5609 22.6884C10.9652 22.2873 11.6181 22.2899 12.0192 22.6942L17.9468 28.6697L31.9926 14.7366C32.3969 14.3356 33.0498 14.3382 33.4509 14.7425L34.1772 15.4747C34.5783 15.879 34.5757 16.532 34.1713 16.933Z" fill="#27AE60"></path></g><defs><clipPath id="clip0_212_2187"><rect width="44" height="44" fill="white"></rect></clipPath></defs></svg><p>Ваш отзыв успешно отправлен!</p><span>Спасибо за обратную связь.</span></div></div><div class="feedback__popup" id="feedback__popup_why"><button type="button" class="feedback-popup-close">×</button><div class="feedback__popup-header">Уточните, почему:</div><input type="radio" name="category" id="bad_recommendation" value="bad_recommendation"><label for="bad_recommendation">Рекомендации не помогли</label><input type="radio" name="category" id="difficult_text" value="difficult_text"><label for="difficult_text">Текст трудно понять</label><input type="radio" name="category" id="no_answer" value="no_answer"><label for="no_answer">Нет ответа на мой вопрос</label><input type="radio" name="category" id="bad_header" value="bad_header"><label for="bad_header">Содержание статьи не соответствует заголовку</label><input type="radio" name="category" id="other_reason" value="other_reason"><label for="other_reason">Другая причина</label></div><div class="feedback__popup" id="feedback__popup-other"><button type="button" class="feedback-popup-close">×</button> <div class="feedback__popup-header">Расскажите, что вам не понравилось в статье:</div><textarea class="feedback__textarea" name="other" id=""></textarea><input type="submit" class="feedback__other-btn" value="Отправить"></div><div class="feedback-form__btn-group"><input type="radio" name="useful" id="feedback__useful_yes" value="true"><label for="feedback__useful_yes"><img src="like.svg"/><span class="feedback-form__btn-group_yes-btn">Да</span></label><input type="radio" name="useful" id="feedback__useful_no" value="false"><label for="feedback__useful_no"><img src="dislike.svg"/><span class="feedback-form__btn-group_no-btn">Нет</span></label></div><select name="category"><option disabled>Выберите вариант</option><option value="bad_recommendation" selected>Рекомендации не помогли</option><option value="difficult_text">Текст трудно понять</option><option value="no_answer">Нет ответа на мой вопрос</option><option value="bad_header">Содержание статьи не соответствует заголовку</option><option value="other_reason">Другая причина</option></select><input type="submit"></form></div></div>
|
||
|
||
</section>
|
||
</div>
|
||
<aside class="article__sidebar" style="display:none">
|
||
<input type="checkbox" />
|
||
<div class="article__arrow"></div>
|
||
<div class="table-of-contents elma365-right" id="toc2Content">
|
||
<h3 class="h3-toc">В этой статье</h3>
|
||
<nav id="toc2"></nav>
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
</article>
|
||
</main>
|
||
<footer class="footer">
|
||
<div class="footer-container">
|
||
<div class="footer-mobile">
|
||
|
||
<ul class="footer-mobile__list"><li><a href="https://api.elma365.com/ru/" target="_blank">API</a></li><li><a href="https://tssdk.elma365.com/" target="_blank">TS SDK</a></li><li><a href="https://community.elma365.com/" target="_blank">Community</a></li><li><a href="https://elma-academy.com/ru/elma365" target="_blank">Академия</a></li></ul><ul class="footer-mobile__list"><li><a href="https://elma365.com/ru/help/platform/get-trial.html">Платформа</a></li><li><a href="https://elma365.com/ru/help/ecm/ecm-functions.html">ECM</a></li><li><a href="https://elma365.com/ru/help/service/service-functions.html">Service</a></li><li><a href="https://elma365.com/ru/help/projects/projects-functions.html">Проекты</a></li></ul>
|
||
|
||
|
||
</div>
|
||
<div class="container">
|
||
<div class="footer-wrap">
|
||
|
||
<div><span class="mobile-question-popup">Отправить фидбэк</span><form method="POST" action class="question__popup question-xs" id="question__popup"><div class="question-wrap"><span class="close"></span><span class="title">Задать вопрос</span><label for="help_question" style="display: none;"></label><textarea name="help_question" id="help_question"></textarea><input type="submit" value="Отправить"></div></form><div class="hidden fade-in question-success-xs">Ваш фидбэк отправлен.</div></div>
|
||
|
||
<div class="footer-flex-b">
|
||
<div class="footer-top">
|
||
<span class="footer-copy">© 2025
|
||
ELMA365
|
||
|
||
|
||
</span>
|
||
|
||
<a href="https://navigator.sk.ru/orn/1122971" target="_blank">
|
||
<img src="sk-resident.svg" alt="sk icon" class="footer-img" width="117" height="34">
|
||
</a>
|
||
|
||
</div>
|
||
<div class="footer-line">
|
||
|
||
<div class="footer-line-copy">
|
||
<span class="footer-copy">© 2025
|
||
ELMA365
|
||
|
||
|
||
</span>
|
||
</div>
|
||
|
||
<ul class="footer-list">
|
||
|
||
<li class="footer-item"><a href="https://elma365.com/ru/" target="_blank" class="footer-link" style="color: #0D4A75;"><img src="browse.svg" alt="browse icon" class="footer-img">elma365.com</a></li><li class="footer-item"><a href="https://www.youtube.com/user/ELMABPM" target="_blank" class="footer-link"><img src="yt.svg" alt="youtube icon" class="footer-img"></a></li><li class="footer-item"><a href="https://vk.com/elma_bpm" target="_blank" class="footer-link"><img src="vk.svg" alt="vk icon" class="footer-img"></a></li><li class="footer-item"><a href="https://t.me/elmaday" target="_blank" class="footer-link"><img src="tg.svg" alt="telegram icon" class="footer-img"></a></li><li class="footer-item"><a href="https://dzen.ru/elma" target="_blank" class="footer-link"><img src="dzen.svg" alt="dzen icon" class="footer-img"></a></li>
|
||
|
||
|
||
<li class="footer-item">
|
||
<a href="https://navigator.sk.ru/orn/1122971" target="_blank">
|
||
<img src="sk-resident.svg" alt="sk icon" class="footer-img" width="117" height="34">
|
||
</a>
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<a href="#" class="arrow-top"></a>
|
||
</div>
|
||
|
||
</footer>
|
||
<!-- <script type="text/javascript" src="jquery1.min.js"></script>-->
|
||
<iframe name="hmnavigation" style="display:none!important"></iframe>
|
||
<!--<script src="./jquery-ui.js"></script> -->
|
||
<script src="./jquery-ui.min.js"></script>
|
||
<!--script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script-->
|
||
<script src="./jquery.tocify.min.js"></script>
|
||
<script src="./TypoReporter.min.js"></script>
|
||
<script src="./google-search.js"></script>
|
||
<script src="./main.js"></script>
|
||
<script type="text/javascript">
|
||
HMInitToggle('TOGGLE0186A1','hm.type','dropdown','hm.state','0');
|
||
HMInitToggle('TOGGLE0186A2','hm.type','dropdown','hm.state','0');
|
||
</script>
|
||
</body>
|
||
|
||
</html>
|