[{"data":1,"prerenderedAt":539},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"release-ru-0.1.0":12,"releases-index-ru":93,"i-lucide:link":537},{"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,"body":16,"channel":81,"date":82,"description":83,"extension":84,"meta":85,"navigation":86,"path":87,"seo":88,"seoTitle":89,"stem":90,"version":91,"__hash__":92},"releasesRu/ru/releases/0.1.0.md","Maran 0.1.0 — основание",{"type":17,"value":18,"toc":75},"minimark",[19,23,28,62,66],[20,21,22],"p",{},"Каркас, а не продукт, который вы поставите перед клиентами хостинга. Он всё же опубликован как релиз,\nпотому что всё последующее построено на принятых здесь решениях.",[24,25,27],"h2",{"id":26},"что-входит","Что входит",[29,30,31,39,45,51,57],"ul",{},[32,33,34,38],"li",{},[35,36,37],"strong",{},"Контракт"," между панелью и корневым агентом — типизированные операции, которыми они\nобмениваются через unix-сокет.",[32,40,41,44],{},[35,42,43],{},"Скелет агента на Rust",", включая проверку учётных данных пира на сокете: агент знает, какой\nпроцесс его просит, до того как что-либо сделает.",[32,46,47,50],{},[35,48,49],{},"Модульный монолит на C#",", который стал панелью.",[32,52,53,56],{},[35,54,55],{},"Оболочка на Vue",", в которой построен интерфейс.",[32,58,59],{},[35,60,61],{},"Среда разработки и CI.",[24,63,65],{"id":64},"чего-не-входит","Чего не входит",[20,67,68,69,74],{},"Ни одной возможности хостинга. Аккаунты, сайты, пулы PHP, SSL, базы данных, передача файлов,\nрезервные копии, брандмауэр и мониторинг собраны после этого тега и в него не входят. Они на пути к\nпервому функциональному релизу; что опубликовано — смотрите в ",[70,71,73],"a",{"href":72},"/releases","релизах",".",{"title":76,"searchDepth":77,"depth":77,"links":78},"",2,[79,80],{"id":26,"depth":77,"text":27},{"id":64,"depth":77,"text":65},"stable","2026-08-29","Первая помеченная версия — контракт, скелет агента на Rust, монолит на C#, оболочка на Vue и среда разработки.","md",{},true,"/ru/releases/0.1.0",{"title":15,"description":83},"Maran 0.1.0 — релиз-основание","ru/releases/0.1.0","0.1.0","HWMt0R1wIPNB5ifZm8CdskBZnsuKeTy78zSeUdo74Ug",[94,135],{"id":14,"title":15,"body":95,"channel":81,"date":82,"description":83,"extension":84,"meta":133,"navigation":86,"path":87,"seo":134,"seoTitle":89,"stem":90,"version":91,"__hash__":92},{"type":17,"value":96,"toc":129},[97,99,101,123,125],[20,98,22],{},[24,100,27],{"id":26},[29,102,103,107,111,115,119],{},[32,104,105,38],{},[35,106,37],{},[32,108,109,44],{},[35,110,43],{},[32,112,113,50],{},[35,114,49],{},[32,116,117,56],{},[35,118,55],{},[32,120,121],{},[35,122,61],{},[24,124,65],{"id":64},[20,126,68,127,74],{},[70,128,73],{"href":72},{"title":76,"searchDepth":77,"depth":77,"links":130},[131,132],{"id":26,"depth":77,"text":27},{"id":64,"depth":77,"text":65},{},{"title":15,"description":83},{"id":136,"title":137,"body":138,"channel":528,"date":529,"description":530,"extension":84,"meta":531,"navigation":86,"path":532,"seo":533,"seoTitle":137,"stem":534,"version":535,"__hash__":536},"releasesRu/ru/releases/1.0.0-beta.1.md","Maran 1.0.0-beta.1 — первый устанавливаемый выпуск",{"type":17,"value":139,"toc":520},[140,146,149,153,189,202,205,209,217,297,324,327,371,383,387,448,452,455,459,462,502,505,509,516],[20,141,142,143],{},"Первый выпуск, который ставится на сервер и проводит хостинг-аккаунт через весь путь. Он опубликован\nкак бета, и слово означает ровно то, что означает: ",[35,144,145],{},"пока не сажайте на него чужих клиентов.",[20,147,148],{},"Софт ставится, работает и делает то, что написано на его экранах. Три вещи, которым платный\nхостинг-продукт обязан быть достоин доверия, проверялись только в контейнерах самого проекта — ни\nодин сертификат не выпущен настоящим удостоверяющим центром, ни одна дисковая квота не проверена\nнастоящей файловой системой, и ни одно восстановление не выполнено на настоящем железе. Это не\nизвестные ошибки, это утверждения, которые пока никто не подтвердил там, где это важно.",[24,150,152],{"id":151},"установка","Установка",[154,155,159],"pre",{"className":156,"code":157,"language":158,"meta":76,"style":76},"language-bash shiki shiki-themes github-light github-dark","curl -sSL https://get.maran.innovayse.com | sudo bash\n","bash",[160,161,162],"code",{"__ignoreMap":76},[163,164,167,171,175,179,183,186],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sScJk","curl",[163,172,174],{"class":173},"sj4cs"," -sSL",[163,176,178],{"class":177},"sZZnC"," https://get.maran.innovayse.com",[163,180,182],{"class":181},"szBVR"," |",[163,184,185],{"class":169}," sudo",[163,187,188],{"class":177}," bash\n",[20,190,191,192,195,196,74],{},"Установщик скачивает артефакты, перечисленные в манифесте, подписанном релизным ключом проекта, и\nотказывается принимать всё, чья подпись или контрольная сумма не сходится. Манифест и названные в\nнём артефакты опубликованы на ",[160,193,194],{},"releases.maran.innovayse.com",", а исходники на теге, из которого\nсобран выпуск, — на ",[70,197,201],{"href":198,"rel":199},"https://github.com/innovayse/maran",[200],"nofollow","GitHub",[20,203,204],{},"Посмотрите, что установщик собирается сделать, прежде чем запускать его от root — как с любым\nскриптом, которому вы отдаёте сервер: скачайте, прочитайте, потом запускайте.",[24,206,208],{"id":207},"файлы-и-как-проверить-их-самому","Файлы и как проверить их самому",[20,210,211,212,216],{},"Всё, что скачивает установщик, опубликовано на\n",[70,213,194],{"href":214,"rel":215},"https://releases.maran.innovayse.com",[200]," и перечислено в манифесте,\nподписанном ключом релизов проекта.",[218,219,220,236],"table",{},[221,222,223],"thead",{},[224,225,226,230,233],"tr",{},[227,228,229],"th",{},"Файл",[227,231,232],{},"Размер",[227,234,235],{},"SHA-256",[237,238,239,259,278],"tbody",{},[224,240,241,251,254],{},[242,243,244],"td",{},[70,245,248],{"href":246,"rel":247},"https://releases.maran.innovayse.com/beta/agent-x86_64.tar.gz",[200],[160,249,250],{},"agent-x86_64.tar.gz",[242,252,253],{},"2.9 MB",[242,255,256],{},[160,257,258],{},"f9a57621ef349cb1bfc2df5f7f812685fb3a5a690834b18bd1ae8df2493fbadc",[224,260,261,270,273],{},[242,262,263],{},[70,264,267],{"href":265,"rel":266},"https://releases.maran.innovayse.com/beta/api-x86_64.tar.gz",[200],[160,268,269],{},"api-x86_64.tar.gz",[242,271,272],{},"25.4 MB",[242,274,275],{},[160,276,277],{},"6f367807e265d06bee9db37d692d0748c5fb815967965c0e59675a0b8468c799",[224,279,280,289,292],{},[242,281,282],{},[70,283,286],{"href":284,"rel":285},"https://releases.maran.innovayse.com/beta/frontend-x86_64.tar.gz",[200],[160,287,288],{},"frontend-x86_64.tar.gz",[242,290,291],{},"340 KB",[242,293,294],{},[160,295,296],{},"27879087ddb1a0d1e05e92b9b0b4dec6da21a99263388a74e122681ada828009",[20,298,299,300,307,308,315,316,323],{},"Подписанный список — ",[70,301,304],{"href":302,"rel":303},"https://releases.maran.innovayse.com/beta/manifest.json",[200],[160,305,306],{},"manifest.json",", рядом\nс ним ",[70,309,312],{"href":310,"rel":311},"https://releases.maran.innovayse.com/beta/manifest.json.sig",[200],[160,313,314],{},"manifest.json.sig",", а\n",[70,317,320],{"href":318,"rel":319},"https://releases.maran.innovayse.com/beta/integrity-manifest.json",[200],[160,321,322],{},"integrity-manifest.json","\nзаписывает каждый файл внутри архивов, а не только сами архивы.",[20,325,326],{},"Если не хочется ничего направлять в root-шелл по трубе — та же установка без неё:",[154,328,330],{"className":156,"code":329,"language":158,"meta":76,"style":76},"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",[160,331,332,342,353],{"__ignoreMap":76},[163,333,334,336,339],{"class":165,"line":166},[163,335,170],{"class":169},[163,337,338],{"class":173}," -O",[163,340,341],{"class":177}," https://releases.maran.innovayse.com/installer/maran-installer.tar.gz\n",[163,343,344,347,350],{"class":165,"line":77},[163,345,346],{"class":169},"tar",[163,348,349],{"class":173}," -xzf",[163,351,352],{"class":177}," maran-installer.tar.gz\n",[163,354,356,359,362,365,368],{"class":165,"line":355},3,[163,357,358],{"class":169},"sudo",[163,360,361],{"class":177}," bash",[163,363,364],{"class":177}," installer/install.sh",[163,366,367],{"class":173}," --channel",[163,369,370],{"class":177}," beta\n",[20,372,373,374,377,378,74],{},"Публичный ключ, которым проверяет установщик, едет внутри этого пакета —\n",[160,375,376],{},"installer/keys/release-signing.pub",". Стоит сказать прямо: подпись, проверенная ключом, скачанным с\nтого же хоста, доказывает лишь, что оба пришли из одного места. Чтобы доказать больше, сверьте этот\nключ с ",[70,379,382],{"href":380,"rel":381},"https://github.com/innovayse/maran/blob/main/installer/keys/release-signing.pub",[200],"копией в репозитории",[24,384,386],{"id":385},"что-получает-сервер","Что получает сервер",[29,388,389,395,401,407,413,419,425,442],{},[32,390,391,394],{},[35,392,393],{},"Хостинг-аккаунты — настоящие пользователи Linux."," Создание аккаунта заводит системного\nпользователя, домашний каталог и дисковую квоту тарифа на самом сервере; приостановка,\nвозобновление и удаление тоже доходят до хоста. Сначала действует агент, потом появляется запись\nв базе — поэтому панель никогда не заявляет аккаунт, которого на сервере нет.",[32,396,397,400],{},[35,398,399],{},"Сайты"," — статические, PHP и обратный прокси — с алиасами доменов и корнем внутри домашнего\nкаталога аккаунта. Агент рендерит конфигурацию, заставляет штатный валидатор сервера проверить\nрезультат и откатывает файл, если проверка или перезагрузка отказались, — поэтому плохой рендер\nне может уронить остальные сайты сервера.",[32,402,403,406],{},[35,404,405],{},"Несколько версий PHP одновременно",", у каждого аккаунта свой пул на версию, работающий от его\nже пользователя Linux. Клиент может менять разрешённое подмножество настроек; имя вне списка\nотклоняется, а не отбрасывается молча.",[32,408,409,412],{},[35,410,411],{},"SSL"," по ACME с проверкой HTTP-01, загрузка собственных сертификатов и продление за тридцать\nдней до истечения. Ключи пишутся в хранилище, доступное только root и лежащее вне домашних\nкаталогов, потому что PHP сайта работает от имени клиента.",[32,414,415,418],{},[35,416,417],{},"Базы данных"," с отдельным пользователем на каждую, лимитами тарифа и показом размера. Пароль\nгенерируется, показывается один раз и не хранится — поэтому восстановление это сброс, а не\nизвлечение.",[32,420,421,424],{},[35,422,423],{},"Передача файлов"," — SFTP штатным OpenSSH сервера, каждый вход заперт в jail, внутрь которого\nпримонтирован настоящий домашний каталог аккаунта, с его же uid и без шелла. FTPS поставляется\nустановленным, но выключенным: ничего не слушает, пока администратор его не включит.",[32,426,427,430,431,434,435,438,439,74],{},[35,428,429],{},"Резервные копии",", ",[35,432,433],{},"журнал аудита"," только на дозапись по каждому входу и каждому изменению,\nживой просмотр ",[35,436,437],{},"логов",", брандмауэр, мониторинг и консольная утилита ",[160,440,441],{},"maran",[32,443,444,447],{},[35,445,446],{},"Вход в панель"," с Argon2id, короткоживущими токенами доступа, ротацией refresh-токенов, где\nповторно использованный токен отзывает всё семейство, TOTP с кодами восстановления и сессиями,\nкоторые можно отозвать по одной или все разом.",[24,449,451],{"id":450},"чего-он-намеренно-не-делает","Чего он намеренно не делает",[20,453,454],{},"DNS, почта и веб-менеджер баз данных. Каждое отсутствует по решению, а не по недоделанности:\nменеджер баз данных запланирован отдельным развёртыванием со своим адресом и своей аутентификацией,\nа не наполовину сделанным здесь.",[24,456,458],{"id":457},"прежде-чем-ставить-туда-где-это-важно","Прежде чем ставить туда, где это важно",[20,460,461],{},"Три ограничения стоит знать заранее — иначе оператор узнает о них трудным путём.",[29,463,464,478,484],{},[32,465,466,469,470,473,474,477],{},[35,467,468],{},"Ни один сертификат не выпущен настоящим удостоверяющим центром."," Весь путь при этом\nпроходится целиком — регистрация, заказ, проверка HTTP-01, финализация, скачивание — против\n",[160,471,472],{},"pebble",", тестового сервера самого Let's Encrypt, причём серийный номер выданного сертификата\nсовпадает с прочитанным из PEM. Это упражнение нашло настоящий дефект, которого не видел ни один\nтест: клиент не отправлял ",[160,475,476],{},"User-Agent",", а pebble отклоняет такие запросы, Let's Encrypt же их\nтерпит. Не проверен сам центр: ни его лимиты, ни проверка из публичной сети, ни его цепочка.\nВетка продления не проверялась вовсе — тест каждый раз вынуждает новую проверку. Только HTTP-01,\nбез wildcard-сертификатов: они придут вместе с управлением DNS.",[32,479,480,483],{},[35,481,482],{},"Удаление базы данных окончательно."," Нет ни снимка, ни корзины, ни задержки, и путь удаления\nникак не обращается к модулю резервных копий. База восстановима только из копии, которая уже\nсуществовала.",[32,485,486,489,490,493,494,497,498,501],{},[35,487,488],{},"Конфигурация SSH-демона отслеживается, и у слежения названа граница."," Установщик пишет блок,\nкоторый делает вход для передачи файлов запертым, а мониторинг теперь читает этот блок обратно и\nподнимает тревогу при расхождении — причём все четыре директивы по отдельности, поэтому блок с\nуцелевшим заголовком и опустошённым телом тоже будет пойман. Читается файл конфигурации, а не\nответ демона: ",[160,491,492],{},"sshd -T"," вообще никогда не печатает содержимое блока ",[160,495,496],{},"Match",". Чего слежение не\nделает: не идёт по директивам ",[160,499,500],{},"Include"," и не доказывает, что на разошедшемся хосте действительно\nвыдаётся шелл. Оно сообщает, что конфигурация больше не говорит написанного.",[20,503,504],{},"Заметки об угрозах по привилегированным частям были прочитаны и приняты в день выпуска. Это\nудовлетворяет собственному правилу проекта о втором проверяющем. Это не внешний аудит, и эта\nстраница его не заявляет.",[24,506,508],{"id":507},"обновление-с-010","Обновление с 0.1.0",[20,510,511,512,515],{},"Пути обновления нет, и он не нужен: ",[70,513,91],{"href":514},"/releases/0.1.0"," был каркасом без хостинговых функций,\nи сохранять на нём было нечего.",[517,518,519],"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":76,"searchDepth":77,"depth":77,"links":521},[522,523,524,525,526,527],{"id":151,"depth":77,"text":152},{"id":207,"depth":77,"text":208},{"id":385,"depth":77,"text":386},{"id":450,"depth":77,"text":451},{"id":457,"depth":77,"text":458},{"id":507,"depth":77,"text":508},"beta","2026-09-23","Первый выпуск, который ставится на сервер: аккаунты как настоящие пользователи Linux, сайты, версии PHP, SSL, базы данных, передача файлов и резервные копии — опубликован как бета, с честно очерченной границей.",{},"/ru/releases/0.0-beta.1",{"title":137,"description":530},"ru/releases/1.0.0-beta.1","1.0.0-beta.1","gtSb3_GcJDmwYc67f98G8Ey2aCD3k1DCinQ7xzdocV4",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":538},"\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>",1790166380290]