[{"data":1,"prerenderedAt":211},["ShallowReactive",2],{"docs-navigation-ru":3,"docs-search-ru":22,"i-lucide:search":95,"i-lucide:sun":100,"i-lucide:menu":102,"i-lucide:chevron-down":104,"docs-ru-/docs/installation":106,"i-lucide:copy":207,"i-lucide:link":209},[4,15],{"section":5,"items":6},"Начало работы",[7,11],{"title":8,"path":9,"order":10},"Введение","/docs",1,{"title":12,"path":13,"order":14},"Установка","/docs/installation",2,{"section":16,"items":17},"Как это работает",[18],{"title":19,"path":20,"order":21},"Как это устроено","/docs/architecture",3,[23,27,32,37,42,47,52,56,61,66,71,75,80,85,90],{"id":24,"title":19,"titles":25,"content":26,"level":10},"/ru/docs/architecture",[],"Три процесса на сервере с Maran, контракт между ними и правила, которые решают, что корневому демону вообще позволено делать. На сервере с Maran работают ровно три процесса. Разделение между ними — главное проектное решение\nпродукта, и большинство правил ниже следуют из него.",{"id":28,"title":29,"titles":30,"content":31,"level":14},"/ru/docs/architecture#три-процесса","Три процесса",[19],"ПроцессРаботает отДержитmaran-apiнепривилегированного системного пользователявсю бизнес-логику и единственное подключение к базеmaran-agentrootничего — он без состояния, без базы и без собственной конфигурацииPostgreSQLсобственного пользователяданные панели, на unix-сокете, вообще без TCP-порта Панель никогда не трогает систему. Агент ничего не решает. В этом вся форма: процесс, который знает,\nчто должно произойти, не имеет привилегий, а процесс с привилегиями знает только, как выполнить\nфиксированный список вещей.",{"id":33,"title":34,"titles":35,"content":36,"level":14},"/ru/docs/architecture#контракт-между-ними","Контракт между ними",[19],"Они говорят через unix-сокет, и передаётся именованная операция с типизированными и проверенными\nаргументами. Отсюда три свойства, и каждое — правило, а не привычка: Нет операции, которая запускает переданную вызывающей стороной программу. Ни ограниченной, ни\nиз белого списка — никакой. Поэтому множество того, что можно заставить сделать корневой процесс,\nконечно, записано и поддаётся ревью.Нигде в обмене нет shell-строки. Домен не экранируется перед попаданием в конфигурационный\nфайл; он проверяется как домен — буквы, цифры, дефисы и точки, — и в нём неоткуда взяться\nпереводу строки, который завершит одну директиву и начнёт другую, выбранную вызывающим.Агент проверяет, кто спрашивает. Учётные данные пира на сокете читаются до рассмотрения\nоперации, так что демон знает, какой процесс на другом конце, а не верит тому, что ему сказали.",{"id":38,"title":39,"titles":40,"content":41,"level":14},"/ru/docs/architecture#запись-конфигурационного-файла","Запись конфигурационного файла",[19],"Каждая привилегированная запись идёт в одном и том же порядке, и порядок — это и есть суть: отрендерить во временный файл;fsync;атомарно переименовать на место;дать проверить результат самой службе — nginx -t, а не нашему регулярному выражению;перезагрузить;откатить файл, если проверка или перезагрузка отказали. Один плохой рендер не может уронить остальные сайты сервера, потому что о качестве рендера судит\nсобственный парсер сервера.",{"id":43,"title":44,"titles":45,"content":46,"level":14},"/ru/docs/architecture#изоляция-между-аккаунтами","Изоляция между аккаунтами",[19],"Аккаунт — настоящий пользователь Linux, со своим домашним каталогом и правами файловой\nсистемы.Его PHP работает в собственном пуле php-fpm под собственным uid, и файловые операции идут от\nэтого пользователя — никогда от root.Таблицы арендаторов ограничены аккаунтом на уровне базы, фильтрами запросов, которые\nавтоматический тест проверяет, обходя всю модель.Запрос чужого ресурса отвечает 404, а не 403, поэтому ошибка никогда не подтверждает, что\nстрока существует.",{"id":48,"title":49,"titles":50,"content":51,"level":14},"/ru/docs/architecture#чего-сознательно-нет","Чего сознательно нет",[19],"Ни брокера сообщений, ни сайдкара, ни второго демона. Фоновая работа идёт по надёжным очередям в\nPostgreSQL, и установка Maran не добавляет на сервер ничего, чего нет в таблице выше, — кроме одного\nисключения, которое оператор включает сам: службы FTPS. Платные модули этого тоже не меняют: это модули на C#, которые управляют операциями, уже собранными\nв открытом агенте. Агент никогда не загружает внешний код — поэтому лицензия не может добавить\nновую привилегированную возможность.",{"id":53,"title":8,"titles":54,"content":55,"level":10},"/ru/docs",[],"Что такое Maran, из каких трёх процессов состоит сервер и что корневой демон делать не станет — включая то, почему он не принимает shell-команд. Maran — панель управления веб-хостингом для серверов Linux. Установите её на сервер и управляйте\nсайтами, версиями PHP, SSL-сертификатами, базами данных, файлами, резервными копиями и брандмауэром\nиз браузера, с отдельным кабинетом для каждого клиента хостинга и API, которым биллинговая система\nсоздаёт аккаунты сама.",{"id":57,"title":58,"titles":59,"content":60,"level":14},"/ru/docs#три-процесса-и-root-есть-только-у-одного","Три процесса, и root есть только у одного",[8],"На сервере с Maran работают ровно три процесса, и разделение между ними — главное решение продукта: maran-api — сама панель. В ней вся бизнес-логика, и только она обращается к базе данных.\nРаботает от непривилегированного системного пользователя.maran-agent — единственный процесс с root. Он не хранит состояние, у него нет базы и своих\nконфигурационных файлов, и только он трогает веб-сервер, php-fpm, сервер баз данных, SSH и\nпередачу файлов, планировщик, брандмауэр и сертификаты.PostgreSQL — доступен только из maran-api, через unix-сокет, вообще без TCP-порта. Панель просит у агента именованные операции через unix-сокет, с типизированными и проверенными\nаргументами. Нет операции, которая запускает переданную вызывающей стороной программу, и между ними\nнигде нет shell-строки: множество того, что можно заставить сделать корневой процесс, конечно,\nзаписано и поддаётся ревью.",{"id":62,"title":63,"titles":64,"content":65,"level":14},"/ru/docs#что-такое-аккаунт-хостинга","Что такое аккаунт хостинга",[8],"Настоящий пользователь Linux со своим домашним каталогом и правами файловой системы. Его PHP\nработает в собственном пуле под собственным uid, и файловые операции идут от этого же uid — никогда\nот root. Каждая таблица, принадлежащая арендатору, ограничена аккаунтом на уровне базы, а запрос\nчужого ресурса отвечает 404, а не 403 — ошибка никогда не подтверждает, что строка существует.",{"id":67,"title":68,"titles":69,"content":70,"level":14},"/ru/docs#ни-брокеров-ни-сайдкаров","Ни брокеров, ни сайдкаров",[8],"Фоновая работа идёт по надёжным очередям, хранящимся в PostgreSQL. Установка Maran не добавляет на\nсервер ни брокера сообщений, ни сайдкар, ни второй демон.",{"id":72,"title":12,"titles":73,"content":74,"level":10},"/ru/docs/installation",[],"Установка Maran на чистый сервер, что установщик проверяет первым делом и как создаётся первый администратор. Устанавливайте на сервер, которым управляете сами, с доступом root и одной из\nподдерживаемых платформ.",{"id":76,"title":77,"titles":78,"content":79,"level":14},"/ru/docs/installation#запустить-установщик","Запустить установщик",[12],"curl -sSL https://get.maran.innovayse.com | bash Установщик проверяет систему до того, как что-то изменить: дистрибутив и его версию по матрице\nподдержки, пороги по памяти и диску, нужные порты и свободное место на файловой системе резервных\nкопий. Он собирает все отказы и выходит один раз, так что список исправляется целиком, а не по\nодной проблеме за запуск. Если проверки пройдены, он ставит подписанные артефакты релиза, ужесточает systemd-юниты и\nразворачивает то, что нужно хостинговому серверу: веб-сервер, PostgreSQL для данных самой панели,\nсервер баз данных для аккаунтов, передачу файлов, брандмауэр и планировщик.",{"id":81,"title":82,"titles":83,"content":84,"level":14},"/ru/docs/installation#первый-администратор","Первый администратор",[12],"По завершении установщик печатает одноразовую ссылку. Открыть её в браузере — единственный способ\nсоздать первого администратора: больше его не создать ничем, и ссылка сгорает при использовании.",{"id":86,"title":87,"titles":88,"content":89,"level":14},"/ru/docs/installation#после-первого-входа","После первого входа",[12],"Включите двухфакторную аутентификацию и создайте первый аккаунт хостинга. Аккаунт — настоящий\nпользователь Linux со своим домашним каталогом, своим пулом php-fpm и квотой по тарифу; создание\nчерез панель и есть то, что разворачивает его на хосте.",{"id":91,"title":92,"titles":93,"content":94,"level":14},"/ru/docs/installation#обновления-и-откат","Обновления и откат",[12],"Обновления подписаны и ставятся из панели или утилитой maran. Перед подменой чего-либо обновление\nделает дамп базы, а maran rollback возвращает предыдущую версию, используя этот дамп как страховку.\nПатчи безопасности по умолчанию ставятся автоматически; это можно выключить. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":99},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"/>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"/>\u003C/g>",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":101},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"/>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/>\u003C/g>",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":103},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":105},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"/>",{"doc":107,"isFallback":98},{"id":108,"title":12,"body":109,"description":199,"extension":200,"meta":201,"navigation":202,"order":14,"path":72,"section":5,"seo":203,"seoTitle":204,"stem":205,"__hash__":206},"docsRu/ru/docs/installation.md",{"type":110,"value":111,"toc":193},"minimark",[112,122,126,159,162,165,168,170,173,175,178,189],[113,114,115,116,121],"p",{},"Устанавливайте на сервер, которым управляете сами, с доступом root и одной из\n",[117,118,120],"a",{"href":119},"/platforms","поддерживаемых платформ",".",[123,124,77],"h2",{"id":125},"запустить-установщик",[127,128,133],"pre",{"className":129,"code":130,"language":131,"meta":132,"style":132},"language-bash shiki shiki-themes github-light github-dark","curl -sSL https://get.maran.innovayse.com | bash\n","bash","",[134,135,136],"code",{"__ignoreMap":132},[137,138,140,144,148,152,156],"span",{"class":139,"line":10},"line",[137,141,143],{"class":142},"sScJk","curl",[137,145,147],{"class":146},"sj4cs"," -sSL",[137,149,151],{"class":150},"sZZnC"," https://get.maran.innovayse.com",[137,153,155],{"class":154},"szBVR"," |",[137,157,158],{"class":142}," bash\n",[113,160,161],{},"Установщик проверяет систему до того, как что-то изменить: дистрибутив и его версию по матрице\nподдержки, пороги по памяти и диску, нужные порты и свободное место на файловой системе резервных\nкопий. Он собирает все отказы и выходит один раз, так что список исправляется целиком, а не по\nодной проблеме за запуск.",[113,163,164],{},"Если проверки пройдены, он ставит подписанные артефакты релиза, ужесточает systemd-юниты и\nразворачивает то, что нужно хостинговому серверу: веб-сервер, PostgreSQL для данных самой панели,\nсервер баз данных для аккаунтов, передачу файлов, брандмауэр и планировщик.",[123,166,82],{"id":167},"первый-администратор",[113,169,84],{},[123,171,87],{"id":172},"после-первого-входа",[113,174,89],{},[123,176,92],{"id":177},"обновления-и-откат",[113,179,180,181,184,185,188],{},"Обновления подписаны и ставятся из панели или утилитой ",[134,182,183],{},"maran",". Перед подменой чего-либо обновление\nделает дамп базы, а ",[134,186,187],{},"maran rollback"," возвращает предыдущую версию, используя этот дамп как страховку.\nПатчи безопасности по умолчанию ставятся автоматически; это можно выключить.",[190,191,192],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":132,"searchDepth":14,"depth":14,"links":194},[195,196,197,198],{"id":125,"depth":14,"text":77},{"id":167,"depth":14,"text":82},{"id":172,"depth":14,"text":87},{"id":177,"depth":14,"text":92},"Установка Maran на чистый сервер, что установщик проверяет первым делом и как создаётся первый администратор.","md",{},true,{"title":12,"description":199},"Установка Maran на сервер Linux","ru/docs/installation","xj8xpCQEEiNe-PtkU0xkAVDavfjvjL5LpxCScHuJZfw",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":208},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\u003C/g>",{"left":96,"top":96,"width":97,"height":97,"rotate":96,"vFlip":98,"hFlip":98,"body":210},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/>\u003Cpath d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\u003C/g>",1790166392564]