[{"data":1,"prerenderedAt":183},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"i-lucide:chevron-down":12,"docs-navigation-ru":14,"docs-ru-/docs":33,"i-lucide:link":114,"docs-search-ru":116},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"/>",[15,26],{"section":16,"items":17},"Начало работы",[18,22],{"title":19,"path":20,"order":21},"Введение","/docs",1,{"title":23,"path":24,"order":25},"Установка","/docs/installation",2,{"section":27,"items":28},"Как это работает",[29],{"title":30,"path":31,"order":32},"Как это устроено","/docs/architecture",3,{"doc":34,"isFallback":6},{"id":35,"title":19,"body":36,"description":105,"extension":106,"meta":107,"navigation":108,"order":21,"path":109,"section":16,"seo":110,"seoTitle":111,"stem":112,"__hash__":113},"docsRu/ru/docs/index.md",{"type":37,"value":38,"toc":99},"minimark",[39,43,48,51,82,85,89,92,96],[40,41,42],"p",{},"Maran — панель управления веб-хостингом для серверов Linux. Установите её на сервер и управляйте\nсайтами, версиями PHP, SSL-сертификатами, базами данных, файлами, резервными копиями и брандмауэром\nиз браузера, с отдельным кабинетом для каждого клиента хостинга и API, которым биллинговая система\nсоздаёт аккаунты сама.",[44,45,47],"h2",{"id":46},"три-процесса-и-root-есть-только-у-одного","Три процесса, и root есть только у одного",[40,49,50],{},"На сервере с Maran работают ровно три процесса, и разделение между ними — главное решение продукта:",[52,53,54,65,73],"ul",{},[55,56,57,64],"li",{},[58,59,60],"strong",{},[61,62,63],"code",{},"maran-api"," — сама панель. В ней вся бизнес-логика, и только она обращается к базе данных.\nРаботает от непривилегированного системного пользователя.",[55,66,67,72],{},[58,68,69],{},[61,70,71],{},"maran-agent"," — единственный процесс с root. Он не хранит состояние, у него нет базы и своих\nконфигурационных файлов, и только он трогает веб-сервер, php-fpm, сервер баз данных, SSH и\nпередачу файлов, планировщик, брандмауэр и сертификаты.",[55,74,75,78,79,81],{},[58,76,77],{},"PostgreSQL"," — доступен только из ",[61,80,63],{},", через unix-сокет, вообще без TCP-порта.",[40,83,84],{},"Панель просит у агента именованные операции через unix-сокет, с типизированными и проверенными\nаргументами. Нет операции, которая запускает переданную вызывающей стороной программу, и между ними\nнигде нет shell-строки: множество того, что можно заставить сделать корневой процесс, конечно,\nзаписано и поддаётся ревью.",[44,86,88],{"id":87},"что-такое-аккаунт-хостинга","Что такое аккаунт хостинга",[40,90,91],{},"Настоящий пользователь Linux со своим домашним каталогом и правами файловой системы. Его PHP\nработает в собственном пуле под собственным uid, и файловые операции идут от этого же uid — никогда\nот root. Каждая таблица, принадлежащая арендатору, ограничена аккаунтом на уровне базы, а запрос\nчужого ресурса отвечает 404, а не 403 — ошибка никогда не подтверждает, что строка существует.",[44,93,95],{"id":94},"ни-брокеров-ни-сайдкаров","Ни брокеров, ни сайдкаров",[40,97,98],{},"Фоновая работа идёт по надёжным очередям, хранящимся в PostgreSQL. Установка Maran не добавляет на\nсервер ни брокера сообщений, ни сайдкар, ни второй демон.",{"title":100,"searchDepth":25,"depth":25,"links":101},"",[102,103,104],{"id":46,"depth":25,"text":47},{"id":87,"depth":25,"text":88},{"id":94,"depth":25,"text":95},"Что такое Maran, из каких трёх процессов состоит сервер и что корневой демон делать не станет — включая то, почему он не принимает shell-команд.","md",{},true,"/ru/docs",{"title":19,"description":105},"Что такое Maran и как он устроен","ru/docs/index","fGwxd2QU7WA--zuGAzrLNBm82SzFrSICcl5_HGIyIHc",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":115},"\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>",[117,121,126,131,136,141,146,149,153,156,159,163,168,173,178],{"id":118,"title":30,"titles":119,"content":120,"level":21},"/ru/docs/architecture",[],"Три процесса на сервере с Maran, контракт между ними и правила, которые решают, что корневому демону вообще позволено делать. На сервере с Maran работают ровно три процесса. Разделение между ними — главное проектное решение\nпродукта, и большинство правил ниже следуют из него.",{"id":122,"title":123,"titles":124,"content":125,"level":25},"/ru/docs/architecture#три-процесса","Три процесса",[30],"ПроцессРаботает отДержитmaran-apiнепривилегированного системного пользователявсю бизнес-логику и единственное подключение к базеmaran-agentrootничего — он без состояния, без базы и без собственной конфигурацииPostgreSQLсобственного пользователяданные панели, на unix-сокете, вообще без TCP-порта Панель никогда не трогает систему. Агент ничего не решает. В этом вся форма: процесс, который знает,\nчто должно произойти, не имеет привилегий, а процесс с привилегиями знает только, как выполнить\nфиксированный список вещей.",{"id":127,"title":128,"titles":129,"content":130,"level":25},"/ru/docs/architecture#контракт-между-ними","Контракт между ними",[30],"Они говорят через unix-сокет, и передаётся именованная операция с типизированными и проверенными\nаргументами. Отсюда три свойства, и каждое — правило, а не привычка: Нет операции, которая запускает переданную вызывающей стороной программу. Ни ограниченной, ни\nиз белого списка — никакой. Поэтому множество того, что можно заставить сделать корневой процесс,\nконечно, записано и поддаётся ревью.Нигде в обмене нет shell-строки. Домен не экранируется перед попаданием в конфигурационный\nфайл; он проверяется как домен — буквы, цифры, дефисы и точки, — и в нём неоткуда взяться\nпереводу строки, который завершит одну директиву и начнёт другую, выбранную вызывающим.Агент проверяет, кто спрашивает. Учётные данные пира на сокете читаются до рассмотрения\nоперации, так что демон знает, какой процесс на другом конце, а не верит тому, что ему сказали.",{"id":132,"title":133,"titles":134,"content":135,"level":25},"/ru/docs/architecture#запись-конфигурационного-файла","Запись конфигурационного файла",[30],"Каждая привилегированная запись идёт в одном и том же порядке, и порядок — это и есть суть: отрендерить во временный файл;fsync;атомарно переименовать на место;дать проверить результат самой службе — nginx -t, а не нашему регулярному выражению;перезагрузить;откатить файл, если проверка или перезагрузка отказали. Один плохой рендер не может уронить остальные сайты сервера, потому что о качестве рендера судит\nсобственный парсер сервера.",{"id":137,"title":138,"titles":139,"content":140,"level":25},"/ru/docs/architecture#изоляция-между-аккаунтами","Изоляция между аккаунтами",[30],"Аккаунт — настоящий пользователь Linux, со своим домашним каталогом и правами файловой\nсистемы.Его PHP работает в собственном пуле php-fpm под собственным uid, и файловые операции идут от\nэтого пользователя — никогда от root.Таблицы арендаторов ограничены аккаунтом на уровне базы, фильтрами запросов, которые\nавтоматический тест проверяет, обходя всю модель.Запрос чужого ресурса отвечает 404, а не 403, поэтому ошибка никогда не подтверждает, что\nстрока существует.",{"id":142,"title":143,"titles":144,"content":145,"level":25},"/ru/docs/architecture#чего-сознательно-нет","Чего сознательно нет",[30],"Ни брокера сообщений, ни сайдкара, ни второго демона. Фоновая работа идёт по надёжным очередям в\nPostgreSQL, и установка Maran не добавляет на сервер ничего, чего нет в таблице выше, — кроме одного\nисключения, которое оператор включает сам: службы FTPS. Платные модули этого тоже не меняют: это модули на C#, которые управляют операциями, уже собранными\nв открытом агенте. Агент никогда не загружает внешний код — поэтому лицензия не может добавить\nновую привилегированную возможность.",{"id":109,"title":19,"titles":147,"content":148,"level":21},[],"Что такое Maran, из каких трёх процессов состоит сервер и что корневой демон делать не станет — включая то, почему он не принимает shell-команд. Maran — панель управления веб-хостингом для серверов Linux. Установите её на сервер и управляйте\nсайтами, версиями PHP, SSL-сертификатами, базами данных, файлами, резервными копиями и брандмауэром\nиз браузера, с отдельным кабинетом для каждого клиента хостинга и API, которым биллинговая система\nсоздаёт аккаунты сама.",{"id":150,"title":47,"titles":151,"content":152,"level":25},"/ru/docs#три-процесса-и-root-есть-только-у-одного",[19],"На сервере с Maran работают ровно три процесса, и разделение между ними — главное решение продукта: maran-api — сама панель. В ней вся бизнес-логика, и только она обращается к базе данных.\nРаботает от непривилегированного системного пользователя.maran-agent — единственный процесс с root. Он не хранит состояние, у него нет базы и своих\nконфигурационных файлов, и только он трогает веб-сервер, php-fpm, сервер баз данных, SSH и\nпередачу файлов, планировщик, брандмауэр и сертификаты.PostgreSQL — доступен только из maran-api, через unix-сокет, вообще без TCP-порта. Панель просит у агента именованные операции через unix-сокет, с типизированными и проверенными\nаргументами. Нет операции, которая запускает переданную вызывающей стороной программу, и между ними\nнигде нет shell-строки: множество того, что можно заставить сделать корневой процесс, конечно,\nзаписано и поддаётся ревью.",{"id":154,"title":88,"titles":155,"content":91,"level":25},"/ru/docs#что-такое-аккаунт-хостинга",[19],{"id":157,"title":95,"titles":158,"content":98,"level":25},"/ru/docs#ни-брокеров-ни-сайдкаров",[19],{"id":160,"title":23,"titles":161,"content":162,"level":21},"/ru/docs/installation",[],"Установка Maran на чистый сервер, что установщик проверяет первым делом и как создаётся первый администратор. Устанавливайте на сервер, которым управляете сами, с доступом root и одной из\nподдерживаемых платформ.",{"id":164,"title":165,"titles":166,"content":167,"level":25},"/ru/docs/installation#запустить-установщик","Запустить установщик",[23],"curl -sSL https://get.maran.innovayse.com | bash Установщик проверяет систему до того, как что-то изменить: дистрибутив и его версию по матрице\nподдержки, пороги по памяти и диску, нужные порты и свободное место на файловой системе резервных\nкопий. Он собирает все отказы и выходит один раз, так что список исправляется целиком, а не по\nодной проблеме за запуск. Если проверки пройдены, он ставит подписанные артефакты релиза, ужесточает systemd-юниты и\nразворачивает то, что нужно хостинговому серверу: веб-сервер, PostgreSQL для данных самой панели,\nсервер баз данных для аккаунтов, передачу файлов, брандмауэр и планировщик.",{"id":169,"title":170,"titles":171,"content":172,"level":25},"/ru/docs/installation#первый-администратор","Первый администратор",[23],"По завершении установщик печатает одноразовую ссылку. Открыть её в браузере — единственный способ\nсоздать первого администратора: больше его не создать ничем, и ссылка сгорает при использовании.",{"id":174,"title":175,"titles":176,"content":177,"level":25},"/ru/docs/installation#после-первого-входа","После первого входа",[23],"Включите двухфакторную аутентификацию и создайте первый аккаунт хостинга. Аккаунт — настоящий\nпользователь Linux со своим домашним каталогом, своим пулом php-fpm и квотой по тарифу; создание\nчерез панель и есть то, что разворачивает его на хосте.",{"id":179,"title":180,"titles":181,"content":182,"level":25},"/ru/docs/installation#обновления-и-откат","Обновления и откат",[23],"Обновления подписаны и ставятся из панели или утилитой 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);}",1790166389858]