[{"data":1,"prerenderedAt":752},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"marketing-home-ru":12,"home-faq-ru":201,"home-latest-ru":260,"i-lucide:copy":712,"i-lucide:plug":714,"i-lucide:globe":716,"i-lucide:lock":718,"i-lucide:archive":720,"i-lucide:scroll-text":722,"i-lucide:refresh-cw":724,"i-lucide:layout-dashboard":726,"i-lucide:shield-check":728,"i-lucide:database":730,"i-lucide:minus":732,"i-lucide:check":734,"i-lucide:x":736,"i-lucide:terminal":738,"i-lucide:file-check":740,"i-lucide:fingerprint":742,"i-lucide:eye-off":744,"i-lucide:building-2":746,"i-lucide:users":748,"i-lucide:server":750},{"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\"/>",{"doc":13,"isFallback":6},{"id":14,"title":15,"architectureHeading":16,"architectureIntro":17,"architectureNote":18,"architectureProcesses":19,"audienceGroups":39,"audienceHeading":52,"audienceIntro":53,"body":54,"coverCaption":61,"ctaBody":62,"ctaLabel":63,"ctaPath":64,"ctaTitle":65,"description":66,"extension":67,"eyebrow":68,"faqCtaLabel":69,"faqCtaPath":70,"faqHeading":71,"faqIntro":72,"headline":73,"highlights":74,"installCaption":89,"installCommand":90,"latestHeading":91,"latestIntro":92,"licenceBody":93,"licenceCtaLabel":94,"licenceCtaPath":95,"licenceHeading":96,"licencePoints":97,"meta":108,"navigation":32,"path":109,"pillars":110,"platformsCtaLabel":134,"platformsCtaPath":135,"platformsFamilies":136,"platformsHeading":148,"platformsIntro":149,"platformsNote":150,"primaryCtaLabel":63,"primaryCtaPath":64,"secondaryCtaLabel":151,"secondaryCtaPath":135,"securityCtaLabel":152,"securityCtaPath":153,"securityHeading":154,"securityIntro":155,"securityPoints":156,"seo":171,"seoTitle":172,"statusCtaLabel":173,"statusCtaPath":174,"statusHeading":175,"statusIntro":176,"statusMissing":177,"statusShipped":181,"stem":188,"steps":189,"subhead":199,"__hash__":200},"marketingRu/ru/marketing/home.md","Maran — панель управления хостингом для серверов Linux","Три процесса, и root принадлежит одному из них","Это разделение — главное проектное решение продукта. Всё остальное на этой странице следует из него.","Панель просит у агента именованные операции с типизированными и проверенными аргументами. Нет операции, которая запускает переданную программу, и нигде между ними нет shell-строки — поэтому множество того, что можно заставить сделать корневой процесс, конечно, записано и поддаётся ревью.",[20,26,33],{"name":21,"role":22,"runsAs":23,"holds":24,"icon":25},"maran-api","Сама панель","непривилегированного системного пользователя","всю бизнес-логику и единственное подключение к базе","lucide:layout-dashboard",{"name":27,"role":28,"runsAs":29,"holds":30,"icon":31,"privileged":32},"maran-agent","Единственный процесс с root","root","ничего — без состояния, без базы, без собственной конфигурации","lucide:shield-check",true,{"name":34,"role":35,"runsAs":36,"holds":37,"icon":38},"PostgreSQL","Данные панели","собственного пользователя","аккаунты, сайты, журнал аудита — на unix-сокете, без TCP-порта вовсе","lucide:database",[40,44,48],{"icon":41,"title":42,"body":43},"lucide:building-2","Хостинг-компаниям","Кабинет на каждого клиента, тарифы, ограничивающие аккаунт, и API провижининга, которым биллинг создаёт аккаунты без участия человека.",{"icon":45,"title":46,"body":47},"lucide:users","Агентствам и студиям","Сайты клиентов на одном сервере, каждый — свой пользователь Linux со своей квотой и версией PHP, плюс журнал аудита, который отвечает, кто что менял.",{"icon":49,"title":50,"body":51},"lucide:server","Одному серверу, одному владельцу","Всё, что нужно одной машине: установка одной командой, обновления подписанными артефактами и откат ещё одной командой.","Для кого он сделан","Мультиарендность заложена с первого релиза, а не добавлена позже, — и это видно по тому, кому он подходит.",{"type":55,"value":56,"toc":57},"minimark",[],{"title":58,"searchDepth":59,"depth":59,"links":60},"",2,[],"Панель — рисунок, а не скриншот: аккаунты, сайты и журнал аудита на одном сервере.","Архитектура, контракт между панелью и агентом и то, что установщик делает с сервером — записано, а не пересказано.","Открыть документацию","/docs","Прочитайте, как это устроено, прежде чем доверить этому root","Сайты, PHP, SSL, базы данных, резервные копии и брандмауэр из браузера — на сервере, где root держит один небольшой демон, и он не принимает shell-команд.","md","Панель хостинга с открытым исходным кодом","Все вопросы","/faq","О чём спрашивают первым делом","Короткие ответы. Остальные — на странице вопросов.","Панель управления хостингом, которая держит root при себе",[75,78,82,85],{"icon":31,"title":76,"body":77},"Один процесс с root","Панель работает без привилегий. Root держит небольшой демон на Rust, и в его контракте нет операции, запускающей переданную ей программу.",{"icon":79,"title":80,"body":81},"lucide:terminal","Никаких shell-строк","Домен проверяется как домен, а не экранируется в командную строку. В нём неоткуда взяться переводу строки, который завершит одну директиву и начнёт другую.",{"icon":45,"title":83,"body":84},"Настоящие пользователи Linux","Каждый аккаунт — системный пользователь со своим домашним каталогом, своим пулом php-fpm под своим uid и своей квотой.",{"icon":86,"title":87,"body":88},"lucide:plug","Готов к биллингу","API провижининга создаёт, приостанавливает и удаляет аккаунты, так что биллинг ведёт хостинг без участия человека.","Одна команда на чистом сервере. Все проверки проходят до того, как что-то изменится.","curl -sSL https://get.maran.innovayse.com | bash","Что нового","Свежий релиз и последнее написанное о том, как всё это устроено.","Maran публикуется под Business Source License 1.1 компанией Innovayse LLC и переходит в Apache 2.0 29 августа 2030 года. Дата записана в самой лицензии, а не обещана.","Прочитать лицензию","/legal/licence","Открытый код, который остаётся вашим",[98,101,103,106],{"icon":99,"text":100},"lucide:check","Ставьте и размещайте на нём собственных клиентов, в продакшене, бесплатно",{"icon":99,"text":102},"Читайте, меняйте и участвуйте — исходный код открыт, авторское право остаётся за автором вклада",{"icon":104,"text":105},"lucide:x","Нельзя предлагать сам Maran третьим лицам как управляемый сервис панели",{"icon":104,"text":107},"Нельзя перепродавать или релицензировать его как собственный коммерческий продукт",{},"/ru/marketing/home",[111,115,119,122,126,130],{"icon":112,"title":113,"body":114},"lucide:globe","Сайты и PHP","Статические, PHP и реверс-прокси сайты с алиасами. Агент проверяет каждый отрендеренный vhost силами самого веб-сервера и откатывает его, если перезагрузка отказала.",{"icon":116,"title":117,"body":118},"lucide:lock","SSL, который продлевается сам","ACME с проверкой HTTP-01, загрузка собственных сертификатов, продление за тридцать дней до истечения и ключи в root-хранилище вне домашних каталогов.",{"icon":38,"title":120,"body":121},"Базы данных и передача файлов","База и ограниченный пользователь на аккаунт, SFTP в chroot с настоящим uid аккаунта, лимиты по тарифу на то и другое.",{"icon":123,"title":124,"body":125},"lucide:archive","Копии и брандмауэр","Резервные копии файлов и баз с восстановлением по одной, управляемый брандмауэр и мониторинг состояния сервера.",{"icon":127,"title":128,"body":129},"lucide:scroll-text","Журнал аудита","Только на дозапись, с каждым входом и каждым изменением, и экран, который открывается только администраторам.",{"icon":131,"title":132,"body":133},"lucide:refresh-cw","Подписанные обратимые обновления","Обновления подписаны, делают дамп базы до того, как что-то заменить, и откатываются одной командой.","Посмотреть требования","/platforms",[137,140,143,146],{"name":138,"versions":139},"Ubuntu","22.04 · 24.04 LTS",{"name":141,"versions":142},"Debian","12 · 13",{"name":144,"versions":145},"AlmaLinux","9 · 10",{"name":147,"versions":145},"Rocky Linux","Работает там, где уже работают ваши серверы","Одна команда на чистом сервере с любой из этих систем, на x86_64 или aarch64.","Систему вне этого списка установщик отвергает, а не угадывает: он знает раскладку пакетов и имена служб каждого поддерживаемого семейства. В продакшене установка нативная, Docker используется только в разработке.","Посмотреть, что поддерживается","Политика безопасности","/security","Безопасен по устройству, а не по обещанию","Четыре свойства кода — каждое либо верно, либо нет, и каждое проверяется чтением.",[157,159,163,167],{"icon":79,"title":80,"body":158},"Домен проверяется как домен — буквы, цифры, дефисы, точки, — а не экранируется в командную строку. В нём неоткуда взяться переводу строки, который завершит одну директиву и начнёт другую.",{"icon":160,"title":161,"body":162},"lucide:file-check","Конфигурацию проверяет сам сервер","Каждая запись рендерится, атомарно переименовывается на место и проверяется самой службой. Если проверка или перезагрузка отказали, файл откатывается.",{"icon":164,"title":165,"body":166},"lucide:fingerprint","Агент проверяет, кто спрашивает","Учётные данные пира читаются из сокета до рассмотрения операции, поэтому демон знает, какой процесс на другом конце, а не верит тому, что ему сказали.",{"icon":168,"title":169,"body":170},"lucide:eye-off","Чужая строка отвечает 404","Запрос чужого ресурса получает «не найдено», а не «запрещено», — ошибка никогда не подтверждает, что строка существует.",{"title":15,"description":66},"Maran — панель управления хостингом для Linux","Открыть релизы","/releases","Где он сегодня","В активной разработке к первому функциональному релизу. Ниже — что есть, и чего нет.",[178,179,180],"Пока нет веб-менеджера баз данных и файлового менеджера в браузере","Сертификаты только по HTTP-01 — wildcard появятся вместе с управлением DNS","Почта, DNS, реселлерские аккаунты и управление несколькими серверами — после первого релиза",[182,183,184,185,186,187],"Аккаунты как настоящие пользователи Linux, с квотами, приостановкой и удалением, доходящими до хоста","Сайты — статические, PHP и реверс-прокси — с проверкой конфигурации и откатом при отказе","Несколько версий PHP одновременно, отдельный пул на аккаунт и версию","SSL по ACME с продлением за тридцать дней, ключи вне домашних каталогов","Базы данных и SFTP-логины с лимитами по тарифу и одноразовыми паролями","Резервные копии, управляемый брандмауэр, мониторинг и журнал аудита только на дозапись","ru/marketing/home",[190,193,196],{"title":191,"body":192},"Установить","Одна команда на чистом сервере. Предварительная проверка смотрит дистрибутив, память, диск и порты и сообщает обо всех проблемах сразу, а не по одной за запуск.",{"title":194,"body":195},"Открыть одноразовую ссылку","Установщик печатает ссылку, которая создаёт первого администратора. Больше её не создать ничем, и она сгорает при использовании.",{"title":197,"body":198},"Создать аккаунт","Аккаунт разворачивается на хосте как настоящий пользователь Linux со своим домом, пулом и квотой — и его кабинет передаётся клиенту.","Сайты, версии PHP, SSL, базы данных, передача файлов, резервные копии и брандмауэр — из браузера, с отдельным кабинетом для каждого клиента и API, которым управляет ваша биллинговая система.","KizNDpGPBatzezAhs85-KLt_ikt4aABxjwehupw51Ak",{"doc":202,"isFallback":6},{"id":203,"title":204,"body":205,"description":222,"extension":67,"meta":223,"navigation":32,"path":224,"questions":225,"seo":256,"seoTitle":257,"stem":258,"__hash__":259},"faqRu/ru/faq.md","Частые вопросы",{"type":55,"value":206,"toc":220},[207],[208,209,210,211,215,216,219],"p",{},"Если чего-то здесь нет, ",[212,213,214],"a",{"href":64},"документация"," идёт дальше, а страница ",[212,217,218],{"href":174},"релизов"," — честная\nзапись того, что действительно опубликовано.",{"title":58,"searchDepth":59,"depth":59,"links":221},[],"Что такое Maran, сколько стоит, на каких дистрибутивах работает, как ставится и чего сознательно не делает — ответы на десять вопросов.",{},"/ru/faq",[226,229,232,235,238,241,244,247,250,253],{"question":227,"answer":228},"Что такое Maran?","Панель управления веб-хостингом для серверов Linux. Вы ставите её на сервер и управляете сайтами, версиями PHP, SSL-сертификатами, базами данных, файлами, резервными копиями и брандмауэром из браузера, с отдельным кабинетом для каждого клиента и API, которым управляет биллинговая система.",{"question":230,"answer":231},"Это бесплатно?","Панель открыта по Business Source License 1.1 и бесплатна для самостоятельного хостинга, включая размещение собственных платящих клиентов. Лицензия запрещает другое — предлагать сам Maran как управляемый сервис панели или перепродавать его как свой продукт. Коммерческие модули распространяются отдельно и требуют ключа; цены пока не опубликованы.",{"question":233,"answer":234},"Можно ли использовать его в своём хостинговом бизнесе?","Да. Размещение собственных клиентов прямо разрешено лицензией, а мультиарендность заложена в продукт с первого релиза, а не добавлена позже.",{"question":236,"answer":237},"Какие дистрибутивы поддерживаются?","Ubuntu 22.04 и 24.04 LTS, Debian 12 и 13, AlmaLinux 9 и 10, Rocky Linux 9 и 10, на x86_64 и aarch64. Систему вне этого списка установщик отвергает, а не пытается угадать её раскладку пакетов.",{"question":239,"answer":240},"Как он устанавливается?","Одной командой от root на чистом сервере. Установщик проверяет дистрибутив, память, диск и порты до любых изменений и сообщает обо всех проблемах сразу. По завершении он печатает одноразовую ссылку для создания первого администратора.",{"question":242,"answer":243},"Он работает в Docker?","В продакшене — нет. Продакшен-установка нативная: панель, агент, база данных и хостинговый стек ставятся как обычные системные службы. Docker используется только в разработке.",{"question":245,"answer":246},"Чем он отличается от других панелей?","Привилегированной половиной. Сама панель работает без привилегий и держит всю логику; единственный процесс с root — небольшой демон на Rust, и в контракте между ними нет ни операции, запускающей переданную программу, ни единой shell-строки. Множество того, что можно попросить у корневого процесса, конечно, записано и поддаётся ревью.",{"question":248,"answer":249},"Готов ли он к продакшену?","Пока нет. Проект в активной разработке к своему первому функциональному релизу, и текущий набор возможностей ещё не выпущен. Смотрите страницу релизов, а не предполагайте, что версия существует.",{"question":251,"answer":252},"Чего в нём ещё нет?","Нет веб-менеджера баз данных и файлового менеджера в браузере, а сертификаты только по HTTP-01, поэтому wildcard появятся вместе с управлением DNS. Почта, DNS, реселлерские аккаунты и централизованное управление несколькими серверами запланированы после первого релиза.",{"question":254,"answer":255},"Куда сообщать о проблеме безопасности?","Письмом на security@innovayse.com, и никогда — в публичный issue. Отчёты подтверждаются в течение 48 часов, а для критичных проблем целевой срок исправления или описанного обходного решения — 14 дней.",{"title":204,"description":222},"Вопросы о Maran и ответы на них","ru/faq","yF6-uWraxMVzEw1KiTJWWkkNZ86xWdZ6m9TP_3zhWnI",{"release":261,"post":669},{"id":262,"title":263,"body":264,"channel":660,"date":661,"description":662,"extension":67,"meta":663,"navigation":32,"path":664,"seo":665,"seoTitle":263,"stem":666,"version":667,"__hash__":668},"releasesRu/ru/releases/1.0.0-beta.1.md","Maran 1.0.0-beta.1 — первый устанавливаемый выпуск",{"type":55,"value":265,"toc":652},[266,273,276,281,317,331,334,338,346,426,453,456,500,512,516,579,583,586,590,593,633,636,640,648],[208,267,268,269],{},"Первый выпуск, который ставится на сервер и проводит хостинг-аккаунт через весь путь. Он опубликован\nкак бета, и слово означает ровно то, что означает: ",[270,271,272],"strong",{},"пока не сажайте на него чужих клиентов.",[208,274,275],{},"Софт ставится, работает и делает то, что написано на его экранах. Три вещи, которым платный\nхостинг-продукт обязан быть достоин доверия, проверялись только в контейнерах самого проекта — ни\nодин сертификат не выпущен настоящим удостоверяющим центром, ни одна дисковая квота не проверена\nнастоящей файловой системой, и ни одно восстановление не выполнено на настоящем железе. Это не\nизвестные ошибки, это утверждения, которые пока никто не подтвердил там, где это важно.",[277,278,280],"h2",{"id":279},"установка","Установка",[282,283,287],"pre",{"className":284,"code":285,"language":286,"meta":58,"style":58},"language-bash shiki shiki-themes github-light github-dark","curl -sSL https://get.maran.innovayse.com | sudo bash\n","bash",[288,289,290],"code",{"__ignoreMap":58},[291,292,295,299,303,307,311,314],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"sScJk","curl",[291,300,302],{"class":301},"sj4cs"," -sSL",[291,304,306],{"class":305},"sZZnC"," https://get.maran.innovayse.com",[291,308,310],{"class":309},"szBVR"," |",[291,312,313],{"class":297}," sudo",[291,315,316],{"class":305}," bash\n",[208,318,319,320,323,324,330],{},"Установщик скачивает артефакты, перечисленные в манифесте, подписанном релизным ключом проекта, и\nотказывается принимать всё, чья подпись или контрольная сумма не сходится. Манифест и названные в\nнём артефакты опубликованы на ",[288,321,322],{},"releases.maran.innovayse.com",", а исходники на теге, из которого\nсобран выпуск, — на ",[212,325,329],{"href":326,"rel":327},"https://github.com/innovayse/maran",[328],"nofollow","GitHub",".",[208,332,333],{},"Посмотрите, что установщик собирается сделать, прежде чем запускать его от root — как с любым\nскриптом, которому вы отдаёте сервер: скачайте, прочитайте, потом запускайте.",[277,335,337],{"id":336},"файлы-и-как-проверить-их-самому","Файлы и как проверить их самому",[208,339,340,341,345],{},"Всё, что скачивает установщик, опубликовано на\n",[212,342,322],{"href":343,"rel":344},"https://releases.maran.innovayse.com",[328]," и перечислено в манифесте,\nподписанном ключом релизов проекта.",[347,348,349,365],"table",{},[350,351,352],"thead",{},[353,354,355,359,362],"tr",{},[356,357,358],"th",{},"Файл",[356,360,361],{},"Размер",[356,363,364],{},"SHA-256",[366,367,368,388,407],"tbody",{},[353,369,370,380,383],{},[371,372,373],"td",{},[212,374,377],{"href":375,"rel":376},"https://releases.maran.innovayse.com/beta/agent-x86_64.tar.gz",[328],[288,378,379],{},"agent-x86_64.tar.gz",[371,381,382],{},"2.9 MB",[371,384,385],{},[288,386,387],{},"f9a57621ef349cb1bfc2df5f7f812685fb3a5a690834b18bd1ae8df2493fbadc",[353,389,390,399,402],{},[371,391,392],{},[212,393,396],{"href":394,"rel":395},"https://releases.maran.innovayse.com/beta/api-x86_64.tar.gz",[328],[288,397,398],{},"api-x86_64.tar.gz",[371,400,401],{},"25.4 MB",[371,403,404],{},[288,405,406],{},"6f367807e265d06bee9db37d692d0748c5fb815967965c0e59675a0b8468c799",[353,408,409,418,421],{},[371,410,411],{},[212,412,415],{"href":413,"rel":414},"https://releases.maran.innovayse.com/beta/frontend-x86_64.tar.gz",[328],[288,416,417],{},"frontend-x86_64.tar.gz",[371,419,420],{},"340 KB",[371,422,423],{},[288,424,425],{},"27879087ddb1a0d1e05e92b9b0b4dec6da21a99263388a74e122681ada828009",[208,427,428,429,436,437,444,445,452],{},"Подписанный список — ",[212,430,433],{"href":431,"rel":432},"https://releases.maran.innovayse.com/beta/manifest.json",[328],[288,434,435],{},"manifest.json",", рядом\nс ним ",[212,438,441],{"href":439,"rel":440},"https://releases.maran.innovayse.com/beta/manifest.json.sig",[328],[288,442,443],{},"manifest.json.sig",", а\n",[212,446,449],{"href":447,"rel":448},"https://releases.maran.innovayse.com/beta/integrity-manifest.json",[328],[288,450,451],{},"integrity-manifest.json","\nзаписывает каждый файл внутри архивов, а не только сами архивы.",[208,454,455],{},"Если не хочется ничего направлять в root-шелл по трубе — та же установка без неё:",[282,457,459],{"className":284,"code":458,"language":286,"meta":58,"style":58},"curl -O https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\ntar -xzf maran-installer.tar.gz\nsudo bash installer/install.sh --channel beta\n",[288,460,461,471,482],{"__ignoreMap":58},[291,462,463,465,468],{"class":293,"line":294},[291,464,298],{"class":297},[291,466,467],{"class":301}," -O",[291,469,470],{"class":305}," https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\n",[291,472,473,476,479],{"class":293,"line":59},[291,474,475],{"class":297},"tar",[291,477,478],{"class":301}," -xzf",[291,480,481],{"class":305}," maran-installer.tar.gz\n",[291,483,485,488,491,494,497],{"class":293,"line":484},3,[291,486,487],{"class":297},"sudo",[291,489,490],{"class":305}," bash",[291,492,493],{"class":305}," installer/install.sh",[291,495,496],{"class":301}," --channel",[291,498,499],{"class":305}," beta\n",[208,501,502,503,506,507,330],{},"Публичный ключ, которым проверяет установщик, едет внутри этого пакета —\n",[288,504,505],{},"installer/keys/release-signing.pub",". Стоит сказать прямо: подпись, проверенная ключом, скачанным с\nтого же хоста, доказывает лишь, что оба пришли из одного места. Чтобы доказать больше, сверьте этот\nключ с ",[212,508,511],{"href":509,"rel":510},"https://github.com/innovayse/maran/blob/main/installer/keys/release-signing.pub",[328],"копией в репозитории",[277,513,515],{"id":514},"что-получает-сервер","Что получает сервер",[517,518,519,526,532,538,544,550,556,573],"ul",{},[520,521,522,525],"li",{},[270,523,524],{},"Хостинг-аккаунты — настоящие пользователи Linux."," Создание аккаунта заводит системного\nпользователя, домашний каталог и дисковую квоту тарифа на самом сервере; приостановка,\nвозобновление и удаление тоже доходят до хоста. Сначала действует агент, потом появляется запись\nв базе — поэтому панель никогда не заявляет аккаунт, которого на сервере нет.",[520,527,528,531],{},[270,529,530],{},"Сайты"," — статические, PHP и обратный прокси — с алиасами доменов и корнем внутри домашнего\nкаталога аккаунта. Агент рендерит конфигурацию, заставляет штатный валидатор сервера проверить\nрезультат и откатывает файл, если проверка или перезагрузка отказались, — поэтому плохой рендер\nне может уронить остальные сайты сервера.",[520,533,534,537],{},[270,535,536],{},"Несколько версий PHP одновременно",", у каждого аккаунта свой пул на версию, работающий от его\nже пользователя Linux. Клиент может менять разрешённое подмножество настроек; имя вне списка\nотклоняется, а не отбрасывается молча.",[520,539,540,543],{},[270,541,542],{},"SSL"," по ACME с проверкой HTTP-01, загрузка собственных сертификатов и продление за тридцать\nдней до истечения. Ключи пишутся в хранилище, доступное только root и лежащее вне домашних\nкаталогов, потому что PHP сайта работает от имени клиента.",[520,545,546,549],{},[270,547,548],{},"Базы данных"," с отдельным пользователем на каждую, лимитами тарифа и показом размера. Пароль\nгенерируется, показывается один раз и не хранится — поэтому восстановление это сброс, а не\nизвлечение.",[520,551,552,555],{},[270,553,554],{},"Передача файлов"," — SFTP штатным OpenSSH сервера, каждый вход заперт в jail, внутрь которого\nпримонтирован настоящий домашний каталог аккаунта, с его же uid и без шелла. FTPS поставляется\nустановленным, но выключенным: ничего не слушает, пока администратор его не включит.",[520,557,558,561,562,565,566,569,570,330],{},[270,559,560],{},"Резервные копии",", ",[270,563,564],{},"журнал аудита"," только на дозапись по каждому входу и каждому изменению,\nживой просмотр ",[270,567,568],{},"логов",", брандмауэр, мониторинг и консольная утилита ",[288,571,572],{},"maran",[520,574,575,578],{},[270,576,577],{},"Вход в панель"," с Argon2id, короткоживущими токенами доступа, ротацией refresh-токенов, где\nповторно использованный токен отзывает всё семейство, TOTP с кодами восстановления и сессиями,\nкоторые можно отозвать по одной или все разом.",[277,580,582],{"id":581},"чего-он-намеренно-не-делает","Чего он намеренно не делает",[208,584,585],{},"DNS, почта и веб-менеджер баз данных. Каждое отсутствует по решению, а не по недоделанности:\nменеджер баз данных запланирован отдельным развёртыванием со своим адресом и своей аутентификацией,\nа не наполовину сделанным здесь.",[277,587,589],{"id":588},"прежде-чем-ставить-туда-где-это-важно","Прежде чем ставить туда, где это важно",[208,591,592],{},"Три ограничения стоит знать заранее — иначе оператор узнает о них трудным путём.",[517,594,595,609,615],{},[520,596,597,600,601,604,605,608],{},[270,598,599],{},"Ни один сертификат не выпущен настоящим удостоверяющим центром."," Весь путь при этом\nпроходится целиком — регистрация, заказ, проверка HTTP-01, финализация, скачивание — против\n",[288,602,603],{},"pebble",", тестового сервера самого Let's Encrypt, причём серийный номер выданного сертификата\nсовпадает с прочитанным из PEM. Это упражнение нашло настоящий дефект, которого не видел ни один\nтест: клиент не отправлял ",[288,606,607],{},"User-Agent",", а pebble отклоняет такие запросы, Let's Encrypt же их\nтерпит. Не проверен сам центр: ни его лимиты, ни проверка из публичной сети, ни его цепочка.\nВетка продления не проверялась вовсе — тест каждый раз вынуждает новую проверку. Только HTTP-01,\nбез wildcard-сертификатов: они придут вместе с управлением DNS.",[520,610,611,614],{},[270,612,613],{},"Удаление базы данных окончательно."," Нет ни снимка, ни корзины, ни задержки, и путь удаления\nникак не обращается к модулю резервных копий. База восстановима только из копии, которая уже\nсуществовала.",[520,616,617,620,621,624,625,628,629,632],{},[270,618,619],{},"Конфигурация SSH-демона отслеживается, и у слежения названа граница."," Установщик пишет блок,\nкоторый делает вход для передачи файлов запертым, а мониторинг теперь читает этот блок обратно и\nподнимает тревогу при расхождении — причём все четыре директивы по отдельности, поэтому блок с\nуцелевшим заголовком и опустошённым телом тоже будет пойман. Читается файл конфигурации, а не\nответ демона: ",[288,622,623],{},"sshd -T"," вообще никогда не печатает содержимое блока ",[288,626,627],{},"Match",". Чего слежение не\nделает: не идёт по директивам ",[288,630,631],{},"Include"," и не доказывает, что на разошедшемся хосте действительно\nвыдаётся шелл. Оно сообщает, что конфигурация больше не говорит написанного.",[208,634,635],{},"Заметки об угрозах по привилегированным частям были прочитаны и приняты в день выпуска. Это\nудовлетворяет собственному правилу проекта о втором проверяющем. Это не внешний аудит, и эта\nстраница его не заявляет.",[277,637,639],{"id":638},"обновление-с-010","Обновление с 0.1.0",[208,641,642,643,647],{},"Пути обновления нет, и он не нужен: ",[212,644,646],{"href":645},"/releases/0.1.0","0.1.0"," был каркасом без хостинговых функций,\nи сохранять на нём было нечего.",[649,650,651],"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":58,"searchDepth":59,"depth":59,"links":653},[654,655,656,657,658,659],{"id":279,"depth":59,"text":280},{"id":336,"depth":59,"text":337},{"id":514,"depth":59,"text":515},{"id":581,"depth":59,"text":582},{"id":588,"depth":59,"text":589},{"id":638,"depth":59,"text":639},"beta","2026-09-23","Первый выпуск, который ставится на сервер: аккаунты как настоящие пользователи Linux, сайты, версии PHP, SSL, базы данных, передача файлов и резервные копии — опубликован как бета, с честно очерченной границей.",{},"/ru/releases/0.0-beta.1",{"title":263,"description":662},"ru/releases/1.0.0-beta.1","1.0.0-beta.1","gtSb3_GcJDmwYc67f98G8Ey2aCD3k1DCinQ7xzdocV4",{"id":670,"title":671,"author":672,"body":673,"date":705,"description":706,"extension":67,"meta":707,"navigation":32,"path":708,"seo":709,"seoTitle":671,"stem":710,"__hash__":711},"blogRu/ru/blog/introducing-maran.md","Почему агент не принимает shell-команд","Innovayse",{"type":55,"value":674,"toc":701},[675,678,681,685,688,691,695,698],[208,676,677],{},"У любой панели управления одна и та же форма: то, на что человек нажимает, и то, что с правами root\nделает работу. Интересный вопрос — что между ними передаётся.",[208,679,680],{},"Обычный ответ — командная строка. Её быстрее всего собрать и труднее всего удержать в безопасности,\nпотому что каждое значение, которым управляет клиент — домен, имя базы, путь к файлу, — в конце\nконцов попадает в строку, которую разберёт оболочка. Сделать это правильно один раз легко. Сделать\nправильно везде, навсегда, пока панель растёт, — вот с чем никто не справляется.",[277,682,684],{"id":683},"что-мы-делаем-вместо-этого","Что мы делаем вместо этого",[208,686,687],{},"Корневой демон Maran принимает именованные операции с типизированными и проверенными аргументами — и\nничего больше. Нет операции, принимающей команду для запуска. Домен не экранируется перед попаданием\nв конфигурационный файл: он проверяется как домен, то есть буквы, цифры, дефисы и точки, — и в нём\nнеоткуда взяться переводу строки, который завершит одну директиву и начнёт другую.",[208,689,690],{},"Практический эффект в том, что множество вещей, которые можно заставить сделать демон, конечно,\nзаписано и поддаётся ревью. Операцию, которой нет в контракте, невозможно запросить — какой бы\nизобретательной ни была просьба.",[277,692,694],{"id":693},"во-что-это-обходится","Во что это обходится",[208,696,697],{},"Каждая новая возможность становится изменением контракта, а не новой строкой. Это медленнее, и\nнамеренно: добавить операцию — значит решить, какие у неё аргументы, что считается допустимым и что\nпроисходит, когда хост не согласен, — до того, как что-либо поедет.",[208,699,700],{},"Это же исключает целый класс возможностей, которые панель могла бы предложить: «выполни за меня вот\nэту команду». Мы считаем это правильным разменом для софта, который держит root на сервере, где живут\nчужие клиенты.",{"title":58,"searchDepth":59,"depth":59,"links":702},[703,704],{"id":683,"depth":59,"text":684},{"id":693,"depth":59,"text":694},"2026-09-19","Одно проектное решение, определившее в Maran всё остальное — корневой демон принимает типизированные операции и ни одной shell-строки — и его цена.",{},"/ru/blog/introducing-maran",{"title":671,"description":706},"ru/blog/introducing-maran","6R9W_eYBgxwLAZ8p8N04mdkFhT0hDRbAEBdpeJ3O1oE",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":713},"\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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":715},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 22v-5m3-9V2m2 6a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1zM9 8V2\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":717},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"/>\u003Cpath d=\"M12 2a14.5 14.5 0 0 0 0 20a14.5 14.5 0 0 0 0-20M2 12h20\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":719},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":721},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\"/>\u003Cpath d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8m-10 4h4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":723},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 12h-5m5-4h-5m9 9V5a2 2 0 0 0-2-2H4\"/>\u003Cpath d=\"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":725},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 12a9 9 0 0 1 9-9a9.75 9.75 0 0 1 6.74 2.74L21 8\"/>\u003Cpath d=\"M21 3v5h-5m5 4a9 9 0 0 1-9 9a9.75 9.75 0 0 1-6.74-2.74L3 16\"/>\u003Cpath d=\"M8 16H3v5\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":727},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\"/>\u003Crect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\"/>\u003Crect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\"/>\u003Crect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":729},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/>\u003Cpath d=\"m9 12l2 2l4-4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":731},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"/>\u003Cpath d=\"M3 5v14a9 3 0 0 0 18 0V5\"/>\u003Cpath d=\"M3 12a9 3 0 0 0 18 0\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":733},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":735},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 6L9 17l-5-5\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":737},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":739},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 19h8M4 17l6-6l-6-6\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":741},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"/>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5M9 15l2 2l4-4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":743},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4M14 13.12c0 2.38 0 6.38-1 8.88m4.29-.98c.12-.6.43-2.3.5-3.02M2 12a10 10 0 0 1 18-6M2 16h.01m19.79 0c.2-2 .131-5.354 0-6\"/>\u003Cpath d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2m2.31 12c.21-.66.45-1.32.57-2M9 6.8a6 6 0 0 1 9 5.2v2\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":745},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\"/>\u003Cpath d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":747},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 12h4m-4-4h4m0 13v-3a2 2 0 0 0-4 0v3\"/>\u003Cpath d=\"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2\"/>\u003Cpath d=\"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":749},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M16 3.128a4 4 0 0 1 0 7.744M22 21v-2a4 4 0 0 0-3-3.87\"/>\u003Ccircle cx=\"9\" cy=\"7\" r=\"4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":751},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\" ry=\"2\"/>\u003Crect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M6 6h.01M6 18h.01\"/>\u003C/g>",1790166387946]