All checks were successful
Deploy Static Site / deploy (push) Successful in 6m55s
347 lines
64 KiB
HTML
347 lines
64 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
|
||
<head>
|
||
<title>Настройка переносимого сервиса в модуле</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="Переносимые сервисы позволяют интегрировать микросервисы в пользовательские модули, расширяя их функциональные возможности. " />
|
||
<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="360024498352.html">Модули расширения системы</a> > <a href="extentions.html">Пользовательские модули</a> / Настройка переносимого сервиса в модуле</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Настройка переносимого сервиса в модуле</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 style="margin: 7px 0 16px 0;">Переносимые сервисы позволяют интегрировать микросервисы в пользовательские модули, расширяя их функциональные возможности. </p>
|
||
<p class="p_Normal">Подключить переносимый сервис в модуле можно несколькими способами. Нужный вариант выбирается в зависимости от среды размещения самого микросервиса, а также используемой поставки ELMA365. При создании сервиса вы можете передать в модуль: </p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal">адрес образа микросервиса, размещённого в публичном или приватном репозитории Docker Hub, его внутренние настройки и конфигурации для работы в кластере. Такой способ используется в поставках, поддерживающих развёртывание сервиса в среде исполнения Kubernetes: ELMA365 On‑Premises и SaaS Enterprise;</li><li class="p_Normal">альтернативный адрес сервиса, установленного на внешнем хостинге с публичным доступом. Способ доступен для всех поставок, но зачастую применяется в облачной поставке ELMA365 SaaS Standard, где нельзя обеспечить работу образа сервиса.</li></ul>
|
||
<p style="margin: 7px 0 16px 0;">В этой статье рассмотрим процесс создания сервиса в пользовательском модуле.</p>
|
||
<p style="margin: 7px 0 16px 0;">Подробнее об использовании микросервисов в разработке пользовательских решений читайте в статьях:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">особенности переносимых сервисов и пример использования — <a href="portable-microservices.html" class="topiclink">«Переносимые сервисы в модулях»</a>;</li><li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">реализация проверки стабильного подключения сервиса — <a href="readiness.html" class="topiclink">«Пример использования Readiness проверки в переносимых сервисах»</a>;</li><li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">включение переносимых сервисов в ELMA365 Enterprise — <a href="enable-portable-services.html" class="topiclink">«Включение переносимых сервисов»</a>;</li><li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">разработка собственного микросервиса — <a href="development-key-points.html" class="topiclink">«Рекомендации по разработке микросервисов для переносимых сервисов»</a>. </li></ul>
|
||
<h2 class="p_Heading2"><a id="add-portable-microservices" class="hmanchor"></a><span class="f_Heading2">Добавить и настроить переносимый сервис</span></h2>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">Откройте страницу пользовательского модуля, в котором подключается переносимый сервис, и перейдите в <span style="font-weight: bold;">Управление</span>.</li><li value="2" style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">На вкладке <span style="font-weight: bold;">Сервисы</span> нажмите кнопку <span style="font-weight: bold;">+ Сервис</span> и заполните основные настройки в открывшемся окне:</li></ol>
|
||
<p style="margin: 7px 0 16px 36px;"><img alt="portable-services-1" width="472" height="365" style="margin:0;width:472px;height:365px;border:none" src="portable-services-1.png"/></p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;"><span style="font-weight: bold;">Имя</span><span style="font-weight: bold; color: #ff0000;">*</span> — название сервиса, отображаемое в списке на странице модуля;</li></ul>
|
||
<ul style="list-style-type:disc">
|
||
<li style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;"><span style="font-weight: bold;">Уникальное имя сервиса</span><span style="font-weight: bold; color: #ff0000;">*</span> — имя, которое будет использоваться в коде или скриптах для обращения к сервису. Заданное при создании имя невозможно изменить в дальнейшем;</li></ul>
|
||
<ul style="list-style-type:disc">
|
||
<li style="background: #ffffff; margin-top: 14px; margin-right: 0; margin-bottom: 0;"><span style="font-weight: bold;">Docker контейнер</span> — в блоке настраивается размещение образа микросервиса в отдельном пространстве в среде исполнения Kubernetes. Настройка доступна в поставках ELMA365 On‑Premises и SaaS Enterprise:<ul style="list-style-type:circle">
|
||
<li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;"><a id="image-address" class="hmanchor"></a><span style="font-weight: bold;">Адрес образа</span><span style="font-weight: bold; color: #ff0000;">*</span> — URL-адрес Docker‑образа сервиса. Задаётся в одном из форматов: для Docker Hub используйте <a href="portable-services.html#image-address-formats" class="topiclink">краткий относительный путь</a>, для других реестров — <a href="portable-services.html#image-address-full-path" class="topiclink">полный путь</a>.</li></ul></li></ul>
|
||
<p style="background: #ffffff; margin: 0 0 0 58px;">Когда для образа требуется аутентификация, нужно указать логин и токен учётных данных. Для этого напротив поля нажмите значок ключа и заполните форму одним из следующих способов:</p>
|
||
<ul style="list-style-type:disc"><ul style="list-style-type:circle"><ul style="list-style-type:square">
|
||
<li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;">укажите логин и токен в строковом представлении. При экспорте модуля указанные значения сохраняются и передаются в открытом виде;</li><li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;">чтобы предотвратить случайную утечку данных авторизации при экспорте модуля, используйте шаблонизированные переменные типа <a href="360009707032.html#string" class="topiclink">Строка (строка)</a>, созданные в виде <a href="extention-settings.html" class="topiclink">параметров настроек модуля</a>. Для этого нажмите значок <span style="font-weight: bold;">{+}</span> и выберите добавленное свойство.</li></ul></li></ul></li></ul>
|
||
<p style="background: #ffffff; margin: 0 0 0 82px;">В этом случае значения логина и токена указываются на <a href="extention-settings.html#parameters-page" class="topiclink">странице подключения модуля</a>, а не вводятся напрямую в окне <span style="font-weight: bold;">Данные авторизации</span>. При экспорте и последующем импорте модуля конфиденциальная информация не будет случайно передана, поскольку значения параметров настроек удалятся. При этом сами переменные для логина и токена сохранятся.<br />
|
||
<img alt="portable-services-8" width="638" height="278" style="margin:0;width:638px;height:278px;border:none" src="portable-services-8.png"/></p>
|
||
<ul style="list-style-type:disc"><ul style="list-style-type:circle">
|
||
<li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;"><span style="font-weight: bold;">Порт HTTP</span><span style="font-weight: bold; color: #ff0000;">*</span> — порт, через который будет происходить взаимодействие с микросервисом. По умолчанию указан порт <span style="font-weight: bold;">3000</span>. При настройке ознакомьтесь с документацией микросервиса и определите, какой из портов следует выбрать.</li></ul>
|
||
<li style="background: #ffffff; margin-top: 14px; margin-right: 0; margin-bottom: 0;"><span style="font-weight: bold;">Альтернативный адрес сервиса</span> — блок заполняется, если микросервис размещён и функционирует на стороннем сервере с публичным адресом доступа. Вы можете указать URL‑адрес сервиса одним из следующих способов:<ul style="list-style-type:circle">
|
||
<li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;">внести адрес в строковом представлении, например <span style="font-weight: bold;">https://example.mathcalculation.com</span>;</li><li style="background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 0;">использовать предварительно созданные параметры из настроек модуля и <a href="portable-services.html#alternative-address" class="topiclink">задать шаблон адреса</a>. В этом случае, если компоненты адреса изменяются, вы сможете отредактировать значения параметров в модуле, а не настраивать подключение повторно.</li></ul></li></ul>
|
||
<p class="p_Normal">Обратите внимание, если в поставках ELMA365 On‑Premises и SaaS Enterprise указать оба адреса, то будет использоваться адрес образа.</p>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="3" style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;">Нажмите <span style="font-weight: bold;">Сохранить</span>.</li><li value="4" class="p_Normal">Откроется окно <span style="font-weight: bold;">Редактирование сервиса</span>, в котором можно:<br />
|
||
<img alt="portable-services-5" width="522" height="361" style="margin:0;width:522px;height:361px;border:none" src="portable-services-5.png"/></li></ol>
|
||
<ul style="list-style-type:disc">
|
||
<li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;"><span style="font-size: 15px; font-family: Inter;">отредактировать или добавить <a href="portable-services.html#image-address-formats" class="topiclink">адрес образа</a> и порт, а также указать <a href="portable-services.html#docker-settings" class="topiclink">дополнительные настройки Docker‑контейнера</a>. Например, можно задать количество экземпляров микросервиса, добавить переменные окружения, настроить Liveness- и Readiness‑пробы</span>;</li><li style="margin-top: 7px; margin-right: 0; margin-bottom: 16px;"><span style="font-size: 15px; font-family: Inter;">отредактировать или указать публичный адрес сервиса, нажав значок шестерёнки справа от поля </span><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Альтернативный адрес сервиса</span><span style="font-size: 15px; font-family: Inter;">. Чтобы адрес формировался на основе параметров модуля, для него можно <a href="portable-services.html#alternative-address" class="topiclink">задать шаблон</a></span>.</li></ul>
|
||
<h2 class="p_Heading2"><a id="image-address-formats" class="hmanchor"></a><span class="f_Heading2">Форматы для адреса образа</span></h2>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">В зависимости от размещения Docker‑образа укажите в настройках сервиса:</span></p>
|
||
<ol style="list-style-type:upper-roman"><ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">краткий относительный путь</span><span style="font-size: 15px; font-family: Inter;"> — применяется, если образ расположен в реестре по умолчанию — Docker Hub.</span></li></ul></li></ol>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 24px;"><span style="font-size: 15px; font-family: Inter;">Формат: </span><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><image_path>:<tag></span><span style="font-size: 15px; font-family: Inter;">, где:</span></p>
|
||
<ol style="list-style-type:upper-roman"><ul style="list-style-type:disc"><ul style="list-style-type:circle">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><image_path></span><span style="font-size: 15px; font-family: Inter;"> — путь к образу в реестре. Обязателен;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><tag></span><span style="font-size: 15px; font-family: Inter;"> — тег образа. Необязателен.</span></li></ul></li></ul></li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало примера</span></p>
|
||
<p style="line-height: 1.28; page-break-after: avoid; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Примеры</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Адреса контейнеров в репозитории Docker Hub:</span></p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">nginx</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">nginx:latest</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">chialab/math-api</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">chialab/math-api:latest</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">company/service</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">company/service:v1.0.0</span><span style="font-size: 15px; font-family: Inter;">.</span></li></ul>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец примера</span></p>
|
||
<ol style="list-style-type:upper-roman"><ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><a id="image-address-full-path" class="hmanchor"></a><span style="font-size: 15px; font-family: Inter; font-weight: bold;">полный путь</span><span style="font-size: 15px; font-family: Inter;"> — для публичного или приватного репозитория, расположенного на отдельном сервере.</span></li></ul></li></ol>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 24px;"><span style="font-size: 15px; font-family: Inter;">Формат: </span><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><registry>:<port>/<image_path>:<tag></span><span style="font-size: 15px; font-family: Inter;">, где:</span></p>
|
||
<ol style="list-style-type:decimal"><ul style="list-style-type:disc"><ul style="list-style-type:circle">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><registry></span><span style="font-size: 15px; font-family: Inter;"> — доменный адрес реестра образов. Обязателен;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><port></span><span style="font-size: 15px; font-family: Inter;"> — порт, по которому можно получить доступ к реестру образов. Необязателен;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><image_path></span><span style="font-size: 15px; font-family: Inter;"> — путь к образу в реестре. Обязателен;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;"><tag></span><span style="font-size: 15px; font-family: Inter;"> — тег образа. Необязателен.</span></li></ul></li></ul></li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало примера</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Примеры</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Адреса контейнеров в сторонних реестрах:</span></p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">company.goharbor.io/math-api</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">company.goharbor.io:5005/math-api:v1.0.0</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">registry.company.com/service/app</span><span style="font-size: 15px; font-family: Inter;">;</span></li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">registry.company.com:5005/service/app:latest</span><span style="font-size: 15px; font-family: Inter;">.</span></li></ul>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец примера</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Подробнее об адресах образов читайте в </span><span style="font-size: 15px; font-family: Calibri,Vectora,'Droid Sans','Open Sans',Frutiger,sans-serif; color: #0563c1;"><a href="https://kubernetes.io/docs/concepts/containers/images/#image-names" target="_blank" class="weblink">официальной документации Kubernetes</a></span><span style="font-size: 15px; font-family: Inter;">.</span></p>
|
||
<h3 class="p_Heading3"><span class="f_Heading3">Проверка корректности адреса</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Для проверки загрузите образ микросервиса с помощью команды: </span></p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">docker pull <image_address></span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Где </span><code><b><image_address></b></code><span style="font-size: 15px; font-family: 'Courier New',Courier,monospace; font-weight: bold;"> </span><span style="font-size: 15px; font-family: Inter;">— адрес образа.</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Если загрузка проходит успешно, адрес можно использовать для сервиса в модуле ELMA365.</span></p>
|
||
<h2 class="p_Heading2"><a id="alternative-address" class="hmanchor"></a><span class="f_Heading2">Шаблон альтернативного адреса сервиса</span></h2>
|
||
<p style="margin: 7px 0 7px 0;">Альтернативный адрес сервиса можно указать с помощью параметров модуля. Такой способ позволяет более гибко управлять переносимым сервисом. Например, вы можете изменять компоненты адреса на <a href="extention-settings.html#parameters-page" class="topiclink">странице подключения модуля</a>. </p>
|
||
<p style="margin: 7px 0 7px 0;">Чтобы настроить шаблон адреса сервиса, выполните следующие шаги:</p>
|
||
<ol style="list-style-type:upper-roman">
|
||
<li value="1" style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;">Откройте страницу управления пользовательского модуля, в который будет добавляться переносимый сервис.</li><li value="2" style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;">Перейдите на вкладку <span style="font-weight: bold;">Настройки</span> и создайте свойства типа <span style="font-weight: bold;">Строка (строка)</span>, из которых будет состоять адрес сервиса. Например, это могут быть два параметра: для записи протокола передачи данных и для указания базового адреса сервиса.</li><li value="3" style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;">В настройках при создании сервиса в модуле укажите шаблон в поле <span style="font-weight: bold;">Адрес сервиса</span>. Для этого нажмите значок <span style="font-weight: bold;">{+}</span>, выберите созданные ранее параметры и сохраните настройки.<br />
|
||
<img alt="portable-services-6" width="589" height="304" style="margin:0;width:589px;height:304px;border:none" src="portable-services-6.png"/></li><li value="4" class="p_Normal">Чтобы отредактировать указанный адрес, в настройках сервиса нажмите значок шестерёнки справа от опции <span style="font-weight: bold;">Альтернативный адрес сервиса</span>. Отредактируйте шаблон или задайте новый адрес и сохраните изменения.</li><li value="5" class="p_Normal">Сохраните настройки сервиса.</li></ol>
|
||
<p class="p_Normal">Теперь адрес сервиса можно указать, изменить или удалить в настройках включённого модуля. Если поля не заполнены, связь с сервисом недоступна.<br />
|
||
<img alt="portable-services-7" width="889" height="206" style="margin:0;width:889px;height:206px;border:none" src="portable-services-7.png"/></p>
|
||
<h2 class="p_Heading2"><a id="docker-settings" class="hmanchor"></a><span class="f_Heading2">Настройки Docker-контейнера</span></h2>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">В поставках ELMA365 On‑Premises и SaaS Enterprise образ микросервиса можно разместить в среде исполнения Kubernetes. Чтобы задать настройки развёртывания микросервиса, нажмите значок шестерёнки справа от названия блока </span><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Docker контейнер</span><span style="font-size: 15px; font-family: Inter;">. В открывшемся окне настройка выполняется на нескольких вкладках</span>: <a href="portable-services.html#main-tab" class="topiclink">Основные настройки</a>, <a href="portable-services.html#variables-tab" class="topiclink">Переменные окружения</a>, <a href="portable-services.html#liveness-tab" class="topiclink">Liveness</a>, <a href="portable-services.html#readiness-tab" class="topiclink">Readiness</a>.</p>
|
||
<h3 class="p_Heading3"><a id="main-tab" class="hmanchor"></a><span class="f_Heading3">Вкладка «Основные настройки»</span></h3>
|
||
<p style="margin: 7px 0 16px 0;"><img alt="portable-services-2" width="520" height="314" style="margin:0;width:520px;height:314px;border:none" src="portable-services-2.png"/></p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Адрес образа</span><span style="font-size: 15px; font-family: Inter; font-weight: bold; color: #ff0000;">*</span><span style="font-size: 15px; font-family: Inter;">, </span><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Порт HTTP</span><span style="font-size: 15px; font-family: Inter; font-weight: bold; color: #ff0000;">*</span><span style="font-size: 15px; font-family: Inter;"> — вы можете отредактировать адрес образа, </span>логин и токен для доступа к репозиторию<span style="font-size: 15px; font-family: Inter;"> и порт подключения, указанные при </span><span style="font-size: 15px; font-family: Calibri,Vectora,'Droid Sans','Open Sans',Frutiger,sans-serif; color: #0563c1;"><a href="portable-services.html#add-portable-microservices" class="topiclink">создании переносимого сервиса</a></span>;</li><li style="margin-top: 7px; margin-right: 0; margin-bottom: 7px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Дополнительные порты </span><span style="font-size: 15px; font-family: Inter;">— вы можете указать для микросервиса дополнительные порты, с помощью которых другие микросервисы модуля смогут к нему обращаться. Для одного микросервиса доступно не более 10 дополнительных портов.</span></li></ul>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало внимание</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Чтобы указание дополнительных портов в настройках переносимых сервисов стало доступно, включите фича-флаг </span><code><b>allowBabysitterOptionalPorts</b></code><span style="font-size: 15px; font-family: Inter;">. Подробнее читайте в статьях </span><span style="font-size: 15px; font-family: Inter; color: #0563c1;"><a href="change-settings-enterprise.html#enable-feature-flag-enterpeise" class="topiclink">«Изменение параметров ELMA365 Enterprise»</a></span><span style="font-size: 15px; font-family: Inter;"> и </span><span style="font-size: 15px; font-family: Inter; color: #0563c1;"><a href="change-elma365standard-parameters.html#enable-feature-flag-standard" class="topiclink">«Изменение параметров ELMA365 Standard»</a></span><span style="font-size: 15px; font-family: Inter;">.</span></p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец внимание</span></p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-size: 15px; font-family: Inter; font-weight: bold;">Количество экземпляров</span><span style="font-size: 15px; font-family: Inter;"> — </span>укажите, сколько экземпляров микросервисов развернуть и запустить. При изменении количества следует учитывать, что в ELMA365 не поддерживается репликация сервисов. Если это не заложено в микросервис, то каждый из запущенных экземпляров не будет связан с остальными.</li></ul>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Вы можете настроить дополнительные параметры переносимого сервиса с помощью ConfigMap. Например, задать лимиты использования ресурсов, включить автомасштабирование микросервиса и настроить размещение подов на узлах кластера. Подробнее читайте в статье </span><span style="font-size: 15px; font-family: Calibri,Vectora,'Droid Sans','Open Sans',Frutiger,sans-serif; color: #0563c1;"><a href="configmap.html" class="topiclink">«Настройка параметров переносимых сервисов через ConfigMap»</a></span><span style="font-size: 15px; font-family: Inter;">.</span></p>
|
||
<h3 class="p_Heading3"><a id="variables-tab" class="hmanchor"></a><span class="f_Heading3">Вкладка «Переменные окружения»</span></h3>
|
||
<p style="margin: 7px 0 16px 0;">На этой вкладке создаются переменные окружения образа микросервиса. Они используются, если в микросервисе допускается конфигурирование через переменные среды. Определить доступность конфигурирования можно в документации микросервиса. Для создания переменной на вкладке нажмите <span style="font-weight: bold;">+ Переменная окружения</span> и заполните шаблон параметра сервиса в открывшемся окне.</p>
|
||
<p style="margin: 7px 0 16px 0;"><img alt="portable-services-3" width="581" height="366" style="margin:0;width:581px;height:366px;border:none" src="portable-services-3.png"/></p>
|
||
<p style="margin: 7px 0 16px 0;">Обратите внимание, при добавлении или изменении переменных окружения микросервис перезапускается.</p>
|
||
<p style="margin: 7px 0 16px 0;">Вы можете не только задавать переменные окружения при разработке, но и предоставлять возможность их изменения конечным пользователям. Для этого при создании переменной в шаблоне можно использовать <a href="https://elma365.com/ru/help/platform/extention-settings.html" target="_blank" class="weblink">параметры настройки модуля</a>. </p>
|
||
<p style="margin: 7px 0 16px 0;">Например, в настройках модуля есть свойство <span style="font-weight: bold;">ServiceTimeout</span>. Можно создать переменную окружения <span style="font-weight: bold;">R</span><span style="font-weight: bold;">equestTimeout</span> и указать в её шаблоне <code><b>{$ServiceTimeout}</b></code>. Тогда пользователи будут изменять значение свойства на главной странице настроек модуля и при этом устанавливать значение для переменной окружения в микросервисе. </p>
|
||
<p style="margin: 7px 0 16px 0;">Если в шаблоне переменных окружения используются параметры настройки модуля, вы можете включить опцию <span style="font-weight: bold;">Перезапускать при изменении настроек модуля</span>. В этом случае, когда значения параметров на главной странице настроек модуля изменятся, сервис будет перезапускаться, т. е. полностью удаляться из Kubernetes‑кластера и разворачиваться повторно. </p>
|
||
<h3 class="p_Heading3"><a id="liveness-tab" class="hmanchor"></a><span class="f_Heading3">Вкладка «Liveness»</span></h3>
|
||
<p style="margin: 7px 0 16px 0;">Здесь вы можете включить возможность Kubernetes автоматически перезапускать микросервис в случае его неработоспособности. В выпадающем списке доступны следующие опции: <span style="font-weight: bold;">Command</span>, <span style="font-weight: bold;">HTTP</span>, <span style="font-weight: bold;">TCP</span>. Прежде чем включать Liveness-пробы и выбирать их тип, ознакомьтесь с документацией подключаемого микросервиса.</p>
|
||
<h3 class="p_Heading3"><a id="readiness-tab" class="hmanchor"></a><span class="f_Heading3">Вкладка «Readiness»</span></h3>
|
||
<p style="margin: 7px 0 16px 0;">На этой вкладке включается возможность Kubernetes не позволять подключаться к микросервису до его полной инициализации. В выпадающем списке доступны следующие опции: <span style="font-weight: bold;">Command</span>, <span style="font-weight: bold;">HTTP</span>, <span style="font-weight: bold;">TCP</span>. Прежде чем включать Readiness-пробы и выбирать их тип, ознакомьтесь с документацией подключаемого микросервиса.</p>
|
||
<p style="margin: 7px 0 7px 0;">Конфигурирование параметров на вкладках <span style="font-weight: bold;">Liveness </span>и <span style="font-weight: bold;">Readiness</span> следует выполнять с особой осторожностью. В случае некорректной настройки и получении невалидного ответа Kubernetes будет считать микросервис неработоспособным и перезагружать его вне зависимости от его реального статуса. Включать параметры Liveness-проб и Readiness-проб рекомендуется, только если вы чётко понимаете специфику и последствия их использования.</p>
|
||
<p style="margin: 7px 0 7px 0;">Чтобы закончить настройку добавленного сервиса, в окне редактирования нажмите кнопку <span style="font-weight: bold;">Сохранить</span>.</p>
|
||
<p style="margin: 7px 0 7px 0;">Все созданные сервисы будут отображаться в управлении модулем, на вкладке <span style="font-weight: bold;">Сервисы</span>. Чтобы повторно открыть окно редактирования сервиса, нажмите на его название в списке. Для удаления сервиса отметьте его флажком и нажмите на появившуюся в правом углу страницы кнопку <span style="font-weight: bold;">Удалить</span>.</p>
|
||
<h2 class="p_Heading2"><a id="on-off-microservices" class="hmanchor"></a><span class="f_Heading2">Запуск и выключение микросервисов</span></h2>
|
||
<p class="p_Normal">При включении модуля будут запущены все добавленные в него микросервисы. При выключении модуля микросервисы будут остановлены и удалены.</p>
|
||
<p class="p_Normal">Один и тот же образ микросервиса, развёрнутый из разных модулей в одной компании, будет иметь разные экземпляры микросервиса.</p>
|
||
<h2 class="p_Heading2"><a id="monitor-of-microservices" class="hmanchor"></a><span class="f_Heading2">Монитор микросервисов</span></h2>
|
||
<p style="margin: 7px 0 16px 0;">При включенном модуле статус добавленных в него микросервисов можно отслеживать на его странице. Для этого рядом с названием модуля<span style="font-weight: bold;"> </span>отображается <span style="font-weight: bold;">Монитор сервисов</span>.</p>
|
||
<p style="margin: 7px 0 16px 0;"><img alt="portable-services-4" width="1037" height="283" style="margin:0;width:1037px;height:283px;border:none" src="portable-services-4.png"/></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">Нажав на кнопку, вы<span style="font-weight: bold;"> </span>увидите список всех микросервисов, заданных переносимыми сервисами. По каждому сервису отображаются данные об образе, из которого поднимается контейнер, о количестве набора реплик и их текущем статусе. При наличии возможностей кластера Kubernetes предоставлять метрики указываются также данные о потреблении ресурсов. </p>
|
||
<h2 class="p_Heading2"><a id="interaction" class="hmanchor"></a><span class="f_Heading2">Взаимодействие с микросервисом</span></h2>
|
||
<h3 class="p_Heading3"><a id="scripts" class="hmanchor"></a><span class="f_Heading3">Скрипты</span></h3>
|
||
<p class="p_Normal">Взаимодействовать с микросервисами можно через API, предоставляемый скриптами. Он доступен в серверных скриптах и только в модуле, к которому принадлежит микросервис, например, в виджетах или бизнес-процессах модуля. В клиентских скриптах доступа к микросервисам нет. </p>
|
||
<p class="p_Normal">Доступ к сервисам осуществляется через пространство имён <code><b>Namespace.services</b></code>. Если модуль не содержит переносимых сервисов, то это пространство имён будет отсутствовать в автозаполнении скриптов.</p>
|
||
<p class="p_Normal">Для взаимодействия с микросервисом следует использовать метод <code><b>fetch</b></code>.</p>
|
||
<p class="p_Normal">Простой GET-запрос без дополнительных параметров отправляется, если указать в качестве параметра относительный путь до API микросервиса. </p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">const res = await Namespace.services.vap.fetch("/SayHello");</span><br />
|
||
<span class="f_CodeExample">if (res.ok) {</span><br />
|
||
<span class="f_CodeExample">const resText = await res.text();</span><br />
|
||
<span class="f_CodeExample">}</span></p>
|
||
<p class="p_Normal">Чтобы отправить другой тип запроса, указать параметры, задать заголовки и тело запроса, можно воспользоваться методом <code><b>fetch</b></code>, в качестве второго параметра которого передаётся <code><b>FetchRequest</b></code>.</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">const res = await Namespace.services.vap.fetch("/RememberMe", {</span><br />
|
||
<span class="f_CodeExample"> method: 'POST',</span><br />
|
||
<span class="f_CodeExample"> headers: {</span><br />
|
||
<span class="f_CodeExample"> Authorization: 'myToken',</span><br />
|
||
<span class="f_CodeExample"> },</span><br />
|
||
<span class="f_CodeExample"> body: JSON.stringify({</span><br />
|
||
<span class="f_CodeExample"> name: 'Ivan',</span><br />
|
||
<span class="f_CodeExample"> age: 27,</span><br />
|
||
<span class="f_CodeExample"> })</span><br />
|
||
<span class="f_CodeExample"> } );</span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">Для проверки состояния микросервиса используется метод <code><b>status</b></code>. Результатом будет перечисление <code><b>ServiceStatus</b></code>, несущее информацию о текущем статусе.</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">const info = await Namespace.services.vap.status();</span></p>
|
||
<h3 class="p_Heading3"><a id="communication-between-two-services" class="hmanchor"></a><span class="f_Heading3">Обмен данными между двумя переносимыми сервисами</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">В поставках ELMA365 On‑Premises и SaaS Enterprise можно организовать взаимодействие между микросервисами внутри одного модуля. Путь доступа настраивается с помощью переменных окружения. </span></p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><span style="font-size: 15px; font-family: Inter;">Подробнее читайте в статье </span><span style="font-size: 15px; font-family: Inter; color: #0563c1;"><a href="development-key-points.html#communication-between-services" class="topiclink">«Рекомендации по разработке микросервисов для переносимых сервисов»</a></span><span style="font-size: 15px; font-family: Inter;">.</span></p>
|
||
<h2 class="p_Heading2"><a id="export-import" class="hmanchor"></a><span class="f_Heading2">Экспорт и импорт модуля с сервисом</span></h2>
|
||
<p class="p_Normal">Экспорт и импорт модуля, имеющего переносимые сервисы, возможен только в случае, если <span style="font-weight: bold;">Переносимые сервисы </span>разблокированы.</p>
|
||
|
||
<div class="bottom-nav">
|
||
|
||
<a id="prev-link" class="topic__navi_prev" href="events_processing.html">
|
||
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
|
||
class="bottom-nav__link">events_processing.html</span>
|
||
</a>
|
||
|
||
|
||
<a id="next-link" class="topic__navi_next" href="module-external-app.html">
|
||
<span class="bottom-nav__link">module-external-app.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>
|
||
</body>
|
||
|
||
</html>
|