update help elma

This commit is contained in:
2025-05-27 21:32:35 +04:00
parent a6b05d6789
commit 898b22bf32
4500 changed files with 89372 additions and 120699 deletions

View File

@ -1,20 +1,19 @@
<!DOCTYPE html>
<html lang="ru">
<html lang="en">
<head>
<title>Резервное копирование внешними средствами</title>
<title>External BRIX backup</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="Резервное копирование ELMA365 должно выполняться в составе:" />
<meta name="description" content="BRIX backup must be done for: PostgreSQL. The database stores main system data: users, app items, settings of apps and workspaces, processes, pages, widgets, tasks, events and..." />
<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" />
<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" />
@ -24,7 +23,6 @@
<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>
@ -36,16 +34,16 @@
</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 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(83179930,'reachGoal','poisk')">
<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">
@ -65,7 +63,7 @@
</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>
<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>
@ -80,8 +78,8 @@
<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 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>
@ -94,15 +92,15 @@
<div class="article-inner">
<div class="content">
<header class="article__header">
<div class="article__bread" style="display:flex; gap:10px;">
<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> &gt; <a href="elma365-enterprise.html">ELMA365 On-Premises Enterprise</a> / Резервное копирование внешними средствами</p>
<p><a href="elma365-on-premises.html">BRIX On-Premises</a> &gt; <a href="elma365-enterprise.html">BRIX On-Premises Enterprise</a> / External BRIX backup</p>
</div>
</div>
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Резервное копирование внешними средствами</span></h1>
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">External BRIX backup</span></h1>
</div>
</header>
@ -111,101 +109,101 @@
<a href="#h1-article" class="scroll-top"></a>
</div>
<!-- Placeholder for topic body. -->
<p class="p_Normal">Резервное копирование ELMA365 должно выполняться в составе:</p>
<p class="p_Normal">BRIX backup must be done for:</p>
<ul style="list-style-type:disc">
<li class="p_Normal">PostgreSQL — в базе данных хранятся основные данные системы: пользователи, элементы приложений, настройки приложений, разделов, процессы, страницы, виджеты, задачи, события и другие настройки конфигурации;</li><li class="p_Normal">MongoDB — в базе данных хранятся неструктурированные системные настройки, данные чатов и ленты;</li><li class="p_Normal">S3 Object Storage — в объектном хранилище находятся загружаемые и создаваемые в ELMA365 файлы любого типа и объема, такие как документы, фотографии, аудио и видео файлы.</li></ul>
<p class="p_Normal">Для получения доступа к базам данных внутри кластера необходимо пробросить порт соответствующих сервисов:</p>
<li class="p_Normal">PostgreSQL. The database stores main system data: users, app items, settings of apps and workspaces, processes, pages, widgets, tasks, events and other configuration settings.</li><li class="p_Normal">MongoDB. The database stores unstructured system settings, data from chats and activity stream.</li><li class="p_Normal">S3 Object Storage. It stores the uploaded files as well as files created in BRIX of any type and size, such as documents, photos, audio and video files.</li></ul>
<p class="p_Normal">To access the database inside a cluster, forward the port of corresponding services:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;port-forward&nbsp;postgres-0&nbsp;5432:5432&nbsp;--address&nbsp;0.0.0.0</span><br />
<span class="f_CodeExample">kubectl&nbsp;port-forward&nbsp;mongo-0&nbsp;27017:27017&nbsp;--address&nbsp;0.0.0.0</span><br />
<span class="f_CodeExample">kubectl&nbsp;port-forward&nbsp;minio-&lt;name-pod&gt;&nbsp;9000:9000&nbsp;--address&nbsp;0.0.0.0</span></p>
<p class="p_Normal">Для получения информации о строках подключения к базам данных выполните следующую команду. Для выполнения команды необходимо установить пакет <span style="font-weight: bold;">jq</span>:</p>
<p class="p_Normal">To obtain information about connection strings for databases, run the following command. For the command to be executed, you need to install the <span style="font-weight: bold;">jq</span> package.</p>
<ul style="list-style-type:disc">
<li class="p_Normal">для установки ELMA365 Helm-пакетом в Kubernetes-кластер:</li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;get&nbsp;secrets/elma365-db-connections&nbsp;-o&nbsp;json&nbsp;|&nbsp;jq&nbsp;'.data&nbsp;|&nbsp;map_values(@base64d)'</span></p>
<li class="p_Normal">To install BRIX with a Helm package to an existing Kubernetes cluster:</li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;get&nbsp;secrets/BRIX-db-connections&nbsp;-o&nbsp;json&nbsp;|&nbsp;jq&nbsp;'.data&nbsp;|&nbsp;map_values(@base64d)'</span></p>
<ul style="list-style-type:disc">
<li class="p_Normal">для установки ELMA365 в Kubernetes-in-Docker:</li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">docker&nbsp;exec&nbsp;elma365&nbsp;kubectl&nbsp;get&nbsp;secrets/elma365-db-connections&nbsp;-o&nbsp;json&nbsp;|&nbsp;jq&nbsp;'.data&nbsp;|&nbsp;map_values(@base64d)'</span></p>
<h2 class="p_Heading2"><a id="backup" class="hmanchor"></a><span class="f_Heading2">Резервное копирование</span></h2>
<h3 class="p_Heading3"><a id="backup-posgresql" class="hmanchor"></a><span class="f_Heading3">Резервное копирование PostgreSQL</span></h3>
<p class="p_Normal">Имеется несколько вариантов создания резервных копий баз данных PostgreSQL.</p>
<p class="p_Normal"><span style="font-weight: bold;">Вариант 1. Физическое копирование</span></p>
<p class="p_Normal">Утилита <code><b>pg_basebackup</b></code> позволяет делать резервную копию на уровне файловой системы. Её можно использовать для восстановления на определённый момент времени, предварительно настроив <span style="font-weight: bold;">Point-in-time-recovery</span> (PITR), обеспечивающий непрерывное резервное копирование данных таблиц. Резервные копии всегда создаются для всего кластера базы данных, резервное копирование отдельных баз данных невозможно.</p>
<li class="p_Normal">To install BRIX to Kubernetes-in-Docker:</li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">docker&nbsp;exec&nbsp;BRIX&nbsp;kubectl&nbsp;get&nbsp;secrets/BRIX-db-connections&nbsp;-o&nbsp;json&nbsp;|&nbsp;jq&nbsp;'.data&nbsp;|&nbsp;map_values(@base64d)'</span></p>
<h2 class="p_Heading2"><span class="f_Heading2">Backup</span></h2>
<h3 class="p_Heading3"><span class="f_Heading3">PostgreSQL backup</span></h3>
<p class="p_Normal">There are several ways to create backup copies of PostgreSQL databases.</p>
<p class="p_Normal"><span style="font-weight: bold;">Option 1: Physical backup copy</span></p>
<p class="p_Normal">The <span style="font-weight: bold;">pg_basebackup</span> utility helps make a backup copy of database files. It can be used for point-in-time recovery (PITR) which guarantees that data is copied from tables continuously. The copies are created for the entire cluster, individual databases cannot be backed up.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало&nbsp;внимание</span></p>
<p class="p_Normal">Резервное копирование выполняется через обычное соединение PostgreSQL и использует протокол репликации. Соединение должно быть выполнено с правами суперпользователя или пользователя с разрешениями REPLICATION.</p>
<p class="p_Normal"><span style="font-size: 15px;">The backup copy is created over a regular </span><span style="font-size: 15px;">PostgreSQL</span><span style="font-size: 15px;"> connection that uses the replication protocol. The connection must be made by a user with </span><span style="font-size: 15px; font-family: 'Courier New',Courier,monospace;">REPLICATION</span><span style="font-size: 15px;"> permissions or by a superuser</span>.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец&nbsp;внимание</span></p>
<p class="p_Normal">Полная резервная копия создается следующей командой:</p>
<p class="p_Normal">Use the following command to create a complete backup copy:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">pg_basebackup&nbsp;-h&nbsp;&lt;postgresql-server-address&gt;&nbsp;-p&nbsp;5432&nbsp;-U&nbsp;postgres&nbsp;-D&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;&nbsp;-Ft&nbsp;-z&nbsp;-Xs&nbsp;-P</span></p>
<p class="p_Normal">Чтобы выполнить команду <code><b>pg_basebackup</b></code> с удаленного сервера (например, адрес сервера 192.168.1.10), нужно разрешить это подключение. Для этого в файл <code><b>pg_hba.conf</b></code> добавьте строку: </p>
<p class="p_Normal">To run <span style="font-weight: bold;">pg_basebackup</span> from a remote server (for example, from 192.168.1.10), set it up to accept the connection. For that, add the following line to the <code><b>pg_hba.conf</b></code> file: </p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">host&nbsp;replication&nbsp;all&nbsp;192.168.1.10/32&nbsp;md5</span></p>
<p class="p_Normal">После внесения изменений в <code><b>pg_hba.conf</b></code> перезапустите PostgreSQL для их применения.</p>
<p class="p_Normal">Для непрерывного (<span style="font-weight: bold;">PiTR</span>) архивирования PostgreSQL требуется включить архивирование <span style="font-weight: bold;">WAL</span>. Для этого в конфигурационном файле <code><b>/etc/postgresql/10/main/postgresql.conf</b></code> настройте следующие параметры:</p>
<p class="p_Normal">After making changes in the <code><b>pg_hba.conf</b></code><span style="font-weight: bold;"> </span>file, restart PostgreSQL to apply them.</p>
<p class="p_Normal">For continious archiving of <span style="font-size: 15px;">PostgreSQL</span>, enable WAL. To do that, configure the following parameters in the<span style="font-weight: bold;"> </span><code><b>/etc/postgresql/10/main/postgresql.conf</b></code> configuration file:</p>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">wal_level</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">replica</span><br />
<span class="f_CodeExample">archive_mode</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">on</span><br />
<span class="f_CodeExample">archive_command</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">'test ! -f /backup/&lt;backup-postgresql-folder-name&gt;/postgresql_archives/%f &amp;&amp; cp %p /backup/&lt;backup-postgresql-folder-name&gt;/postgresql_archives/%f'</span><br />
<span class="f_CodeExample">archive_timeout</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">300</span></p>
<p class="p_Normal">Там же необходимо установить значение параметра <code><b>data_directory</b></code>, если оно не определено. Иначе модуль резервного копирования не сможет определить местоположение файлов СУБД, например для PostgreSQL 10:</p>
<p class="p_Normal">In the same file, configure the value of the <code><b>data_directory</b></code><span style="font-weight: bold;"> </span>parameter if it is not defined. If it is not configured, the backup module will not be able to determine the locations of database files, for example, for PostgreSQL 10:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">data_directory&nbsp;=&nbsp;'/var/lib/postgresql/10/main'&nbsp;</span></p>
<p class="p_Normal">После внесения изменений перезапустите PostgreSQL при помощи команды:</p>
<p class="p_Normal">After making the changes, run the following command to restart PostgreSQL:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">service&nbsp;postgresql&nbsp;restart</span></p>
<p class="p_Normal">Значение параметра <code><b>archive_command</b></code> должно содержать в файловой системе сервера PostgreSQL каталог, в который будут копироваться архивируемые сегменты <span style="font-weight: bold;">WAL</span>.</p>
<p class="p_Normal"><span style="font-weight: bold;">Вариант 2. Логическое копирование</span></p>
<p class="p_Normal">Утилита <code><b>pg_dump</b></code><span style="font-weight: bold;"> </span>создает за один раз резервную копию только одной базы данных, и она не включает информацию о ролях и табличных пространствах. Во время работы <code><b>pg_dump</b></code> будут заблокированы только операции, требующие эксклюзивной блокировки. В итоге изменения, вносимые в базу во время работы <code><b>pg_dump</b></code>, не будут добавляться в выходной файл архива.</p>
<p class="p_Normal">Резервная копия создается следующей командой:</p>
<p class="p_Normal">The value of the <code><b>archive_command</b></code> parameter must contain the catalog in the PostgreSQL server to which WAL records will be archived.</p>
<p class="p_Normal"><span style="font-weight: bold;">Option 2: Logical copy</span></p>
<p class="p_Normal">The <span style="font-weight: bold;">pg_dump </span>utilty dumps a single database, and does not include information about roles and tablespaces. When <span style="font-weight: bold;">pg_dump</span> is running, the only operations locked are those requiring exclusive locks. This means that any changes made to the database during the dump will not be added to the output archive file.</p>
<p class="p_Normal">To create a backup copy, run the following command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">pg_dump&nbsp;&lt;postgresqlURL&gt;&nbsp;-C&nbsp;-c&nbsp;--if-exists&nbsp;-F&nbsp;directory&nbsp;-f&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;</span></p>
<h3 class="p_Heading3"><a id="backup-mongo" class="hmanchor"></a><span class="f_Heading3">Резервное копирование MongoDB</span></h3>
<p class="p_Normal">Утилита <code><b>mongodump</b></code> — это базовый инструмент логического резервного копирования, входящий в состав MongoDB, который создает двоичный экспорт содержимого базы данных или коллекций.</p>
<p class="p_Normal">Резервная копия создаётся следующей командой:</p>
<h3 class="p_Heading3"><span class="f_Heading3">MongoDB backup </span></h3>
<p class="p_Normal">The <span style="font-weight: bold;">mongodump</span> utility is a basic tool for logical backups. It is included in MongoDB and creates a binary export of a database's contents or a collection.</p>
<p class="p_Normal">To create a backup copy, run the following command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mongodump&nbsp;--uri&nbsp;&lt;mongodbURL&gt;&nbsp;--gzip&nbsp;--quiet&nbsp;--out&nbsp;/backup/&lt;backup-mongodb-folder-name&gt;</span></p>
<p class="p_Normal">Можно также включить флаг <code><b>--oplog</b></code> в случае резервного копирования набора реплик. Преимущество этого заключается в том, что выходные данные также будут включать в файл <code><b>oplog.bson</b></code> записи <code><b>oplog</b></code>, которые фиксируют данные, возникающие во время операции <code><b>mongodump</b></code>.</p>
<p class="p_Normal">Файл <code><b>oplog.bson</b></code> создаётся как часть вывода <code><b>mongodump</b></code>. Файл содержит записи, которые произошли во время операции <code><b>mongodump</b></code>. Это обеспечивает эффективный моментальный снимок состояния экземпляра mongod на момент времени. Эта опция работает только для узлов, поддерживающих oplog, т. е. для всех членов набора реплик.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Резервное копирование S3</span></h3>
<p class="p_Normal">Копирование файлов можно выполнять при помощи любой утилиты, которая подключается к S3, например <code><b>mc</b></code>.</p>
<p class="p_Normal">Добавьте хост в конфигурации <code><b>mc</b></code>:</p>
<p class="p_Normal">Enable <code><b>--oplog</b></code> for backing up replica sets. The output data will contain the <code><b>oplog.bson</b></code> file with the <code><b>oplog</b></code><span style="font-weight: bold;"> </span>entries with data that occur during the <code><b>mongodump</b></code> operation<span style="color: #001e2b; background-color: #ffffff;">.&nbsp;</span></p>
<p class="p_Normal">The <code><b>oplog.bson</b></code> file is created as part of the <code><b>mongodump</b></code> output and <span style="color: #001e2b; background-color: #ffffff;">provides an effective point-in-time snapshot of the state of the&nbsp;</span><code><b>mongodb</b></code><span style="color: #001e2b; background-color: #ffffff;">&nbsp;instance</span>. This option <span style="color: #001e2b; background-color: #ffffff;">only works for nodes that maintain an&nbsp;</span><code><b>oplog</b></code><span style="color: #001e2b; background-color: #ffffff;">, this includes all members of a replica set.</span></p>
<h3 class="p_Heading3"><span class="f_Heading3">S3 backup</span></h3>
<p class="p_Normal">Files can be copied with any utility that is connected to S3, for example, <span style="font-weight: bold;">mc</span>.</p>
<p class="p_Normal">Add host to <span style="font-weight: bold;">mc</span> configurations:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mc&nbsp;alias&nbsp;set&nbsp;&lt;alias&gt;&nbsp;&lt;s3-endpoint&gt;&nbsp;&lt;access-key&gt;&nbsp;&lt;secret-key&gt;&nbsp;--api&nbsp;&lt;api-signature&gt;</span></p>
<p class="p_Normal">Синхронизируйте содержимое корзины в каталог локальной файловой системы.</p>
<p class="p_Normal">Sync the bucket contents with the file system catalog.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mc&nbsp;mirror&nbsp;&lt;alias&gt;/&lt;bucket&gt;&nbsp;/backup/&lt;backup-s3-folder-name&gt;</span></p>
<h2 class="p_Heading2"><a id="recovery" class="hmanchor"></a><span class="f_Heading2">Восстановление из резервной копии</span></h2>
<p class="p_Normal">Перед восстановлением баз данных необходимо остановить все сервисы приложения и дождаться их завершения, например, при помощи следующих команд:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;scale&nbsp;deploy&nbsp;--replicas=0&nbsp;--all&nbsp;-l&nbsp;'app&nbsp;notin&nbsp;(minio)'&nbsp;[--namespace&nbsp;&lt;elma365-namespace&gt;]</span><br />
<span class="f_CodeExample">kubectl&nbsp;[--namespace&nbsp;&lt;elma365-namespace&gt;]&nbsp;patch&nbsp;daemonset&nbsp;billing&nbsp;-p&nbsp;'{&quot;spec&quot;:&nbsp;{&quot;template&quot;:&nbsp;{&quot;spec&quot;:&nbsp;{&quot;nodeSelector&quot;:&nbsp;{&quot;non-existing&quot;:&nbsp;&quot;true&quot;}}}}}'</span></p>
<p class="p_Normal">Пересоздать базы PostgreSQL и MongoDB. Подробнее об этом читайте в статьях <a href="postgresql.html#prepare-to-recovery" class="topiclink">«PostgreSQL»</a> и <a href="mongodb.html#prepare-to-recovery" class="topiclink">«MongoDB»</a>.</p>
<p class="p_Normal">После этого выполните восстановление баз данных.</p>
<h2 class="p_Heading2"><a id="recovery-posgresql" class="hmanchor"></a><span class="f_Heading2">Восстановление PostgreSQL</span></h2>
<h3 class="p_Heading3"><span class="f_Heading3">Восстановление физической копии PostgreSQL</span></h3>
<p class="p_Normal">Для восстановления или запуска на новом месте резервной копии, полученной в результате работы <code><b>pg_basebackup</b></code>, достаточно остановить PostgreSQL-сервер, распаковать и подменить содержимое его директории данных базовой резервной копией и архивом <span style="font-weight: bold;">WAL</span>. Например, для PostgreSQL версии 10: </p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">systemctl&nbsp;stop&nbsp;postgresql</span><br />
<span class="f_CodeExample">mv&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/10/main&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/10/main.old</span><br />
<span class="f_CodeExample">mkdir&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/10/main</span><br />
<span class="f_CodeExample">tar&nbsp;xvf&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;/base.tar.gz&nbsp;-C&nbsp;&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/10/main</span><br />
<span class="f_CodeExample">tar&nbsp;xvf&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;/pg_wal.tar.gz&nbsp;-C&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/10/main/pg_wal</span><br />
<span class="f_CodeExample">chown&nbsp;-R&nbsp;postgres:postgres&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql&nbsp;</span><br />
<span class="f_CodeExample">chmod&nbsp;-R&nbsp;go-rwx&nbsp;/</span><span class="f_CodeExample" style="font-weight: bold;">var</span><span class="f_CodeExample">/lib/postgresql/</span><br />
<span class="f_CodeExample">systemctl&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">start</span><span class="f_CodeExample">&nbsp;postgresql</span></p>
<p class="p_Normal">Для восстановления кластера PostgreSQL до состояния, в котором он находился в определённый момент времени, необходимо остановить сервер PostgreSQL, восстановить последнюю полную резервную копию, смонтировать файловую систему с архивными файлами <span style="font-weight: bold;">WAL</span> и создать файл<span style="font-weight: bold;"> </span><code><b>/var/lib/postgresql/10/main/recovery.conf</b></code> со следующим содержимым:</p>
<h3 class="p_Heading3"><a id="restore" class="hmanchor"></a><span class="f_Heading3">Recovery</span></h3>
<p class="p_Normal">Before recovering databases, you have to stop all the application services completely, for example, with the following commands</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;scale&nbsp;deploy&nbsp;--replicas=0&nbsp;--all&nbsp;-l&nbsp;'app&nbsp;notin&nbsp;(minio)'&nbsp;[--</span><span class="f_CodeExample" style="font-weight: bold;">namespace&nbsp;</span><span class="f_CodeExample">&lt;BRIX-</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span><span class="f_CodeExample">&gt;]</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;[--</span><span class="f_CodeExample" style="font-weight: bold;">namespace&nbsp;</span><span class="f_CodeExample">&lt;BRIX-</span><span class="f_CodeExample" style="font-weight: bold;">namespace</span><span class="f_CodeExample">&gt;]&nbsp;patch&nbsp;daemonset&nbsp;billing&nbsp;-p&nbsp;'{&quot;spec&quot;:&nbsp;{&quot;template&quot;:&nbsp;{&quot;spec&quot;:&nbsp;{&quot;nodeSelector&quot;:&nbsp;{&quot;non-existing&quot;:&nbsp;&quot;true&quot;}}}}}'</span></p>
<p class="p_Normal">Recreate PostgreSQL and MongoDB databases. To learn more, see <a href="postgresql.html#prepare-to-restore" class="topiclink">PostgreSQL</a> and <a href="mongodb.html#prepare-to-restore" class="topiclink">MongoDB</a>.</p>
<p style="line-height: 1.20; margin: 16px 0 16px 0;"><span style="font-size: 15px; color: #394149;">Then recover the databases.</span></p>
<h2 class="p_Heading2"><span class="f_Heading2">PostgreSQL recovery</span></h2>
<h3 class="p_Heading3"><span class="f_Heading3">Recover PostgreSQL physical copy</span></h3>
<p class="p_Normal">To recover a backup copy created via <span style="font-weight: bold;">pg_basebackup, </span>or to run it in a new location, all you have to do is stop the PostgreSQL server, unpack, and replace the contents of its database directory with the backup copy and the WAL archive. For example, for PostgreSQL version 10 : </p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">systemctl&nbsp;stop&nbsp;postgresql</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mv&nbsp;/var/lib/postgresql/10/main&nbsp;/var/lib/postgresql/10/main.old</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mkdir&nbsp;/var/lib/postgresql/10/main</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">tar&nbsp;xvf&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;/base.tar.gz&nbsp;-C&nbsp;&nbsp;/var/lib/postgresql/10/main</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">tar&nbsp;xvf&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;/pg_wal.tar.gz&nbsp;-C&nbsp;/var/lib/postgresql/10/main/pg_wal</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">chown&nbsp;-R&nbsp;postgres:postgres&nbsp;/var/lib/postgresql&nbsp;</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">chmod&nbsp;-R&nbsp;go-rwx&nbsp;/var/lib/postgresql/</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">systemctl&nbsp;start&nbsp;postgresql</span></p>
<p class="p_Normal">To restore the PostgreSQL cluster to the state it was in at a certain point in time, stop the PostgreSQL server, restore the latest complete backup copy, mount the WAL archive files to the file system and create the <code><b>/var/lib/postgresql/10/main/recovery.conf</b></code> file with the following contents:</p>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">restore_command</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">'cp /backup/&lt;backup-postgresql-folder-name&gt;/postgresql_archives/%f%p'</span><br />
<span class="f_CodeExample">recovery_target_time</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">'2022-02-08 11:20:00 UTC'</span><br />
<span class="f_CodeExample">recovery_target_inclusive</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample">=</span><span class="f_CodeExample" style="color: #ffffff;"> </span><span class="f_CodeExample" style="font-weight: bold;">false</span></p>
<p class="p_Normal">Затем запустите сервер PostgreSQL. При запуске он будет неоднократно вызывать <code><b>restore_command</b></code> скрипт получения файлов <span style="font-weight: bold;">WAL</span> для восстановления базы данных на определенный момент времени.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Восстановление логической копии PostgreSQL</span></h3>
<p class="p_Normal">Утилита <code><b>pg_restore</b></code> восстанавливает резервную копию, созданную утилитой <code><b>pg_dump</b></code>.</p>
<p class="p_Normal">Restart the PostgreSQL server. When restarting, it will call the <code><b>restore_command</b></code> script multiple times to get the WAL files for restoring the database at a certain stopping point.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Recover PostgreSQL logical copy</span></h3>
<p class="p_Normal">The <span style="font-weight: bold;">pg_restore</span> utility restores the backup created with <span style="font-weight: bold;">pg_dump</span>.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">pg_restore&nbsp;-d&nbsp;&lt;postgresqlURL&gt;&nbsp;-j&nbsp;1&nbsp;-F&nbsp;directory&nbsp;/backup/&lt;backup-postgresql-folder-name&gt;</span></p>
<h2 class="p_Heading2"><a id="recovery-mongo" class="hmanchor"></a><span class="f_Heading2">Восстановление MongoDB</span></h2>
<p class="p_Normal">Для восстановления базы данных используется утилита <code><b>mongorestore</b></code>. Восстановление выполняется следующим образом:</p>
<h2 class="p_Heading2"><span class="f_Heading2">Recover MongoDB</span></h2>
<p class="p_Normal">To recover the database, use the <span style="font-weight: bold;">mongorestore </span>utility. Recovery is done as follows:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mongorestore&nbsp;--uri&nbsp;&lt;mongodbURL&gt;&nbsp;--dir&nbsp;/backup/&lt;backup-mongodb-folder-name&gt;&nbsp;--drop&nbsp;--gzip&nbsp;--preserveUUID&nbsp;--excludeCollection=head.settings.view</span></p>
<p class="p_Normal">Для восстановления базы данных на момент времени применяется Oplogs. Скопируйте в каталог для восстановления только файл <code><b>oplog.bson</b></code>, полученный ранее с помощью команды:</p>
<p class="p_Normal">To reciver the database up to a certain point in time, use <code><b>oplogs</b></code>. Copy only the the <code><b>oplog.bson</b></code><span style="font-weight: bold;"> </span>file that you obtained earlier to the recovery catalog using the following command:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mongodump&nbsp;--oplog</span></p>
<p class="p_Normal">Запустите <code><b>mongorestore</b></code> с параметром <code><b>--oplogReplay</b></code><span style="font-weight: bold;"> </span>(убедитесь, что каталог содержит только <code><b>oplog.bson</b></code>)</p>
<p class="p_Normal">Run <span style="font-weight: bold;">mongorestore</span> with the <code><b>--oplogReplay</b></code> parameter<span style="font-weight: bold;"> </span>(make sure that the folder only contains <code><b>oplog.bson</b></code>)</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mongorestore&nbsp;--uri&nbsp;&lt;mongodbURL&gt;&nbsp;--oplogReplay&nbsp;--dir&nbsp;/backup/&lt;backup-mongodb-olplog-folder-name&gt;</span></p>
<h2 class="p_Heading2"><span class="f_Heading2">Восстановление S3</span></h2>
<p class="p_Normal">Восстановление файлов можно выполнять при помощи любой утилиты, которая подключается к S3, например <code><b>mc</b></code>.</p>
<p class="p_Normal">Добавьте хост в конфигурации <code><b>mc</b></code>:</p>
<h2 class="p_Heading2"><span class="f_Heading2">Recover S3</span></h2>
<p class="p_Normal">Database can be recovered with any utility that is connected to S3, for example, <span style="font-weight: bold;">mc</span>.</p>
<p class="p_Normal">Add host to the <span style="font-weight: bold;">mc</span> configuration:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mc&nbsp;alias&nbsp;set&nbsp;&lt;alias&gt;&nbsp;&lt;s3-endpoint&gt;&nbsp;&lt;access-key&gt;&nbsp;&lt;secret-key&gt;&nbsp;--api&nbsp;&lt;api-signature&gt;</span></p>
<p class="p_Normal">Синхронизируйте содержимое корзины в каталог локальной файловой системы.</p>
<p class="p_Normal">Sync the bucket contents with the file system catalog.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">mc&nbsp;mirror&nbsp;/backup/&lt;backup-s3-folder-name&gt;&nbsp;&lt;alias&gt;/&lt;bucket&gt;</span></p>
<p class="p_Normal">После восстановления резервной копии баз данных необходимо запустить все сервисы приложения, используя следующие команды:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;scale&nbsp;deploy&nbsp;--replicas=1&nbsp;--all&nbsp;[--namespace&nbsp;&lt;elma365-namespace&gt;]</span><br />
<span class="f_CodeExample">kubectl&nbsp;[--namespace&nbsp;&lt;elma365-namespace&gt;]&nbsp;patch&nbsp;daemonset&nbsp;billing&nbsp;--type&nbsp;json&nbsp;-p='[{&quot;op&quot;:&nbsp;&quot;remove&quot;,&nbsp;&quot;path&quot;:&nbsp;&quot;/spec/template/spec/nodeSelector/non-existing&quot;}]'</span></p>
<p class="p_Normal"><span class="f_CodeExample">&nbsp;</span></p>
<p class="p_Normal">After the backup copy has been restored, restart all the application services using the following commands:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;scale&nbsp;deploy&nbsp;--replicas=1&nbsp;--all&nbsp;[--namespace&nbsp;&lt;BRIX-namespace&gt;]</span></p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">kubectl&nbsp;[--namespace&nbsp;&lt;BRIX-namespace&gt;]&nbsp;patch&nbsp;daemonset&nbsp;billing&nbsp;--type&nbsp;json&nbsp;-p='[{&quot;op&quot;:&nbsp;&quot;remove&quot;,&nbsp;&quot;path&quot;:&nbsp;&quot;/spec/template/spec/nodeSelector/non-existing&quot;}]'</span></p>
<p class="p_Normal">&nbsp;</p>
<div class="bottom-nav">
@ -222,7 +220,7 @@
</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>
<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>
@ -230,7 +228,7 @@
<input type="checkbox" />
<div class="article__arrow"></div>
<div class="table-of-contents elma365-right" id="toc2Content">
<h3 class="h3-toc">В этой статье</h3>
<h3 class="h3-toc">In this topic</h3>
<nav id="toc2"></nav>
</div>
</aside>
@ -241,63 +239,30 @@
<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>
<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="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">&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">&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 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>
<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="./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>