Files
help365/platform/install-istio.html
koziavin 00717a92fb
All checks were successful
Deploy Static Site / deploy (push) Successful in 6m6s
update
2025-05-29 16:42:45 +04:00

287 lines
28 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<title>Install Istio</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="Istio is an alternative to Linkerd and represents a dedicated level of infrastructure called Service Mesh. It helps manage communication between services, handle retries,..." />
<meta name="picture" content="" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Full documentation for BRIX365 platform. Low-code developer guide. User guide. Admin guide. Developer guide." />
<meta property="og:url" content="https://brix365.com/en/help" />
<meta property="og:image" content="" />
<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>!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://brix365.com/en/help">
<img src="./logo-en.svg" alt="header logo">
</a>
<!-- <div class="hero__search-form" id="search-panel">
<form class="search-form" onsubmit="ym(83180416,'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://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a class="project-link" href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a class="project-link" href="https://brix365.com/en/help/crm/crm_overview.html">CRM</a></li><li><a class="project-link" href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a class="project-link" href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li><li><a class="project-link" href="https://brix365.com/en/help/business_solutions/-elma365-store.html">Business Solutions</a></li></ul></span></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li><li><a href="https://tssdk.brix365.com/" target="_blank">SDK</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://brix365.com/en/help">
<img src="./logo-light-en.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">BRIX On-Premises</a> &gt; <a href="elma365-enterprise.html">BRIX On-Premises Enterprise</a> &gt; Install add-on components for BRIX / Install Istio</p>
</div>
</div>
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Install Istio</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">Istio is an alternative to Linkerd and represents a dedicated level of infrastructure called Service Mesh. It helps manage communication between services, handle retries, timeouts, and automatically encrypt connections.</p>
<p class="p_Normal">Installing the Istio add-on component provides balancing of gRPC traffic when scaling BRIX services. It also provides telemetry — success rates, latencies, etc.</p>
<p class="p_Normal">Service Mesh is a necessary component to enable support for scaling services on the side of the BRIX application. Without an installed Service Mesh, traffic balancing when scaling BRIX microservices will not work correctly.</p>
<p class="p_Normal">Installation consists of five steps:</p>
<ol style="list-style-type:decimal">
<li value="1" class="p_Normal"><a href="install-istio.html#change-parameters" class="topiclink">Modify kernel parameters on worker nodes (optional)</a>.</li><li value="2" class="p_Normal"><a href="install-istio.html#download-helm-chart-and-config-file" class="topiclink">Downloading the Helm chart and configuration file</a>.</li><li value="3" class="p_Normal"><a href="install-istio.html#fill-config-file" class="topiclink">Fill out the configuration file</a>.</li><li value="4" class="p_Normal"><a href="install-istio.html#install-istio-chart" class="topiclink">Install the Istio chart using helm in the Kubernetes cluster</a></li><li value="5" class="p_Normal"><a href="install-istio.html#switch-on-istio" class="topiclink">Enable Istio in the namespace with the BRIX application</a>.</li></ol>
<h2 class="p_Heading2"><a id="change-parameters" class="hmanchor"></a><span class="f_Heading2">Step 1: Modify kernel parameters on worker nodes (optional)</span></h2>
<p class="p_Normal">Before installation, ensure that the operating system parameters are set correctly. If parameters for increasing <span style="font-weight: bold;">inotify</span> limits are not set, add them to the configuration file <code><b>/etc/sysctl.conf</b></code>:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sudo</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">nano</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">/etc/sysctl.conf</span><br />
<span class="f_CodeExample">fs.inotify.max_user_instances</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">1024</span><br />
<span class="f_CodeExample">fs.inotify.max_user_watches</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">1048576</span></p>
<p class="p_Normal">Update the parameter values with the following command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">sysctl</span><span class="f_CodeExample" style="color: #ffffff;">&nbsp;</span><span class="f_CodeExample">-p</span></p>
<h2 class="p_Heading2"><a id="download-helm-chart-and-config-file" class="hmanchor"></a><span class="f_Heading2">Step 2: Download the Helm chart and configuration file</span></h2>
<p class="p_Normal">For installation via the internet, get the configuration file <code><b>values-istio.yaml</b></code> by executing the command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">helm&nbsp;repo&nbsp;add&nbsp;elma365&nbsp;</span><span class="f_CodeExample">https://charts.elma365.tech</span><br />
<span class="f_CodeExample">helm&nbsp;repo&nbsp;update</span><br />
<span class="f_CodeExample">helm&nbsp;show&nbsp;values&nbsp;elma365/istio&nbsp;&gt;&nbsp;values-istio.yaml</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','TOGGLE0186A1')">Obtaining the configuration file for installation in a closed-loop environment without internet access</a></p>
<div id="TOGGLE0186A1" class="dropdown-toggle-body" style="text-align: left; text-indent: 0; line-height: 1.80; 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"><ol style="list-style-type:decimal">
<li value="1" class="p_Normal">On a computer with internet access, download the BRIX images and upload them to your local image registry:</li></ol>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">helm repo add elma365 </span><span class="f_CodeExample">https://charts.elma365.tech</span><br />
<span class="f_CodeExample">helm repo update</span><br />
<span class="f_CodeExample">helm pull elma365/istio</span></p>
<p class="p_Normal">For more details, see <a href="downloadin-images-elma365.html" class="topiclink">Download BRIX images</a>.</p>
<ol style="list-style-type:decimal" start="2">
<li value="2" class="p_Normal">Copy the downloaded chart archive <code><b> istio-X.Y.Z.tgz</b></code> to the server where the installation will be performed.</li><li value="3" class="p_Normal">Unpack this chart and copy the default configuration file <code><b>values.yaml</b></code> to <code><b>values-istio.yaml</b></code>:</li></ol>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">tar&nbsp;-xf&nbsp;istio-X.Y.Z.tgz</span></p>
</td>
</tr>
</table>
</div>
<h2 class="p_Heading2"><a id="fill-config-file" class="hmanchor"></a><span class="f_Heading2">Step 3: Fill out the configuration file</span></h2>
<p class="p_Normal">Fill out the configuration file <code><b>values-istio.yaml</b></code> for the installation of the Istio service.</p>
<p class="p_Normal">For the <code><b>istioNamespace</b></code> parameter, specify the <code><b>namespace</b></code> in which Istio is being installed.</p>
<p class="p_Normal">To ensure high availability of Istio: </p>
<ul style="list-style-type:disc">
<li class="p_Normal">enable service autoscaling and set the minimum and maximum number of replicas in the parameters <code><b>pilot.autoscaleMin</b></code> and <code><b>pilot.autoscaleMax</b></code>;</li><li class="p_Normal">without autoscaling, set the number of service replicas in the parameter <code><b>pilot.replicaCount</b></code>.</li></ul>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample"># Istio settings</span><br />
<span class="f_CodeExample">global:</span><br />
<span class="f_CodeExample">  # namespace for Istio (must be created before installation using kubectl create ns)</span><br />
<span class="f_CodeExample">  istioNamespace:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">istio-system</span><br />
<span class="f_CodeExample">...</span><br />
<span class="f_CodeExample">istiod:</span><br />
<span class="f_CodeExample">  pilot:</span><br />
<span class="f_CodeExample">  &nbsp; # service autoscaling</span><br />
<span class="f_CodeExample">  &nbsp; autoscaleEnabled:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample" style="font-weight: bold;">true</span><br />
<span class="f_CodeExample">  &nbsp; # minimum and maximum number of replicas</span><br />
<span class="f_CodeExample">  &nbsp; autoscaleMin:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">1</span><br />
<span class="f_CodeExample">  &nbsp; autoscaleMax:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">5</span><br />
<span class="f_CodeExample">  &nbsp; # number of service replicas without autoscaling</span><br />
<span class="f_CodeExample">  &nbsp; replicaCount:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">1</span><br />
<span class="f_CodeExample">...</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')">Fill out the parameters for connecting to a private registry for installation in a closed-loop environment without internet access</a></p>
<div id="TOGGLE0186A2" class="dropdown-toggle-body" style="text-align: left; text-indent: 0; line-height: 1.80; 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">&nbsp;<br />
To connect to a private registry, you need to:</p>
<ol style="list-style-type:decimal">
<li value="1" class="p_Normal">Download BRIX images and upload them to the local image registry. For more details, see <a href="downloadin-images-elma365.html" class="topiclink">Download BRIX images</a>.</li><li value="2" class="p_Normal">Set the address and path for the parameter <code><b>global.hub</b></code>.</li><li value="3" class="p_Normal">Specify the name of the secret with access rights to the private registry in the parameter <code><b>global.imagePullSecrets</b></code>. The secret must be manually created and encrypted in Base64.</li></ol>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample"># Istio settings</span><br />
<span class="f_CodeExample">global:</span><br />
<span class="f_CodeExample">...</span><br />
<span class="f_CodeExample">  # parameters for connecting to a private registry</span><br />
<span class="f_CodeExample">  # address and path for the private registry</span><br />
<span class="f_CodeExample">  hub:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">registry.example.com/istio</span><br />
<span class="f_CodeExample">  tag:</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">1.19.0</span><br />
<span class="f_CodeExample">  # the secret with access rights to the private registry must be manually created, encrypted in Base64</span><br />
<span class="f_CodeExample">  imagePullSecrets:</span><br />
<span class="f_CodeExample">  &nbsp; - myRegistryKeySecretName</span><br />
<span class="f_CodeExample">...</span></p>
<p class="p_Normal">Where repository<span style="font-weight: bold;"> </span>format is:</p>
<ul style="list-style-type:disc">
<li class="p_Normal">Address is <code><b>registry.example.com</b></code>.</li><li class="p_Normal">Path is <code><b>/istio</b></code>.</li></ul>
</td>
</tr>
</table>
</div>
<h2 class="p_Heading2"><a id="install-istio-chart" class="hmanchor"></a><span class="f_Heading2">Step 4: Install the Istio chart using helm in the Kubernetes cluster</span></h2>
<p class="p_Normal">Install the Istio chart in <code><b>namespace istio-system</b></code>. <code><b>Namespace</b></code> will be created during installation if it was not previously created.</p>
<p class="p_Normal">For installation via the internet:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">helm&nbsp;upgrade&nbsp;--install&nbsp;istio&nbsp;elma365/istio&nbsp;-f&nbsp;values-istio.yaml&nbsp;-n&nbsp;istio-system&nbsp;--create-</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span></p>
<p class="p_Normal">For offline installation without internet access, go to the directory with the downloaded chart and execute the command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">helm&nbsp;upgrade&nbsp;--install&nbsp;istio&nbsp;./istio&nbsp;-f&nbsp;values-istio.yaml&nbsp;-n&nbsp;istio-system&nbsp;--create-</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span></p>
<h2 class="p_Heading2"><a id="switch-on-istio" class="hmanchor"></a><span class="f_Heading2">Step 5: Enable Istio in the namespace with the BRIX application</span></h2>
<p class="p_Normal">In the described example, the BRIX application is installed in <code><b>namespace elma365</b></code>.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Начало&nbsp;внимание</span></p>
<p class="p_Normal">The concurrent operation of multiple Service Meshes is not allowed.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Конец&nbsp;внимание</span></p>
<p class="p_Normal"><span style="font-weight: bold;">Important</span>: before enabling Istio, you must check and disable other Service Mesh in the namespace where the BRIX application is installed.</p>
<p class="p_Normal">To disable Linkerd, remove the <code><b>namespace</b></code> annotation with the BRIX application:</p>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">kubectl annotate </span><span class="f_CodeExample" style="font-weight: bold;">namespace </span><span class="f_CodeExample">elma365 linkerd.io/inject-</span></p>
<p class="p_Normal">Add a &nbsp;label to the <code><b>namespace</b></code> with the BRIX application for automatic injection of Istio-proxy containers into the BRIX services using the command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;label&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">namespace&nbsp;</span><span class="f_CodeExample">elma365&nbsp;istio-injection=enabled&nbsp;--overwrite</span></p>
<p class="p_Normal">Restart all BRIX application services using the command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;rollout&nbsp;restart&nbsp;deploy&nbsp;[-n&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span><span class="f_CodeExample">]&nbsp;&amp;&amp;&nbsp;kubectl&nbsp;rollout&nbsp;restart&nbsp;ds&nbsp;[-n&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span><span class="f_CodeExample">]</span></p>
<h2 class="p_Heading2"><span class="f_Heading2">Delete the Istio chart using helm in the Kubernetes cluster</span></h2>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Начало&nbsp;внимание</span></p>
<p class="p_Normal">Before removing the Istio add-on component, disable autoscaling on the side of the BRIX application.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Конец&nbsp;внимание</span></p>
<p class="p_Normal">To delete the Istio chart in the <code><b>namespace istio-system</b></code>, execute the command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">helm&nbsp;uninstall&nbsp;istio&nbsp;-n&nbsp;istio-system</span></p>
<div class="bottom-nav">
<a id="prev-link" class="topic__navi_prev" href="install-ingress-nginx.html">
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
class="bottom-nav__link">install-ingress-nginx.html</span>
</a>
<a id="next-link" class="topic__navi_next" href="install-nodelocal-dns-cache.html">
<span class="bottom-nav__link">install-nodelocal-dns-cache.html</span> <span
class="bottom-nav__arrow bottom-nav__arrow--next"></span>
</a>
</div>
<!-- добавляет на страницу строку блок Была ли статья полезной? -->
<div class="feedback" id="feedback"><div class="feedback-help"><span><b>Was this helpful?</b></span><form action="" method="POST" class="feedback-form" id="feedback-form"><div class="feedback__popup feedback__popup-response" id="feedback__popup_thx" style="display: none;">Thanks for your feedback!</div><div class="feedback__popup" id="feedback__popup_why" style="display: none;"><div class="feedback__popup-header">Please specify why:</div><input type="radio" name="category" id="bad_recommendation" value="bad_recommendation"><label for="bad_recommendation">Recommendations did not help me</label><input type="radio" name="category" id="difficult_text" value="difficult_text"><label for="difficult_text">Article is hard to understand</label><input type="radio" name="category" id="no_answer" value="no_answer"><label for="no_answer">Didn`t answer my question</label><input type="radio" name="category" id="bad_header" value="bad_header"><label for="bad_header">Content does not match the topic</label><input type="radio" name="category" id="other_reason" value="other_reason"><label for="other_reason">Other</label></div><div class="feedback__popup" id="feedback__popup-other" style="display: none;"><div class="feedback__popup-header">How we can improve it?</div><textarea class="feedback__textarea" name="other" id=""></textarea><input type="submit" class="feedback__other-btn" value="Submit"></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" class="small-img" alt="like"><spanclass="feedback-form__btn-group_yes-btn">Yes</spanclass="feedback-form__btn-group_yes-btn"></label><input type="radio" name="useful" id="feedback__useful_no" value="false"><label for="feedback__useful_no"><img src="dislike.svg" class="small-img" alt="dislike"><spanclass="feedback-form__btn-group_no-btn">No</spanclass="feedback-form__btn-group_no-btn"></label></div><select name="category"><option disabled="">Please specify why</option><option value="bad_recommendation" selected="">Recommendations did not help me</option><option value="difficult_text">Article is hard to understand</option><option value="no_answer">Didn`t answer my question</option><option value="bad_header">Content does not match the topic</option><option value="other_reason">Other</option></select><input type="submit"></form></div><div class="found_typo"><p style="margin: 0px; margin-top: 16px !important;"><span><b>Found a typo?</b></span> Select it and press <i>Ctrl+Enter</i> to send us feedback</p></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">In this topic</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://brix365.com/en/" target="_blank">BRIX</a></li><li><a href="https://tssdk.brix365.com/en/latest/" target="_blank">SDK</a></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li></ul><ul class="footer-mobile__list"><li><a href="https://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li></ul>
</div>
<div class="footer-wrap">
<div><span class="mobile-question-popup">Send feedback</span><form method="POST" action class="question__popup question-xs" id="question__popup"><div class="question-wrap"><span class="close"></span><span class="title">Ask a question</span><label for="help_question" style="display: none;"></label><textarea name="help_question" id="help_question"></textarea><input type="submit" value="Send"></div></form><div class="hidden fade-in question-success-xs">Sent</div></div>
<div class="footer-flex-b">
<span class="footer-copy">&copy; 2025 BRIX</span>
<ul class="footer-list">
<li class="footer-item">
<a href="#" class="arrow-top" style="display: block;"></a>
</li>
</ul>
</div>
</div>
</div>
</footer>
<iframe name="hmnavigation" style="display:none!important"></iframe>
<script src="./jquery-ui.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>