+ );
+}
diff --git a/src/app/mnt/layout.tsx b/src/app/mnt/layout.tsx
new file mode 100644
index 00000000..fa87230d
--- /dev/null
+++ b/src/app/mnt/layout.tsx
@@ -0,0 +1,11 @@
+import { ReactNode } from 'react';
+
+import { ClientTransition } from './ClientTransition';
+
+export const metadata = {
+ title: 'Gml Первый запуск',
+};
+
+export default function MntLayout({ children }: { children: ReactNode }) {
+ return {children};
+}
diff --git a/src/app/mnt/license/page.tsx b/src/app/mnt/license/page.tsx
new file mode 100644
index 00000000..d710f2e7
--- /dev/null
+++ b/src/app/mnt/license/page.tsx
@@ -0,0 +1,202 @@
+'use client';
+
+import Image from 'next/image';
+import Link from 'next/link';
+import { useRouter } from 'next/navigation';
+
+import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/shared/ui/card';
+import { Button } from '@/shared/ui/button';
+import logo from '@/assets/logos/recloud.png';
+import { config } from '@/core/configs';
+
+export default function LicensePage() {
+ const router = useRouter();
+ return (
+
+
+
+ Лицензионное соглашение для Gml® Recloud LLC®
+
+
+
+
+
+ ООО «Реклауд»
+
+
+
+ Мы — компания «Реклауд», занимаемся разработкой программного обеспечения. Подробности
+ о нас и наших продуктах вы можете найти на сайте{' '}
+
+ recloud.tech
+
+ . По всем вопросам:{' '}
+
+ suport@recloud.tech
+
+
+
+
+
+ ОГРН: 1242900005083{' '}
+ (от 10 сентября 2024 г.)
+
+
+ ИНН/КПП: 2901318875 / 290101001
+
+
+ Юридический адрес: 163045, Архангельская область, г Архангельск, Талажское ш,
+ д. 9, офис 6
+
+
+
+
+ Перед продолжением установки, пожалуйста, ознакомьтесь с лицензионным соглашением{' '}
+ {config.name}. Ниже приведён англоязычный текст для справки, в котором упоминания
+ JetBrains заменены на Recloud, где это применимо. Нажимая «Принять и продолжить», вы
+ подтверждаете согласие с его условиями.
+
+
+ {`Лицензионное соглашение для Recloud® ${config.name}®
+
+ ВАЖНО! ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ: ЭТО ЮРИДИЧЕСКОЕ СОГЛАШЕНИЕ. ЗАГРУЖАЯ, УСТАНАВЛИВАЯ, КОПИРУЯ, СОХРАНЯЯ НА СВОЕМ КОМПЬЮТЕРЕ ИЛИ ИНЫМ ОБРАЗОМ ИСПОЛЬЗУЯ ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, ВЫ (ЛИЦЕНЗИАТ, КАК ОПРЕДЕЛЕНО НИЖЕ) СТАНОВИТЕСЬ СТОРОНОЙ ДАННОГО СОГЛАШЕНИЯ И СОГЛАШАЕТЕСЬ СОБЛЮДАТЬ ВСЕ УСЛОВИЯ И ПОЛОЖЕНИЯ ДАННОГО СОГЛАШЕНИЯ.
+
+ ЕСЛИ ВЫ НЕ СОГЛАСНЫ С УСЛОВИЯМИ И ПОЛОЖЕНИЯМИ НАСТОЯЩЕГО СОГЛАШЕНИЯ, ВАМ НЕ СЛЕДУЕТ ЗАГРУЖАТЬ, УСТАНАВЛИВАТЬ И ИСПОЛЬЗОВАТЬ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+ Примечание: В случае, если условия настоящего Соглашения противоречат условиям какого-либо индивидуально согласованного соглашения между Recloud и клиентом, преимущественную силу имеют условия последнего.
+
+ 1. СТОРОНЫ
+ (а) "Лицензиар" означает ООО «Реклауд», зарегистрированное по адресу: 163045, Архангельская область, г Архангельск, Талажское ш, д. 9, офис 6, ОГРН: 1242900005083, ИНН/КПП: 2901318875/290101001.
+
+ (б) "Лицензиат" означает физическое или юридическое лицо, осуществляющее права в соответствии с условиями настоящего Соглашения. Для юридических лиц "Лицензиат" включает любое юридическое лицо, которое контролирует, контролируется или находится под общим контролем с Лицензиатом. Для целей данного определения "контроль" означает (а) право, прямое или косвенное, определять направление или управление таким юридическим лицом, будь то по договору или иным образом, или (б) владение пятьюдесятью процентами (50%) или более находящихся в обращении акций или бенефициарного владения таким юридическим лицом.
+
+ 2. ОПРЕДЕЛЕНИЯ
+ (а) "Игровые профили и сборочный агент Программных средств" означает вспомогательную часть Программного обеспечения, которая выполняет функции, запрашиваемые Сервером, как указано в документации к Программному обеспечению.
+
+ (б) "Лицензия сборочного агента" означает лицензию на использование Сборочного агента в соответствии с настоящим Соглашением.
+
+ (в) "Лицензионный сертификат" означает доказательство лицензии, предоставленное Лицензиаром Лицензиату в электронной или печатной форме.
+
+ (г) "Лицензионный ключ" означает уникальный код-ключ, который позволяет Лицензиату запускать Программное обеспечение. Только Лицензиар и/или его представители имеют право производить Лицензионные ключи для Программного обеспечения.
+
+ (д) "Сервер" означает серверную часть Программного обеспечения, которая обеспечивает администрирование учетных записей Пользователей и выполняет другие услуги, как указано в документации к Программному обеспечению.
+
+ (е) "Программное обеспечение" означает программу в двоичной форме, включая ее документацию, обновления, предоставляемые в соответствии с настоящим Соглашением, и любые программы третьих лиц, которые принадлежат и лицензируются сторонами, отличными от Лицензиара, и которые либо интегрированы, либо являются частью продукта (совместно "Программное обеспечение третьих лиц").
+
+ (ж) "Пользователь" означает (i) если Лицензиат является физическим лицом, исключительно Лицензиата; (ii) если Лицензиат является юридическим лицом, любое лицо, которое уполномочено Лицензиатом использовать Программное обеспечение при выполнении обязанностей в рамках его работы или задания у Лицензиата, включая его сотрудника, независимого подрядчика, временного работника и любое третье лицо.
+
+ 3. ПРАВО СОБСТВЕННОСТИ
+ (а) Программное обеспечение является собственностью Лицензиара или его поставщиков. Программное обеспечение лицензируется, а не продается. Право собственности и авторские права на Программное обеспечение, полностью и частично, и все его копии, а также все модификации, улучшения, производные и другие изменения Программного обеспечения, независимо от того, кто внес какие-либо модификации, если таковые имеются, являются и останутся исключительной собственностью Лицензиара и его поставщиков.
+
+ (б) Программное обеспечение защищено законом об авторском праве Российской Федерации и положениями международных договоров. Более того, структура, организация и код, воплощенные в Программном обеспечении, являются ценными и конфиденциальными коммерческими тайнами Лицензиара и его поставщиков и защищены законами об интеллектуальной собственности и международными договорами. Лицензиат соглашается соблюдать закон об авторском праве и все другие применимые законы Российской Федерации.
+
+ 4. ПРЕДОСТАВЛЕНИЕ ЛИЦЕНЗИИ
+ В соответствии с условиями, положениями и ограничениями, изложенными в настоящем Соглашении, включая любые поправки к нему, Лицензиар настоящим предоставляет Лицензиату неисключительную, непередаваемую лицензию на использование Программного обеспечения следующим образом:
+
+ (а) Лицензиат может:
+
+ (i) создавать и использовать неограниченное количество игровых профилей и сборочных агентов на своих серверах;
+
+ (ii) создавать и использовать неограниченное количество учетных записей Пользователей;
+
+ (iii) делать резервные копии Программного обеспечения для архивных целей.
+
+ (б) Лицензиат не может:
+
+ (i) продавать, распространять, обременять, дарить, давать взаймы, сдавать в аренду, сублицензировать или иным образом передавать Программное обеспечение или любые его части кому-либо без предварительного письменного согласия Лицензиара;
+
+ (ii) осуществлять обратное проектирование, декомпилировать, дизассемблировать, модифицировать, переводить, предпринимать попытки раскрыть исходный код Программного обеспечения или создавать производные работы из Программного обеспечения;
+
+ (iii) использовать один и тот же Лицензионный ключ для запуска нескольких экземпляров Программного обеспечения.
+
+ 5. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ТРЕТЬИХ ЛИЦ
+
+ (а) Лицензиат соглашается соблюдать условия и положения, содержащиеся в лицензиях на Программное обеспечение третьих лиц в отношении соответствующего Программного обеспечения третьих лиц. Лицензиат может ознакомиться со всеми такими лицензиями и/или уведомлениями о Программном обеспечении третьих лиц в документации к Программному обеспечению в разделе "Лицензионное соглашение с третьими лицами".
+
+ (б) Лицензиат соглашается и признает, что Разделы 9 и 10 настоящего Соглашения также регулируют использование Лицензиатом Программного обеспечения третьих лиц. Лицензиар не несет никакой ответственности в отношении любого Программного обеспечения третьих лиц, и Лицензиат будет обращаться исключительно к лицензиару(ам) Программного обеспечения третьих лиц за любым средством правовой защиты. Лицензиар не заявляет никаких прав на Программное обеспечение третьих лиц, и оно принадлежит исключительно лицензиару(ам) Программного обеспечения третьих лиц.
+
+ (в) Лицензиар не предоставляет никаких гарантий, явных или подразумеваемых, включая, помимо прочего, подразумеваемые гарантии товарной пригодности, пригодности для определенной цели, права собственности и ненарушения прав, в отношении любого программного обеспечения третьих лиц.
+
+ 6. ОГРАНИЧЕННОЕ ИСПОЛЬЗОВАНИЕ В ТЕЧЕНИЕ ОЦЕНОЧНОГО ПЕРИОДА
+
+ (а) В соответствии с условиями настоящего Соглашения Лицензиату предоставляется право установить и запустить Программное обеспечение для целей оценки без какой-либо оплаты на период в шестьдесят (60) дней, если иное не указано Лицензиаром ("Оценочный период").
+
+ (б) Использование Лицензиатом Программного обеспечения в течение Оценочного периода должно быть ограничено внутренней оценкой с единственной целью определения, соответствует ли Программное обеспечение требованиям Лицензиата и желает ли Лицензиат продолжить использование Программного обеспечения.
+
+ (в) По истечении Оценочного периода Лицензиат должен сделать одно из следующего: (i) получить лицензию для постоянного использования Программного обеспечения или (ii) удалить Программное обеспечение.
+
+ 7. ОБНОВЛЕНИЯ
+
+ 7.1 Лицензиар будет предоставлять общедоступные обновления Программного обеспечения Лицензиату в течение срока действия настоящего Соглашения.
+
+ 7.2 Лицензиар может прекратить предоставление обновлений, если:
+
+ (A) Лицензиат существенно нарушил настоящее Соглашение и не устранил такое нарушение в течение тридцати (30) дней с момента письменного уведомления об этом;
+
+ (B) Лицензиар обязан сделать это по закону (например, если предоставление Программного обеспечения Лицензиату является или становится незаконным); или
+
+ (C) Лицензиар решил прекратить предоставление Программного обеспечения, полностью или частично.
+
+ 7.3 Лицензиар приложит разумные усилия для уведомления Лицензиата по электронной почте за тридцать (30) дней до прекращения предоставления обновлений в случаях, указанных в пунктах 7.2 (B) и 7.2 (C).
+
+ 8. ПОКУПКА И ОПЛАТА
+
+ Лицензиат соглашается с условиями покупки Программного обеспечения, опубликованными на веб-сайте Лицензиара по адресу recloud.tech. Лицензиат оплатит Лицензиару лицензионный сбор и другие сборы (если применимо), как указано в счете или другой документации о покупке. Лицензиар может взимать с Лицензиата проценты за любой платеж, просроченный более чем на тридцать (30) дней, по ставке полтора процента (1,5%) в месяц или максимальной сумме, разрешенной законом, в зависимости от того, что меньше.
+
+ 9. ОГРАНИЧЕННАЯ ГАРАНТИЯ
+
+ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ЛИЦЕНЗИАТУ "КАК ЕСТЬ" И БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. ЛИЦЕНЗИАР НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ ОТНОСИТЕЛЬНО ЕГО ИСПОЛЬЗОВАНИЯ ИЛИ ПРОИЗВОДИТЕЛЬНОСТИ. В МАКСИМАЛЬНОЙ СТЕПЕНИ, РАЗРЕШЕННОЙ ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, ЛИЦЕНЗИАР И ЕГО АФФИЛИРОВАННЫЕ ЛИЦА, ПОСТАВЩИКИ И РЕСЕЛЛЕРЫ ОТКАЗЫВАЮТСЯ ОТ ВСЕХ ДРУГИХ ГАРАНТИЙ И УСЛОВИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ПРАВА СОБСТВЕННОСТИ И НЕНАРУШЕНИЯ ПРАВ, В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ И ПРЕДОСТАВЛЕНИЯ ИЛИ НЕПРЕДОСТАВЛЕНИЯ УСЛУГ ПОДДЕРЖКИ.
+
+ 10. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ЗА УЩЕРБ
+
+ (A) В МАКСИМАЛЬНОЙ СТЕПЕНИ, РАЗРЕШЕННОЙ ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ЛИЦЕНЗИАР ИЛИ ЕГО АФФИЛИРОВАННЫЕ ЛИЦА, ЛИЦЕНЗИАРЫ, ПОСТАВЩИКИ ИЛИ РЕСЕЛЛЕРЫ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПЕРЕД ЛИЦЕНЗИАТОМ НИ ПО КАКОЙ ТЕОРИИ ЗА ЛЮБЫЕ УБЫТКИ, ПОНЕСЕННЫЕ ЛИЦЕНЗИАТОМ ИЛИ ЛЮБЫМ ПОЛЬЗОВАТЕЛЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ИЛИ ЗА ЛЮБЫЕ СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ, КОСВЕННЫЕ, ПОСЛЕДУЮЩИЕ ИЛИ ПОДОБНЫЕ УБЫТКИ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, УБЫТКИ ОТ ПОТЕРИ ПРИБЫЛИ ИЛИ КОНФИДЕНЦИАЛЬНОЙ ИЛИ ДРУГОЙ ИНФОРМАЦИИ, ОТ ПРЕРЫВАНИЯ БИЗНЕСА, ОТ ЛИЧНОГО ВРЕДА, ОТ ПОТЕРИ КОНФИДЕНЦИАЛЬНОСТИ, ОТ НЕИСПОЛНЕНИЯ КАКИХ-ЛИБО ОБЯЗАННОСТЕЙ, ВКЛЮЧАЯ ДОБРОСОВЕСТНОСТЬ ИЛИ РАЗУМНУЮ ОСТОРОЖНОСТЬ, ОТ НЕБРЕЖНОСТИ И ОТ ЛЮБЫХ ДРУГИХ ДЕНЕЖНЫХ ИЛИ ИНЫХ УБЫТКОВ), ВОЗНИКАЮЩИЕ В РЕЗУЛЬТАТЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ИЛИ ПРЕДОСТАВЛЕНИЯ ИЛИ НЕПРЕДОСТАВЛЕНИЯ УСЛУГ ПОДДЕРЖКИ, ДАЖЕ ЕСЛИ ЛИЦЕНЗИАР БЫЛ УВЕДОМЛЕН О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ, И НЕЗАВИСИМО ОТ ПРАВОВОЙ ИЛИ СПРАВЕДЛИВОЙ ТЕОРИИ (ДОГОВОР, ДЕЛИКТ ИЛИ ИНОЕ), НА КОТОРОЙ ОСНОВАНО ТРЕБОВАНИЕ.
+
+ (B) В ЛЮБОМ СЛУЧАЕ ПОЛНАЯ ОТВЕТСТВЕННОСТЬ ЛИЦЕНЗИАРА ПО ЛЮБОМУ ПОЛОЖЕНИЮ НАСТОЯЩЕГО СОГЛАШЕНИЯ БУДЕТ ОГРАНИЧЕНА СУММОЙ, ФАКТИЧЕСКИ УПЛАЧЕННОЙ ЛИЦЕНЗИАТОМ ЗА ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПО НАСТОЯЩЕМУ СОГЛАШЕНИЮ.
+
+ 11. ЭКСПОРТНЫЕ ПРАВИЛА
+
+ Лицензиат соглашается и принимает, что Программное обеспечение может подпадать под действие законов об импорте и экспорте любой страны, включая законы Европейского Союза и Соединенных Штатов (в частности, Правила экспортного контроля (EAR)). Лицензиат подтверждает, что он не является гражданином, подданным или резидентом и не находится под контролем правительств Кубы, Ирана, Северной Кореи, Судана или Сирии и не является иным образом ограниченным конечным пользователем, как определено применимыми законами экспортного контроля. Кроме того, Лицензиат подтверждает, что он не будет загружать или иным образом экспортировать или реэкспортировать Программное обеспечение или любые связанные технические данные прямо или косвенно в вышеупомянутые страны или гражданам, подданным или резидентам этих стран, или любому другому ограниченному конечному пользователю или для любого ограниченного конечного использования.
+
+ 12. СРОК ДЕЙСТВИЯ И ПРЕКРАЩЕНИЕ
+
+ (а) Если иное не предусмотрено в Лицензионном сертификате, лицензия, предоставленная по настоящему Соглашению, является бессрочной.
+
+ (б) Если Лицензиат не соблюдает условия и положения настоящего Соглашения, Лицензиар может прекратить действие настоящего Соглашения и права и лицензии Лицензиата на использование Программного обеспечения. Лицензиат может прекратить действие настоящего Соглашения в любое время, уведомив Лицензиара. После прекращения действия настоящего Соглашения Лицензиат должен удалить Программное обеспечение со своих компьютеров и архивов. ЛИЦЕНЗИАТ СОГЛАШАЕТСЯ, ЧТО ПОСЛЕ ПРЕКРАЩЕНИЯ ДЕЙСТВИЯ НАСТОЯЩЕГО СОГЛАШЕНИЯ ПО ЛЮБОЙ ПРИЧИНЕ ЛИЦЕНЗИАР МОЖЕТ ПРИНЯТЬ МЕРЫ, ЧТОБЫ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БОЛЬШЕ НЕ РАБОТАЛО.
+
+ 13. МАРКЕТИНГ
+
+ Лицензиат соглашается быть идентифицированным как клиент Лицензиара и что Лицензиар может ссылаться на Лицензиата по имени, торговому наименованию и товарному знаку, если применимо, и может кратко описывать бизнес Лицензиата в маркетинговых материалах Лицензиара и на веб-сайте Лицензиара. Настоящим Лицензиат предоставляет Лицензиару лицензию на использование имени Лицензиата и любых торговых наименований и товарных знаков Лицензиата исключительно в связи с правами, предоставленными Лицензиару в соответствии с настоящим разделом о маркетинге.
+
+ 14. ОБЩИЕ ПОЛОЖЕНИЯ
+
+ (а) Лицензиар оставляет за собой право в любое время прекратить поддержку Программного обеспечения и изменять цены, характеристики, спецификации, возможности, функции, условия лицензирования, даты выпуска, общую доступность или другие характеристики Программного обеспечения.
+
+ (б) Настоящее Соглашение, включая соглашения о Программном обеспечении третьих лиц, представляет собой полное соглашение между сторонами относительно использования Лицензиатом Программного обеспечения и заменяет собой все предыдущие или одновременные устные или письменные заявления, сообщения или рекламу в отношении Программного обеспечения. Никакой заказ на покупку, другой заказывающий документ или любой рукописный или напечатанный текст, который претендует на изменение или дополнение печатного текста настоящего Соглашения или любого графика, не добавит и не изменит условия настоящего Соглашения, если он не подписан как Лицензиатом, так и Лицензиаром.
+
+ (в) Отказ любой из сторон от любого условия или положения настоящего Соглашения или любого нарушения такового в любом случае не отменяет такое условие или положение или любое последующее нарушение. Положения настоящего Соглашения, которые требуют или предполагают исполнение после истечения срока действия или прекращения настоящего Соглашения, подлежат исполнению независимо от такого истечения срока действия или прекращения.
+
+ (г) Настоящее Соглашение регулируется законодательством Российской Федерации без учета принципов коллизионного права. Лицензиат соглашается с тем, что любой судебный процесс, связанный с настоящим Соглашением, может проводиться только в судах Российской Федерации и подчиняется их юрисдикции.
+
+ (д) Заголовки вставлены только для удобства и не должны никоим образом влиять на значение или толкование настоящего Соглашения. Если какое-либо положение настоящего Соглашения будет признано недействительным, остальная часть настоящего Соглашения останется в полной силе и действии. Любая из сторон - Лицензиар или Лицензиат - может уступить настоящее Соглашение в случае слияния или продажи практически всех своих соответствующих активов другому юридическому лицу. Настоящее Соглашение является обязательным и действует в интересах сторон, их правопреемников и цессионариев.
+
+ По вопросам исключений или изменений к данному Соглашению, пожалуйста, обращайтесь к Лицензиару:
+ Email: support@recloud.tech
+ Веб-сайт: https://recloud.tech`}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/mnt/page.tsx b/src/app/mnt/page.tsx
new file mode 100644
index 00000000..6bced766
--- /dev/null
+++ b/src/app/mnt/page.tsx
@@ -0,0 +1,100 @@
+'use client';
+
+import Image from 'next/image';
+import { useRouter } from 'next/navigation';
+
+import { config } from '@/core/configs';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from '@/shared/ui/card';
+import { Button, buttonVariants } from '@/shared/ui/button';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/shared/ui/tooltip';
+import logo from '@/assets/logos/logo.svg';
+
+{
+ config.name;
+}
+
+export default function MntPage() {
+ const router = useRouter();
+ return (
+
+
+
{config.name} Первый запуск
+
+
+
+ {/* THE PAGE CONTENT BEGIN */}
+
+
+
+ Перед началом
+
+ Пожалуйста, ознакомьтесь с настройками ниже перед первым запуском {config.name}.
+
+
+
+
+ Сервер {config.name} хранит конфигурацию сервера, определения проектов, результаты
+ сборок и кеши на диске в Каталоге данных.{' '}
+
+
+
+ ?
+
+
+
+ Подробнее в документации:{' '}
+
+ открыть
+
+
+
+
+
+
+ Расположение каталога данных:{' '}
+
+ /data/GmlBackend
+
+
+
+
+
+
+
+
+
+
+
+ {config.name} {config.version}
+
+
+ {/* THE PAGE CONTENT END */}
+
+ );
+}
diff --git a/src/app/mnt/setup/layout.tsx b/src/app/mnt/setup/layout.tsx
new file mode 100644
index 00000000..451c93c4
--- /dev/null
+++ b/src/app/mnt/setup/layout.tsx
@@ -0,0 +1,9 @@
+import { ReactNode } from 'react';
+
+export const metadata = {
+ title: 'Gml Настройка',
+};
+
+export default function MntSetupLayout({ children }: { children: ReactNode }) {
+ return <>{children}>;
+}
diff --git a/src/app/mnt/setup/page.tsx b/src/app/mnt/setup/page.tsx
new file mode 100644
index 00000000..45e748fd
--- /dev/null
+++ b/src/app/mnt/setup/page.tsx
@@ -0,0 +1,287 @@
+'use client';
+
+import { useState } from 'react';
+import { useRouter } from 'next/navigation';
+import Image from 'next/image';
+
+import { config } from '@/core/configs';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from '@/shared/ui/card';
+import { Button } from '@/shared/ui/button';
+import { Alert, AlertDescription, AlertTitle } from '@/shared/ui/alert';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/shared/ui/tooltip';
+import logo from '@/assets/logos/logo.svg';
+
+export default function MntSetupPage() {
+ const router = useRouter();
+ const [backendUrl, setBackendUrl] = useState(
+ typeof window !== 'undefined' ? `${window.location.origin}/api/v1` : '',
+ );
+ const [projectName, setProjectName] = useState('');
+ const [adminUsername, setAdminUsername] = useState('');
+ const [adminEmail, setAdminEmail] = useState('');
+ const [adminPassword, setAdminPassword] = useState('');
+ const [confirmPassword, setConfirmPassword] = useState('');
+ const [submitting, setSubmitting] = useState(false);
+ const [fetchFailed, setFetchFailed] = useState(false);
+
+ async function onSave() {
+ if (!backendUrl) return;
+ if (adminPassword !== confirmPassword) {
+ const { toast } = await import('sonner');
+ toast.error('Пароль и подтверждение не совпадают');
+ return;
+ }
+ const base = backendUrl.replace(/\/$/, '');
+ const url = `${base}/settings/install`;
+ const body = {
+ ProjectName: projectName,
+ BackendAddress: backendUrl,
+ AdminUsername: adminUsername,
+ AdminEmail: adminEmail,
+ AdminPassword: adminPassword,
+ ConfirmPassword: confirmPassword,
+ };
+ try {
+ setSubmitting(true);
+ setFetchFailed(false);
+ const res = await fetch(url, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(body),
+ credentials: 'include',
+ });
+ if (!res.ok) {
+ // Try to parse JSON error and build a readable message
+ let readable = `Request failed with status ${res.status}`;
+ const contentType = res.headers.get('content-type') || '';
+ try {
+ if (contentType.includes('application/json')) {
+ const data: any = await res.json();
+ const base = (typeof data?.message === 'string' && data.message) || '';
+ const details = Array.isArray(data?.errors)
+ ? data.errors.filter((x: any) => typeof x === 'string')
+ : [];
+ if (base || details.length) {
+ readable = [base, details.join('\n')].filter(Boolean).join('\n');
+ }
+ } else {
+ const text = await res.text();
+ // Some backends return JSON string as text; try to parse
+ try {
+ const data: any = JSON.parse(text);
+ const base = (typeof data?.message === 'string' && data.message) || '';
+ const details = Array.isArray(data?.errors)
+ ? data.errors.filter((x: any) => typeof x === 'string')
+ : [];
+ readable = [base, details.join('\n')].filter(Boolean).join('\n') || text || readable;
+ } catch {
+ readable = text || readable;
+ }
+ }
+ } catch {
+ // ignore parsing errors and use default readable
+ }
+ throw new Error(readable);
+ }
+ // Success: backend returns accessToken similar to signup. Save user like signup flow
+ try {
+ const json = await res.json();
+ const accessToken: string | undefined = json?.data?.accessToken;
+ if (accessToken) {
+ // Dynamically import to avoid SSR issues
+ const { setStorageAccessToken, setStorageProfile } = await import('@/shared/services');
+ setStorageAccessToken(accessToken);
+ const payloadRaw = accessToken.split('.')[1];
+ const payload = atob(payloadRaw);
+ const profile = JSON.parse(payload);
+ setStorageProfile(profile);
+ }
+ } catch {
+ // ignore if response body is empty or malformed; navigation will still proceed
+ }
+ router.push('/dashboard');
+ } catch (e: any) {
+ const message: string = e?.message || '';
+ if (message.toLowerCase().includes('failed to fetch')) {
+ setFetchFailed(true);
+ }
+ // Fallback alert; project also has sonner Toaster globally mounted
+ const msg = message || 'Не удалось выполнить установку';
+ const { toast } = await import('sonner');
+ toast.error(msg);
+ } finally {
+ setSubmitting(false);
+ }
+ }
+
+ // Compute protocols and mismatch for tooltip/visual warning
+ const pageProto = typeof window !== 'undefined' ? window.location.protocol.replace(':', '') : '';
+ let backendProto = '';
+ try {
+ if (backendUrl) {
+ const u = new URL(backendUrl.startsWith('http') ? backendUrl : `https://${backendUrl}`);
+ backendProto = u.protocol.replace(':', '');
+ }
+ } catch {
+ backendProto = '';
+ }
+ const mismatch = Boolean(pageProto && backendProto && pageProto !== backendProto);
+
+ return (
+
+
+
{config.name} Установка
+
+
+
+
+ Настройки проекта
+ Укажите основные параметры проекта.
+
+
+
+
+
+
+
+
+
+
+
+ {fetchFailed && (
+
+ Не удалось выполнить запрос (Failed to fetch)
+
+ Убедитесь, что ваш бекенд работает и сертификат валиден. Для проверки откройте
+ адрес здоровья бекенда — вы должны увидеть "Healthy". Если вы видите
+ Healthy, вернитесь на эту страницу и продолжите установку.
+