Compare commits

2 Commits

Author SHA1 Message Date
Alexey Berezhok
b31dce3817 Some fixes in documentaion 2026-06-04 14:23:42 +03:00
Alexey Berezhok
09aa301dd1 - Синхронизация с github
- Добавлены изменения в доку от hestiacn
2026-06-04 14:11:27 +03:00
21 changed files with 3509 additions and 1057 deletions

View File

@@ -47,6 +47,35 @@ export default defineConfig({
copyright:
"Copyright © 2019-present Hestia Control Panel и некоторые RPM based компоненты принадлежат bayrepo",
},
search: {
provider: "local",
options: {
placeholder: "Поиск по документации",
minMatchCharLength: 1,
threshold: 0.2,
distance: 5000,
keys: ["title", "content", "headers"],
tokenize: (text) => {
const tokens = [];
const chineseChars = text.match(/[\u4e00-\u9fa5]/g) || [];
const englishWords = text.match(/[a-zA-Z0-9]+/g) || [];
return [...chineseChars, ...englishWords];
},
translations: {
button: { buttonText: "Поиск по документации" },
modal: {
noResultsText: "Ничего не найдено",
resetButtonTitle: "Сбросить поиск",
footer: {
selectText: "выбрать",
navigateText: "переключить",
closeText: "закрыть",
},
},
},
},
},
},
});
@@ -60,6 +89,7 @@ function nav() {
link: "/docs/introduction/getting-started.md",
activeMatch: "/docs/",
},
{ text: "Разработчики", link: "/team.md" },
{
text: `v${version}`,
items: [

View File

@@ -0,0 +1,125 @@
<template>
<div class="CopyToClipboardInput" v-bind="$attrs">
<input
type="text"
class="CopyToClipboardInput-input"
:value="value"
@focus="selectText"
readonly
/>
<button
type="button"
class="CopyToClipboardInput-button"
@click="copyToClipboard"
title="Copy to clipboard"
>
Copy
</button>
</div>
</template>
<script setup>
import { ref } from "vue";
defineProps({
value: {
type: String,
required: true,
},
});
const selectText = (event) => {
if (window.innerWidth > 768) {
const inputElement = event.target;
inputElement.select();
}
};
const copyToClipboard = async (event) => {
const button = event.currentTarget;
const inputValue = button.previousElementSibling.value;
try {
const copyMethod = navigator.clipboard
? () => navigator.clipboard.writeText(inputValue)
: () => {
const textarea = document.createElement("textarea");
textarea.value = inputValue;
document.body.appendChild(textarea);
textarea.select();
document.execCommand("copy");
document.body.removeChild(textarea);
};
await copyMethod();
if (navigator.vibrate) navigator.vibrate(50);
button.style.transform = "scale(0.95)";
button.textContent = "Copied!";
setTimeout(() => {
button.style.transform = "";
button.textContent = "Copy";
}, 1000);
} catch (err) {
button.textContent = "Copy failed";
console.error("Failed to copy:", err);
setTimeout(() => {
button.textContent = "Copy";
}, 1000);
}
};
</script>
<style scoped>
.CopyToClipboardInput {
display: flex;
gap: 10px;
}
.CopyToClipboardInput-input {
font-size: 0.9em;
font-family: monospace;
flex-grow: 1;
border: 1px solid var(--vp-c-border);
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
background-color: var(--vp-c-bg);
padding: 8px 13px;
&:focus {
border-color: var(--vp-button-brand-bg);
}
@media (max-width: 640px) {
font-size: 16px;
-webkit-tap-highlight-color: transparent;
}
}
.CopyToClipboardInput-button {
font-size: 14px;
border-radius: 4px;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
color: var(--vp-button-brand-text);
min-width: 73px;
font-weight: 600;
padding: 5px 10px;
background-color: var(--vp-button-brand-bg);
transition: all 0.2s ease;
user-select: none;
&:hover {
background-color: var(--vp-button-brand-hover-bg);
}
@media (max-width: 640px) {
min-width: 68px;
padding: 8px 12px;
-webkit-tap-highlight-color: transparent;
touch-action: manipulation;
&:active {
transform: scale(0.96);
}
}
}
</style>

View File

@@ -1,204 +1,250 @@
<script>
export default {
props: {
languages: {
required: true,
selected: "en",
},
items: {
required: true,
},
},
data() {
return {
pageloader: false,
hestia_wget:
"wget https://raw.githubusercontent.com/bayrepo/hestiacp-rpm/refs/heads/rhel-version/install/hst-install.sh",
hestia_wget_devel:
"wget https://dev.brepo.ru/bayrepo/hestiacp/raw/branch/master/install/hst-install.sh",
hestia_install: "sudo bash hst-install.sh",
installStr: "",
};
},
methods: {
getOptionString(item) {
if (item.textField) {
return item.selected ? `${item.param} '${item.text}'` : "";
}
if (item.selectField) {
return item.selected ? `${item.param} '${item.text}'` : "";
}
return `${item.param}${item.selected ? " yes" : " no"}`;
},
generateString() {
const installStr = this.items.map(this.getOptionString).filter(Boolean);
this.installStr = `${this.hestia_install} ${installStr.join(" ")}`;
this.$refs.dialog.showModal();
},
closeDialog(e) {
if (e.target === this.$refs.dialogClose || e.target === this.$refs.dialog) {
this.$refs.dialog.close();
}
},
checkNeedEnabled(e) {
if (e.target.value != "") {
let id = e.target.getAttribute("target");
if (!document.getElementById(id).checked) {
document.getElementById(id).click();
}
}
},
toggleOption(e) {
if (e.target.checked) {
let conflicts = e.target.getAttribute("conflicts");
if (conflicts) {
if (document.getElementById(conflicts).checked) {
document.getElementById(conflicts).click();
}
}
let depends = e.target.getAttribute("depends");
if (depends) {
if (!document.getElementById(depends).checked) {
document.getElementById(depends).click();
}
}
}
},
copyToClipboard(text, button) {
navigator.clipboard.writeText(text).then(
() => {
button.textContent = "Copied!";
setTimeout(() => {
button.textContent = "Copy";
}, 1000);
},
(err) => {
console.error("Could not copy to clipboard:", err);
}
);
},
},
};
</script>
<template>
<div class="container">
<div class="grid">
<div class="form-group" v-for="item in items">
<div class="form-check u-mb10">
<input
@change="toggleOption"
type="checkbox"
class="form-check-input"
v-model="item.selected"
:value="item.value"
:id="item.id"
:conflicts="item.conflicts"
:depends="item.depends"
/>
<label :for="item.id">{{ item.id }}</label>
</div>
<template v-if="item.textField || item.selectField">
<label class="form-label" :for="'input-' + item.id">{{ item.desc }}</label>
</template>
<template v-else>
<p>{{ item.desc }}</p>
</template>
<div v-if="item.textField">
<input
@change="checkNeedEnabled"
type="text"
class="form-control"
v-model="item.text"
:target="item.id"
:id="'input-' + item.id"
:type="'+item.type+'"
/>
</div>
<div v-if="item.selectField">
<select class="form-select" v-model="item.text" :id="'input-' + item.id">
<option v-for="language in languages" :value="language.value" :key="language.value">
{{ language.text }}
</option>
</select>
</div>
</div>
</div>
<div class="u-text-center u-mb10">
<button @click="generateString" class="form-submit" type="button">Submit</button>
</div>
<dialog ref="dialog" class="modal" @click="closeDialog">
<button class="modal-close" @click="closeDialog" type="button" ref="dialogClose">
Close
</button>
<div ref="dialogContent" class="modal-content">
<h1 class="modal-heading">Installation instructions</h1>
<div class="InstallOptions">
<div class="container">
<div class="output-card">
<h1 class="u-text-center">Инструкция по установке для RHEL</h1>
<p class="u-mb10">
Log in to your server as root, either directly or via SSH:
<code>ssh root@your.server</code> and download the installation script:
Войдите на свой сервер как root, напрямую или через SSH: ssh root@ваш.сервер, и загрузите
установочный скрипт:
</p>
<div class="u-pos-relative">
<input
type="text"
class="form-control u-monospace u-mb10"
v-model="hestia_wget"
readonly
/>
<button
class="button-positioned"
@click="copyToClipboard(hestia_wget, $event.target)"
type="button"
title="Copy to Clipboard"
>
Copy
</button>
</div>
<p class="u-mb10">For downloading devel version use:</p>
<div class="u-pos-relative">
<input
type="text"
class="form-control u-monospace u-mb10"
v-model="hestia_wget_devel"
readonly
/>
<button
class="button-positioned"
@click="copyToClipboard(hestia_wget_devel, $event.target)"
type="button"
title="Copy to Clipboard"
>
Copy
</button>
</div>
<p class="u-mb10">Then run the following command:</p>
<div class="u-pos-relative">
<textarea class="form-control u-min-height100" v-model="installStr" readonly />
<button
class="button-positioned"
@click="copyToClipboard(installStr, $event.target)"
type="button"
title="Copy to Clipboard"
>
Copy
</button>
</div>
<CopyToClipboardInput
class="u-mb10"
value="wget https://raw.githubusercontent.com/bayrepo/hestiacp-rpm/refs/heads/rhel-version/install/hst-install.sh"
style="font-size: 1.2em"
/>
<p class="u-mb10">Для загрузки разработочной версии используйте:</p>
<CopyToClipboardInput
class="u-mb10"
value="wget https://dev.brepo.ru/bayrepo/hestiacp/raw/branch/master/install/hst-install.sh"
style="font-size: 1.2em"
/>
<p class="u-mb10">
Убедитесь, что вы вошли на сервер как <code>root</code>. Настройте параметры в полях ниже,
затем скопируйте и выполните готовую команду в терминале сервера:
</p>
<CopyToClipboardInput class="u-mb10" :value="installCommand" style="font-size: 1.2em" />
</div>
</dialog>
<h2 class="u-text-center">Настройка компонентов: выберите необходимые для установки</h2>
<h3 class="u-text-center">
<i class="fa-solid fa-triangle-exclamation"></i> Примечание: Рекомендуется выполнить полную
настройку здесь, иначе вам придётся вводить данные в терминале! (Пункты 1.2.3.4.5
обязательны)
</h3>
<ul class="option-list">
<li
v-for="option in options"
:key="option.flag"
:class="{
'option-item': true,
'is-active': selectedOptions[option.flag].enabled,
'is-clickable': !option.type || !selectedOptions[option.flag].enabled,
}"
>
<div class="option-header">
<div class="form-check">
<input
type="checkbox"
class="form-check-input"
:id="option.flag"
v-model="selectedOptions[option.flag].enabled"
:conflicts="option.conflicts"
:depends="option.depends"
@change="toggleOption"
/>
<label :for="option.flag" @click.stop>{{ option.label }}</label>
</div>
</div>
<div class="option-description" v-html="option.description"></div>
<div v-if="option.type === 'text'" class="option-content">
<input
class="form-control"
type="text"
:id="`${option.flag}-input`"
v-model="selectedOptions[option.flag].value"
:placeholder="option.default"
@input="checkNeedEnabled(option.flag, $event)"
/>
</div>
<div v-if="option.type === 'select'" class="option-content">
<select
class="form-select"
:id="`${option.flag}-input`"
v-model="selectedOptions[option.flag].value"
@change="checkNeedEnabled(option.flag, $event)"
>
<option v-for="opt in option.options" :key="opt.value" :value="opt.value">
{{ opt.label }}
</option>
</select>
</div>
</li>
</ul>
</div>
</div>
</template>
<script setup>
import { ref, watchEffect } from "vue";
import CopyToClipboardInput from "./CopyToClipboardInput.vue";
const { options } = defineProps({
options: {
type: Array,
required: true,
default: () => [],
},
});
const selectedOptions = ref({});
options.forEach((option) => {
const isPortOrLang = ["port", "lang"].includes(option.flag);
selectedOptions.value[option.flag] = {
enabled: isPortOrLang || option.default === "yes",
value: option.default !== "yes" && option.default !== "no" ? option.default : null,
};
});
const checkNeedEnabled = (flag, event) => {
if (event.target.value !== "" && event.target.value !== null) {
if (!selectedOptions.value[flag].enabled) {
selectedOptions.value[flag].enabled = true;
}
}
};
const toggleOption = (event) => {
const checkbox = event.target;
const flag = checkbox.id;
const conflicts = checkbox.getAttribute("conflicts");
const depends = checkbox.getAttribute("depends");
if (checkbox.checked) {
if (conflicts) {
const conflictFlag = conflicts;
if (selectedOptions.value[conflictFlag]?.enabled) {
selectedOptions.value[conflictFlag].enabled = false;
}
}
if (depends) {
const dependFlag = depends;
if (!selectedOptions.value[dependFlag]?.enabled) {
selectedOptions.value[dependFlag].enabled = true;
}
}
}
};
const installCommand = ref("bash hst-install.sh");
watchEffect(() => {
let cmd = "sudo bash hst-install.sh";
const quoteshellarg = (str) => {
if (!str) return "''";
return `'${str.replace(/'/g, "'\\''")}'`;
};
for (const [key, { enabled, value }] of Object.entries(selectedOptions.value)) {
const opt = options.find((o) => o.flag === key);
if (!opt.type || opt.type === "checkbox") {
if (enabled !== (opt.default === "yes")) {
cmd += ` --${key} ${enabled ? "yes" : "no"}`;
}
} else if (enabled && value !== opt.default) {
const value_quoted = quoteshellarg(value);
cmd += ` --${key} ${value_quoted}`;
}
}
installCommand.value = cmd;
});
</script>
<style scoped>
.InstallOptions {
padding: 0 24px;
@media (min-width: 640px) {
padding: 0 48px;
}
@media (min-width: 960px) {
padding: 0 72px;
}
}
:root {
--text-color-light: #282828;
--text-color-dark: #f0f0f0;
}
h1 {
font-size: 32px;
font-weight: bold;
text-align: center;
margin-bottom: 30px;
color: var(--text-color-light);
}
h2 {
font-size: 24px;
font-weight: 600;
margin-bottom: 25px;
color: var(--text-color-light);
}
h3 {
font-size: 20px;
font-weight: 500;
margin-bottom: 20px;
color: #b7236a;
font-weight: bold;
}
@media (max-width: 640px) {
h1 {
font-size: 20px;
}
h2 {
font-size: 18px;
}
h3 {
font-size: 16px;
}
}
p {
font-size: 16px;
font-weight: bold;
line-height: 1.6;
margin-bottom: 15px;
color: var(--text-color-light);
}
a {
color: var(--vp-button-brand-active-bg);
text-decoration: none;
}
a:visited {
color: var(--vp-button-brand-active-bg);
}
a:hover {
color: var(--vp-button-brand-hover-bg);
}
a:active {
color: var(--vp-button-brand-hover-bg);
}
.container {
margin: 0px auto;
display: flex;
flex-direction: column;
margin: 0 auto;
max-width: 1152px;
}
.grid {
.output-card {
background-color: var(--vp-c-bg-alt);
border-radius: 10px;
padding: 30px;
margin-top: 40px;
margin-bottom: 40px;
@media (min-width: 640px) {
padding: 30px 50px;
}
}
.option-list {
display: grid;
grid-gap: 20px;
margin-top: 30px;
margin-bottom: 30px;
grid-gap: 23px;
margin-bottom: 50px;
@media (min-width: 640px) {
grid-template-columns: 1fr 1fr;
@@ -208,17 +254,87 @@ export default {
grid-template-columns: 1fr 1fr 1fr;
}
}
.form-group {
.option-item {
font-size: 0.9em;
border-radius: 10px;
padding: 15px 20px;
border: 2px solid transparent;
padding: 10px 20px;
background-color: var(--vp-c-bg-alt);
transition: border-color 0.2s;
&:hover {
border-color: var(--vp-button-brand-hover-bg);
}
&.is-active {
border-color: var(--vp-button-brand-active-bg);
}
}
.option-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.option-icon {
padding: 5px;
margin-right: -5px;
& i {
opacity: 0.7;
}
&:hover i {
opacity: 1;
}
}
.option-description {
font-size: 13px;
line-height: 1.5;
margin-bottom: 10px;
padding-bottom: 8px;
}
.option-description pre {
background-color: var(--vp-c-bg, #f5f5f5);
border: 1px solid var(--vp-c-border, #e0e0e0);
border-radius: 8px;
padding: 12px 16px;
overflow-x: auto;
margin: 12px 0;
font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", monospace;
font-size: 13px;
line-height: 1.5;
}
.option-description code {
font-family: "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", monospace;
font-size: 13px;
background-color: var(--vp-c-bg, #f0f0f0);
padding: 2px 6px;
border-radius: 4px;
}
.option-description pre code {
background-color: transparent;
padding: 0;
font-size: 13px;
}
@media (prefers-color-scheme: dark) {
.option-description pre {
background-color: #2d2d2d;
border-color: #444;
}
.option-description code {
background-color: #2d2d2d;
}
}
.option-content {
margin-top: 5px;
margin-bottom: 5px;
}
.form-label {
display: inline-block;
margin-left: 2px;
font-size: 16px;
line-height: 1.5;
padding-bottom: 5px;
text-transform: capitalize;
}
.form-control {
font-size: 0.9em;
@@ -242,7 +358,7 @@ export default {
border: 1px solid var(--vp-c-border);
border-radius: 4px;
background-color: var(--vp-c-bg);
padding: 5px 10px;
padding: 6px;
width: 100%;
&:hover {
@@ -254,100 +370,36 @@ export default {
}
}
.form-check {
flex-grow: 1;
position: relative;
padding-left: 20px;
margin-left: 3px;
min-height: 24px;
padding-left: 25px;
& label {
font-size: 16px;
font-weight: 600;
display: block;
line-height: 1.6;
&:hover {
cursor: pointer;
}
}
}
.form-check-input {
cursor: pointer;
position: absolute;
width: 15px;
height: 15px;
margin-top: 5px;
margin-left: -20px;
}
.form-submit {
border: 1px solid transparent;
display: inline-block;
font-weight: 600;
transition: color 0.25s, border-color 0.25s, background-color 0.25s;
border-radius: 20px;
font-size: 16px;
padding: 10px 20px;
background-color: var(--vp-button-brand-bg);
border-color: var(--vp-button-brand-border);
color: var(--vp-button-brand-text);
&:hover {
background-color: var(--vp-button-brand-hover-bg);
border-color: var(--vp-button-brand-hover-border);
color: var(--vp-button-brand-hover-text);
}
&:active {
background-color: var(--vp-button-brand-active-bg);
border-color: var(--vp-button-brand-active-border);
color: var(--vp-button-brand-active-text);
}
}
.button-positioned {
position: absolute;
right: 1px;
top: 1px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
color: var(--vp-c-brand);
font-weight: 600;
padding: 6px 10px;
background-color: var(--vp-c-bg);
}
.modal {
position: fixed;
border-radius: 10px;
border: 1px solid var(--vp-c-border);
box-shadow: 0 8px 40px 0 rgb(0 0 0 / 35%);
padding: 0;
&::backdrop {
background-color: rgb(0 0 0 / 50%);
}
}
.modal-close {
position: absolute;
top: 10px;
right: 15px;
font-weight: 600;
color: var(--vp-c-brand);
}
.modal-content {
padding: 30px;
}
.modal-heading {
font-weight: 600;
font-size: 1.3em;
text-align: center;
margin-bottom: 15px;
}
code {
background-color: var(--vp-c-bg-alt);
border-radius: 3px;
padding: 2px 5px;
margin-left: -25px;
}
.u-mb10 {
margin-bottom: 10px !important;
}
.u-min-height100 {
min-height: 100px;
}
.u-text-center {
text-align: center !important;
}
.u-monospace {
font-family: monospace !important;
}
.u-pos-relative {
position: relative !important;
.is-clickable {
cursor: pointer;
}
</style>

View File

@@ -1,29 +0,0 @@
<template>
<form class="InstallForm" id="form">
<div class="InstallOptionsSection">
<slot name="list" />
</div>
<cite
>Based on: <a href="https://github.com/gabizz/hestiacp-scriptline-generator">@gabizz</a> and
<a href="https://github.com/turbopixel/HestiaCP-Command-Creator">@turbopixel</a></cite
>
</form>
</template>
<style scoped>
.InstallForm {
margin: 0.55em 0;
padding: 0 1em;
line-height: 1.5;
}
cite {
font-size: small;
margin: 0.55em 0;
display: block;
text-align: center;
& a {
color: var(--vp-c-txt-1) !important;
}
}
</style>

View File

@@ -6,23 +6,6 @@
<style scoped>
.InstallPage {
line-height: 1.5;
}
.InstallPage :deep(.container) {
display: flex;
flex-direction: column;
margin: 0 auto;
max-width: 1152px;
}
.InstallPage :deep(a) {
font-weight: 500;
color: var(--vp-c-brand);
text-decoration-style: dotted;
transition: color 0.25s;
}
.InstallPage :deep(a:hover) {
color: var(--vp-c-brand-dark);
line-height: 1;
}
</style>

View File

@@ -1,42 +0,0 @@
<template>
<header class="InstallPageTitle">
<div class="container">
<h1>
<slot name="title"></slot>
</h1>
<p v-if="$slots.lead" class="lead">
<slot name="lead" />
</p>
</div>
</header>
</template>
<style scoped>
.InstallPageTitle {
padding: 0 24px;
background-color: var(--vp-c-bg-alt);
}
.InstallPageTitle h1 {
margin: 0.75em 0;
font-size: 2rem;
font-weight: 700;
line-height: inherit;
}
@media (min-width: 640px) {
.InstallPageTitle {
padding: 0 48px;
}
.InstallPageTitle h1 {
font-size: 2.5rem;
}
}
@media (min-width: 960px) {
.InstallPageTitle {
padding: 0 64px;
}
}
</style>

View File

@@ -0,0 +1,82 @@
<template>
<header class="PageHeader">
<div class="container">
<h1>
<slot name="title"></slot>
</h1>
<h2 class="subtitle">
<slot name="subtitle"></slot>
</h2>
<div v-if="$slots.aside" class="aside-container">
<slot name="aside"></slot>
</div>
</div>
</header>
</template>
<style scoped>
:root {
--text-color-light: #282828;
--text-color-dark: var(--el-color-primary-light-9);
}
.container {
display: flex;
margin: 0 auto;
text-align: center;
align-items: center;
justify-content: center;
max-width: 1260px;
color: var(--text-color-light);
}
.aside-container {
display: flex;
margin-left: auto;
margin-bottom: 15px;
}
.subtitle {
margin: -0.5em 0 1.2em 0;
font-size: 1.2rem;
font-weight: 700;
line-height: 1.6;
color: inherit;
text-align: center;
max-width: 800px;
}
.subtitle :deep(a) {
color: var(--vp-c-brand);
text-decoration: none;
transition: color 0.3s;
}
.subtitle :deep(a):hover {
color: #d8036a;
}
.PageHeader {
padding: 0 24px;
background-color: var(--vp-c-bg-alt);
h1 {
margin: 0.75em 0;
font-size: 2rem;
font-weight: 700;
line-height: inherit;
@media (max-width: 640px) {
font-size: 20px;
}
}
@media (min-width: 640px) {
padding: 0 48px;
}
@media (min-width: 960px) {
padding: 0 64px;
}
}
</style>

View File

@@ -6,11 +6,12 @@ import './styles/base.css';
import './styles/vars.css';
import FeaturePage from './components/FeaturePage.vue';
import InstallPage from './components/InstallPage.vue';
import PageHeader from './components/PageHeader.vue';
export default {
...Theme,
enhanceApp({ app }) {
app.component('FeaturePage', FeaturePage);
app.component('InstallPage', InstallPage);
app.component('PageHeader', PageHeader);
},
};

View File

@@ -2,10 +2,14 @@
--vp-c-brand-lighter: #ff558f;
--vp-c-brand-light: #da4778;
--vp-c-brand: #b7236a;
--vp-c-brand-dark: #9a1d5a;
--vp-c-brand-darker: #781746;
--vp-c-brand-dark: #e2237f;
--vp-c-brand-darker: #c00b62;
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: linear-gradient(120deg, #d83182, #633288, #41d1ff);
--vp-button-brand-bg: #b7236a;
--vp-button-brand-hover-bg: #d8036a;
--vp-button-brand-active-bg: #e7197d;
--vp-c-brand-1: #b7236a;
}
.dark {
@@ -15,4 +19,8 @@
--vp-c-brand: #ff558f;
--vp-c-brand-dark: #da4778;
--vp-c-brand-darker: #b7236a;
--vp-button-brand-bg: #da4778;
--vp-button-brand-hover-bg: #b7236a;
--vp-c-brand-1: #da4778;
--vp-code-block-bg: #282c34;
}

View File

@@ -1,43 +0,0 @@
export const languages = [
{ text: 'Arabic', value: 'ar' },
{ text: 'Armenian', value: 'hy' },
{ text: 'Azerbaijani', value: 'az' },
{ text: 'Bengali', value: 'bn' },
{ text: 'Bosnian', value: 'bs' },
{ text: 'Bulgarian', value: 'bg' },
{ text: 'Catalan', value: 'ca' },
{ text: 'Croatian', value: 'hr' },
{ text: 'Czech', value: 'cs' },
{ text: 'Danish', value: 'da' },
{ text: 'Dutch', value: 'nl' },
{ text: 'English', value: 'en' },
{ text: 'Finnish', value: 'fi' },
{ text: 'French', value: 'fr' },
{ text: 'Georgian', value: 'ka' },
{ text: 'German', value: 'de' },
{ text: 'Greek', value: 'el' },
{ text: 'Hungarian', value: 'hu' },
{ text: 'Indonesian', value: 'id' },
{ text: 'Italian', value: 'it' },
{ text: 'Japanese', value: 'ja' },
{ text: 'Korean', value: 'ko' },
{ text: 'Kurdish Sorani', value: 'ku' },
{ text: 'Norwegain', value: 'no' },
{ text: 'Persian', value: 'fa' },
{ text: 'Polish', value: 'pl' },
{ text: 'Portuguese', value: 'pt' },
{ text: 'Portuguese (Brasil)', value: 'pt-br' },
{ text: 'Romanian', value: 'ro' },
{ text: 'Russian', value: 'ru' },
{ text: 'Serbian', value: 'sr' },
{ text: 'Simplified Chinese (China)', value: 'zh-cn' },
{ text: 'Slovak', value: 'sk' },
{ text: 'Spanish', value: 'es' },
{ text: 'Swedish', value: 'sv' },
{ text: 'Thai', value: 'th' },
{ text: 'Traditional Chinese (Taiwan)', value: 'zh-tw' },
{ text: 'Turkish', value: 'tr' },
{ text: 'Ukrainian', value: 'uk' },
{ text: 'Urdu', value: 'ur' },
{ text: 'Vietnamese', value: 'vi' },
];

View File

@@ -1,207 +1,253 @@
export const options = [
{
name: ' --port',
id: 'port',
param: '--port',
desc: 'Изменить порт Hestia',
selected: true,
text: '8083',
textField: true,
flag: 'port',
label: 'Порт управления',
description: 'Установите порт HTTPS панели Hestia. По умолчанию: 8083. Обязательный параметр!',
type: 'text',
required: 'true',
default: '8083',
},
{
name: ' --lang',
id: 'language',
param: '--lang',
desc: 'ISO 639-1 codes',
selected: true,
flag: 'lang',
label: 'Язык интерфейса панели',
description:
'Выберите язык веб-интерфейса. Если не выбирать, система будет использовать английский язык по умолчанию.',
type: 'select',
default: 'en',
selectField: true,
text: 'en',
options: [
{ label: 'Shqip (Albanian)', value: 'sq' },
{ label: 'العربية (Arabic)', value: 'ar' },
{ label: 'Հայերեն (Armenian)', value: 'hy' },
{ label: 'Azərbaycan (Azerbaijani)', value: 'az' },
{ label: 'বাংলা (Bengali)', value: 'bn' },
{ label: 'Bosanski (Bosnian)', value: 'bs' },
{ label: 'Български (Bulgarian)', value: 'bg' },
{ label: 'Català (Catalan)', value: 'ca' },
{ label: 'Hrvatski (Croatian)', value: 'hr' },
{ label: 'Čeština (Czech)', value: 'cs' },
{ label: 'Dansk (Danish)', value: 'da' },
{ label: 'Nederlands (Dutch)', value: 'nl' },
{ label: 'English', value: 'en' },
{ label: 'Suomi (Finnish)', value: 'fi' },
{ label: 'Français (French)', value: 'fr' },
{ label: 'ქართული (Georgian)', value: 'ka' },
{ label: 'Deutsch (German)', value: 'de' },
{ label: 'Ελληνικά (Greek)', value: 'el' },
{ label: 'Magyar (Hungarian)', value: 'hu' },
{ label: 'Bahasa Indonesia (Indonesian)', value: 'id' },
{ label: 'Italiano (Italian)', value: 'it' },
{ label: '日本語 (Japanese)', value: 'ja' },
{ label: '한국어 (Korean)', value: 'ko' },
{ label: 'Kurdî (Sorani Kurdish)', value: 'ku' },
{ label: 'Norsk (Norwegian)', value: 'no' },
{ label: 'فارسی (Persian)', value: 'fa' },
{ label: 'Polski (Polish)', value: 'pl' },
{ label: 'Português (Portuguese)', value: 'pt' },
{ label: 'Português do Brasil (Brazilian Portuguese)', value: 'pt-br' },
{ label: 'Română (Romanian)', value: 'ro' },
{ label: 'Русский (Russian)', value: 'ru' },
{ label: 'Српски (Serbian)', value: 'sr' },
{ label: '简体中文 (Chinese Simplified)', value: 'zh-cn' },
{ label: 'Slovenčina (Slovak)', value: 'sk' },
{ label: 'Español (Spanish)', value: 'es' },
{ label: 'Svenska (Swedish)', value: 'sv' },
{ label: 'ไทย (Thai)', value: 'th' },
{ label: '繁體中文 (Chinese Traditional)', value: 'zh-tw' },
{ label: 'Türkçe (Turkish)', value: 'tr' },
{ label: 'Українська (Ukrainian)', value: 'uk' },
{ label: 'اردو (Urdu)', value: 'ur' },
{ label: 'Tiếng Việt (Vietnamese)', value: 'vi' },
],
},
{
name: ' --hostname',
id: 'hostname',
param: '--hostname',
desc: 'Установить имя хоста',
selected: false,
text: '',
textField: true,
flag: 'hostname',
label: 'Имя хоста сервера',
description:
'Укажите веб-имя хоста сервера. Следуйте формату: demo.example.com. Обязательный параметр!',
type: 'text',
default: '',
},
{
name: ' --email',
id: 'email',
param: '--email',
desc: 'Установить почту адмнистратора',
selected: false,
text: '',
textField: true,
flag: 'email',
label: 'Электронная почта',
description:
'Введите email администратора для уведомлений об异常 конфигурации сервера. Обязательный параметр!',
type: 'text',
default: '',
},
{
name: ' --password',
id: 'password',
param: '--password',
desc: 'Установить пароль администратора',
selected: false,
text: '',
textField: true,
flag: 'password',
label: 'Пароль',
description:
'Установите пароль для учетной записи администратора. Если не указать, будет сгенерирован случайный пароль.',
type: 'text',
default: '',
},
{
name: ' --apache',
id: 'apache',
param: '--apache',
desc: 'Веб сервер с поддержкой .htaccess',
selected: true,
},
{ name: ' --phpfpm', id: 'phpfpm', param: '--phpfpm', desc: 'Установить PHP-FPM.', selected: true },
{
name: ' --multiphp',
id: 'multiphp',
param: '--multiphp',
desc: 'Разрешить использовать несколько PHP версий.',
selected: true,
flag: 'nopublicip',
label: 'Принудительно использовать локальный IP',
description:
'Использовать внутренний/локальный IP-адрес сервера в качестве адреса привязки, не пытаться получить публичный IP. Подходит для внутренних сетей, NAT-сетей, локальной разработки и тестирования, где не требуется публичный доступ.',
default: 'no',
},
{
name: ' --vsftpd',
id: 'vsftpd',
param: '--vsftpd',
desc: 'Легковесный, минималистичный и безопасный FTP сервер.',
selected: true,
conflicts: 'proftpd',
flag: 'apache',
label: 'Apache2',
description:
'Apache2 — мощный, высококонфигурируемый и широко поддерживаемый веб-сервер с открытым исходным кодом. Используется для хостинга веб-сайтов, поддержки веб-приложений, балансировки нагрузки и кэширования.',
default: 'yes',
},
{
name: ' --proftpd',
id: 'proftpd',
param: '--proftpd',
desc: 'Продвинутый, модульный FTP сервер с поддержкой LDAP.',
selected: false,
conflicts: 'vsftpd',
flag: 'phpfpm',
label: 'PHP-FPM',
description: 'PHP-FPM — это менеджер процессов FastCGI для выполнения PHP-скриптов.',
default: 'yes',
},
{
name: ' --named',
id: 'named',
param: '--named',
desc: 'Собственный DNS сервер.',
selected: true,
flag: 'multiphp',
label: 'MultiPHP',
description:
'При включении по умолчанию устанавливается PHP 8.2, а также появляется возможность установки нескольких версий PHP 7.4-8.5 в панели. При отключении устанавливается только стандартная версия PHP.',
default: 'yes',
},
{
name: ' --mysql',
id: 'mariadb',
param: '--mysql',
desc: 'Ответление MySQL с дополнительными усовершенствованиями.',
selected: true,
conflicts: 'mysql8',
flag: 'vsftpd',
label: 'VSFTPD',
description:
'VSFTPD — это безопасный, быстрый и стабильный FTP-сервер. Особенно подходит для Linux-систем. Обеспечивает безопасную и быструю передачу файлов между сервером и пользователями.',
default: 'yes',
},
{
name: ' --mysql-classic',
id: 'mysql8',
param: '--mysql-classic',
desc: 'База данных с открытым исходным кодом',
selected: false,
conflicts: 'mariadb',
flag: 'proftpd',
label: 'ProFTPD',
description:
'ProFTPD — это продвинутый модульный FTP-сервер. Поддерживает аутентификацию и авторизацию пользователей через LDAP.',
default: 'no',
},
{
name: ' --postgresql',
id: 'postgresql',
param: '--postgresql',
desc: 'База данных с открытым исходным кодом',
selected: false,
flag: 'named',
label: 'BIND',
description:
'BIND (Berkeley Internet Name Domain) — популярное DNS-программное обеспечение. Обязательный параметр для серверных кластеров, требующих настройки собственного DNS.',
default: 'yes',
},
{
name: ' --exim',
id: 'exim',
param: '--exim',
desc: 'Позволить отправлять почту по SMTP.',
selected: true,
flag: 'mysql',
label: 'MariaDB',
description:
'MariaDB — это ветка MySQL, предоставляющая функции, совместимые с MySQL, а также некоторые дополнительные возможности и улучшения.',
default: 'yes',
},
{
name: ' --dovecot',
id: 'dovecot',
param: '--dovecot',
desc: 'Принимать почту и отправлять по IMAP/POP3.',
selected: true,
depends: 'exim',
flag: 'mysql-classic',
label: 'MySQL 8',
description:
'MySQL 8 предлагает простоту настройки, управления и масштабирования. Обеспечивает повышенную безопасность, высокую доступность в пределах одного региона или с резервированием и гарантирует 99.99% уровень обслуживания (SLA).',
default: 'no',
},
{
name: ' --sieve',
id: 'sieve',
param: '--sieve',
desc: 'Управлять собственными фильтрами почты.',
selected: false,
depends: 'dovecot',
flag: 'postgresql',
label: 'PostgreSQL',
description:
'PostgreSQL — мощная объектно-реляционная система управления базами данных с открытым исходным кодом. Широко используется в финансовых услугах, обрабатывающей промышленности, розничной торговле, логистике и многих других областях.',
default: 'no',
},
{
name: ' --clamav',
id: 'clamav',
param: '--clamav',
desc: 'Сканировать почту на вирусы.',
selected: true,
depends: 'exim',
},
{
name: ' --usemirrorclamav',
id: 'usemirrorclamav',
param: '--usemirrorclamav',
desc: 'Использовать русское зеркало баз данных ClamaV',
selected: false,
depends: 'clamav',
flag: 'exim',
label: 'Exim',
description:
'Exim — это агент передачи сообщений (MTA), используемый для маршрутизации, доставки и приема сообщений электронной почты. Позволяет отправлять электронные письма через SMTP из сети или от локальных программ.',
default: 'yes',
},
{
name: ' --spamassassin',
id: 'spamassassin',
param: '--spamassassin',
desc: 'Фильтровать почту на спам.',
selected: true,
depends: 'exim',
flag: 'dovecot',
label: 'Dovecot',
description:
'Dovecot — это серверное программное обеспечение с открытым исходным кодом для IMAP и POP3. Обеспечивает почтовые услуги для Linux-систем. Известен своей безопасностью, простотой использования, скоростью и низким потреблением ресурсов.',
default: 'yes',
},
{
name: ' --firewall',
id: 'firewall',
param: '--firewall',
desc: 'Управлять фаерволом.',
selected: true,
flag: 'sieve',
label: 'Правила Sieve',
description:
'Включает поддержку правил фильтрации почты (Sieve), позволяя пользователям настраивать автоматическую сортировку, обработку спама, автоматические ответы и другие правила. Требует Dovecot и Exim.',
default: 'no',
},
{
name: ' --nopublicip',
id: 'nopublicip',
param: '--nopublicip',
desc: 'Использовать локальный IP сервера',
selected: false,
flag: 'clamav',
label: 'ClamAV',
description:
'ClamAV — это кроссплатформенное программное обеспечение с открытым исходным кодом для обеспечения безопасности электронной почты. Используется для обнаружения вирусов в электронных письмах и других файлах.',
default: 'yes',
},
{
name: ' --uselocalphp',
id: 'uselocalphp',
param: '--uselocalphp',
desc: 'Использовать PHP из текущего репозитория HestiaCP',
selected: false,
flag: 'usemirrorclamav',
label: 'Российское зеркало ClamAV',
description:
'Использовать российское зеркало для обновления вирусных баз ClamAV. Подходит для серверов, расположенных в России или соседних регионах, где загрузка с официального источника медленная или нестабильная. Базы будут загружаться с repo.brepo.ru, возможна задержка в несколько часов.',
default: 'no',
},
{
name: ' --usemirrorclamav',
id: 'usemirrorclamav',
param: '--usemirrorclamav',
desc: 'Использовать clamav с базами скачанными с зеркала в России',
selected: false,
flag: 'spamassassin',
label: 'SpamAssassin',
description:
'SpamAssassin — это инструмент с открытым исходным кодом для идентификации и фильтрации спама. Он анализирует заголовки, тело и информацию об отправителе письма, применяя ряд правил для оценки того, является ли письмо спамом.',
default: 'yes',
},
{
name: ' --fail2ban',
id: 'fail2ban',
param: '--fail2ban',
desc: 'Предотвращение Bruteforce атак на SSH, Email, FTP, БД.',
selected: true,
flag: 'firewall',
label: 'Системный брандмауэр',
description:
'Использовать firewalld / nftables в качестве системного брандмауэра.<br>\n<br>⚠️ Внимание: Если после установки вы не можете получить доступ к панели через публичный IP (например, доступ только через localhost), это обычно означает, что порт 8083 не открыт в брандмауэре.\n\nРешение:\n\n<pre><code>firewall-cmd --permanent --add-port=8083/tcp\nfirewall-cmd --reload</code></pre>\n\nПри использовании nftables:\n\n<pre><code>nft add rule inet filter input tcp dport 8083 accept</code></pre>\n\nРекомендуется оставить брандмауэр включенным для повышения безопасности, возможна совместная работа с Fail2Ban для защиты от брутфорса.',
default: 'yes',
},
{
name: ' --quota',
id: 'quota',
param: '--quota',
desc: 'Использовать квоты на пользовательские аккаунты.',
selected: false,
flag: 'bunkerweb',
label: 'Межсетевой экран WAF Bunkerweb',
description:
'Bunkerweb — это межсетевой экран веб-приложений (WAF) с открытым исходным кодом, обеспечивающий защиту на основе основных правил OWASP, черные/белые списки IP, ограничение скорости, HTTP-заголовки безопасности и другие функции безопасности.',
default: 'no',
},
{ name: ' --api', id: 'api', param: '--api', desc: 'Activate API.', selected: true },
{
name: ' --interactive',
id: 'interactive',
param: '--interactive',
desc: 'Интерактивная установка.',
selected: true,
flag: 'uselocalphp',
label: 'Использовать официальную сборку PHP от Hestia',
description:
'Использовать версию PHP из официального репозитория HestiaCP вместо стандартного источника операционной системы. При включении пакеты PHP будут загружаться из репозитория brepo, что обеспечивает единообразие версий и совместимость.',
default: 'no',
},
{
flag: 'fail2ban',
label: 'Fail2Ban',
description:
'Fail2Ban может автоматически обнаруживать и блокировать пользователей, использующих недействительные данные аутентификации, например, при попытках взлома SSH, FTP и т.д.',
default: 'yes',
},
{
flag: 'quota',
label: 'Дисковые квоты',
description:
'Установить квоты на дисковое пространство для системных пользователей, ограничивая использование дискового пространства.',
default: 'no',
},
{
flag: 'api',
label: 'Hestia API',
description:
'Включить внутренний API Hestia, позволяющий другим системам или сервисам взаимодействовать с панелью.',
default: 'yes',
},
{
flag: 'interactive',
label: 'Интерактивная установка',
description:
'Включить интерактивный режим во время установки, чтобы пользователь мог отвечать на запросы и выбирать опции.',
default: 'yes',
},
{
flag: 'force',
label: 'Принудительная установка',
description:
'Принудительно перезаписать любые существующие конфигурации и файлы во время установки. В дистрибутивах семейства RHEL рекомендуется включить этот параметр. Перезаписывает конфигурацию администратора по умолчанию.',
default: 'no',
},
{ name: ' --force', id: 'force', param: '--force', desc: 'Принудительная установка.', selected: false },
];

View File

@@ -3,46 +3,33 @@ export const projectManagers = [
{
avatar: 'https://www.github.com/ScIT-Raphael.png',
name: 'Raphael Schneeberger 🇨🇭',
title: 'Project Founder',
title: 'Основатель проекта',
links: [{ icon: 'github', link: 'https://github.com/ScIT-Raphael' }],
},
{
avatar: 'https://www.github.com/jaapmarcus.png',
name: 'Jaap Marcus 🇳🇱',
links: [
{ icon: 'github', link: 'https://github.com/jaapmarcus' },
{ icon: 'twitter', link: 'https://twitter.com/jaapmarcus' },
],
links: [{ icon: 'github', link: 'https://github.com/jaapmarcus' }],
},
{
avatar: 'https://www.github.com/Lupul.png',
name: 'Robert Zollner 🇷🇴',
links: [{ icon: 'github', link: 'https://github.com/Lupul' }],
},
{
avatar: 'https://www.github.com/krismkenn.png',
name: 'Kristan Kenney 🇨🇦',
links: [{ icon: 'github', link: 'https://github.com/krismkenn' }],
},
];
const globeIcon = {
svg: '🌐',
};
/** @type {import("vitepress").DefaultTheme.TeamMember[]} */
export const teamMembers = [
{
avatar: 'https://www.github.com/jakobbouchard.png',
name: 'Jakob Bouchard 🇨🇦',
title: 'Developer',
org: 'Prosomo',
orgLink: 'https://prosomo.com',
avatar: 'https://www.github.com/imjuniper.png',
name: 'Juniper Bouchard 🇨🇦',
links: [
{ icon: 'github', link: 'https://github.com/jakobbouchard' },
{ icon: 'linkedin', link: 'https://linkedin.com/in/jakobbouchard' },
{
icon: {
svg: '<svg role="img" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><title>Website</title><path stroke-linecap="round" stroke-linejoin="round" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" /></svg>',
},
link: 'https://jakobbouchard.dev',
},
{ icon: 'github', link: 'https://github.com/imjuniper' },
{ icon: globeIcon, link: 'https://imjuniper.fyi' },
],
},
{
@@ -56,11 +43,6 @@ export const teamMembers = [
name: 'divinity76 🇳🇴',
links: [{ icon: 'github', link: 'https://github.com/divinity76' }],
},
{
avatar: 'https://www.github.com/istiak101.png',
name: 'istiak101 🇧🇩',
links: [{ icon: 'github', link: 'https://github.com/istiak101' }],
},
{
avatar: 'https://www.github.com/Pleskan.png',
name: 'Anton Pleskanovskyy 🇺🇦',
@@ -69,6 +51,33 @@ export const teamMembers = [
{
avatar: 'https://www.github.com/AlecRust.png',
name: 'Alec Rust 🇬🇧',
links: [{ icon: 'github', link: 'https://github.com/AlecRust' }],
links: [
{ icon: 'github', link: 'https://github.com/AlecRust' },
{ icon: globeIcon, link: 'https://www.alecrust.com/' },
],
},
{
avatar: 'https://github.com/ioannidesalex.png',
name: 'Alexandros Ioannides 🇨🇾',
title: 'Технический директор (CTO)',
org: 'FocusNet',
orgLink: 'https://focus-net.net',
links: [
{ icon: 'github', link: 'https://github.com/ioannidesalex' },
{ icon: 'linkedin', link: 'https://www.linkedin.com/in/ioannidesa' },
],
},
];
/** @type {import("vitepress").DefaultTheme.TeamMember[]} */
export const teamRpm = [
{
avatar: 'https://www.github.com/bayrepo.png',
name: 'Alexey Berezhok 🇷🇺',
title: 'Сопровождающий RPM-версии',
desc: 'Отвечает за адаптацию и поддержку экосистем RHEL / Rocky / AlmaLinux.',
links: [
{ icon: 'github', link: 'https://github.com/bayrepo' },
{ icon: globeIcon, link: 'https://hestiadocs.brepo.ru' },
],
},
];

View File

@@ -13,12 +13,12 @@ Hestia необходимо установить поверх новой уст
Если на VPS/KVM уже есть учетная запись администратора, либо удалите этот идентификатор администратора по умолчанию, либо используйте `--force`, чтобы продолжить установку. Дополнительные сведения см. в разделе «Выборочная установка» ниже.
:::
| | Минимум | Рекомендуется |
| -------------------- | --------------------------------------------- | ------------------------------------ |
| **ЦП** | 1 ядро, 64-разрядный | 4 ядра |
| **Память** | 1 ГБ (без SpamAssassin и ClamAV) | 4 ГБ |
| **Диск** | 10 ГБ HDD | 40 ГБ SSD |
| **Операционная система** | Debian 10, 11 или 12<br>Ubuntu 20.04, 22.04 LTS | Последняя версия Debian <br> Последняя версия Ubuntu LTS |
| Компонент | Минимум | Рекомендуется |
| :--------------------------------------- | :------------------------------------------------------- | :----------------------------------------------------- |
| **ЦП** | 1 ядро, 64-разрядный | 4 ядра |
| **Память** | 1 ГБ (без SpamAssassin и ClamAV) | 4 ГБ |
| **Диск** | 10 ГБ HDD | 40 ГБ SSD |
| **Операционная система (RPM)** | AlmaLinux 9<br>Rocky Linux 9 | Rocky Linux 9<br>AlmaLinux 9 |
::: warning
Hestia работает только на процессорах AMD64 / x86_64 и ARM64 / aarch64. Также требуется 64-разрядная операционная система!
@@ -28,7 +28,6 @@ Hestia работает только на процессорах AMD64 / x86_64
### Поддерживаемые операционные системы
- MSVSphere 9
- AlmaLinux 9
- Rocky Linux 9
@@ -79,37 +78,36 @@ bash hst-install.sh -h
Чтобы выбрать, какое программное обеспечение будет установлено, вы можете указать флаги в скрипте установки. Полный список параметров можно просмотреть ниже.
```bash
-a, --apache Install Apache [yes|no] default: yes
-w, --phpfpm Install PHP-FPM [yes|no] default: yes
-o, --multiphp Install Multi-PHP [yes|no] default: no
-v, --vsftpd Install Vsftpd [yes|no] default: yes
-j, --proftpd Install ProFTPD [yes|no] default: no
-k, --named Install Bind [yes|no] default: yes
-m, --mysql Install MariaDB [yes|no] default: yes
-M, --mysql-classic Install MySQL 8 [yes|no] default: no
-g, --postgresql Install PostgreSQL [yes|no] default: no
-x, --exim Install Exim [yes|no] default: yes
-z, --dovecot Install Dovecot [yes|no] default: yes
-Z, --sieve Install Sieve [yes|no] default: no
-c, --clamav Install ClamAV [yes|no] default: no
-t, --spamassassin Install SpamAssassin [yes|no] default: yes
-i, --firewall Install firewalld [yes|no] default: yes
-b, --fail2ban Install Fail2ban [yes|no] default: yes
-q, --quota Filesystem Quota [yes|no] default: no
-d, --api Activate API [yes|no] default: yes
-r, --port Change Backend Port default: 8083
-l, --lang Default language default: en
-y, --interactive Interactive install [yes|no] default: yes
-I, --nopublicip Use local ip [yes|no] default: no
-u, --uselocalphp Use PHP from local repo [yes|no] default: no
-C, --usemirrorclamav Use mirrored clamav [yes|no] default: no
-s, --hostname Set hostname
-e, --email Set admin email
-p, --password Set admin password
-R, --with-rpms Path to Hestia rpms
-f, --force Force installation
-h, --help Print this help
-a, --apache Install Apache [yes | no] default: yes
-w, --phpfpm Install PHP-FPM [yes | no] default: yes
-o, --multiphp Install Multi-PHP [yes | no] default: no
-v, --vsftpd Install Vsftpd [yes | no] default: yes
-j, --proftpd Install ProFTPD [yes | no] default: no
-k, --named Install Bind [yes | no] default: yes
-m, --mysql Install MariaDB [yes | no] default: yes
-M, --mysql-classic Install MySQL 8 [yes | no] default: no
-g, --postgresql Install PostgreSQL [yes | no] default: no
-x, --exim Install Exim [yes | no] default: yes
-z, --dovecot Install Dovecot [yes | no] default: yes
-Z, --sieve Install Sieve [yes | no] default: no
-c, --clamav Install ClamAV [yes | no] default: no
-t, --spamassassin Install SpamAssassin [yes | no] default: yes
-i, --firewall Install firewalld [yes | no] default: yes
-b, --fail2ban Install Fail2ban [yes | no] default: yes
-q, --quota Filesystem Quota [yes | no] default: no
-d, --api Activate API [yes | no] default: yes
-r, --port Change Backend Port default: 8083
-l, --lang Default language default: en
-y, --interactive Interactive install [yes | no] default: yes
-I, --nopublicip Use local ip [yes | no] default: no
-u, --uselocalphp Use PHP from local repo [yes | no] default: no
-C, --usemirrorclamav Use mirrored clamav [yes | no] default: no
-s, --hostname Set hostname
-e, --email Set admin email
-p, --password Set admin password
-R, --with-rpms Path to Hestia rpms
-f, --force Force installation
-h, --help Print this help
```
#### Пример
@@ -149,4 +147,4 @@ bash hst-install.sh \
- `-I, --nopublicip` - если установлена данная опция, то установщик панели не получает внешний IP адрес сервера, где контрольная панель устанавливается (на случай если ваш сервер за NAT). Данную опцию можно включать, если у вас на сервере публичный IP или необходима внутрисетевая установка без внешнего доступа.
- `-u, --uselocalphp` - включить установку пакетов PHP из того-же репозитория, откуда ставится HestiaCP RPM Edition. Если не включать данную опцию, то PHP пакеты будут установлены из репозитория Remi. Если включить, то будет произведена так называемая установка локальных пакетов. Есть отличия в способе упаковке Local PHP и Remi PHP. Если сервера требуется расширенный набор PHP из Remi репозитория, то данную опцию лучше отключить, т.е задать `--uselocalphp no`. Local PHP более простая сборка с меньшим числом поддерживаемых модулей PHP, но подходит для большинства конфигураций CMS и имеет [страницу настройки подключаемых модулей](/docs/extensions/local-php.md)
- `-u, --uselocalphp` - включить установку пакетов PHP из того-же репозитория, откуда ставится HestiaCP RPM Edition. Если не включать данную опцию, то PHP пакеты будут установлены из репозитория Remi. Если включить, то будет произведена так называемая установка локальных пакетов. Есть отличия в способе упаковке Local PHP и Remi PHP. Если сервера требуется расширенный набор PHP из Remi репозитория, то данную опцию лучше отключить, т.е задать `--uselocalphp no`. Local PHP более простая сборка с меньшим числом поддерживаемых модулей PHP, но подходит для большинства конфигураций CMS и имеет [страницу настройки подключаемых модулей](/docs/extensions/local-php.md)

View File

@@ -1,17 +0,0 @@
---
aside: false
lastUpdated: false
---
# Donate to the project
By donating to Hestia, you help maintain server costs, development time, and more!
Here are our official donation platforms:
- [PayPal](https://www.paypal.com/donate/?cmd=_s-xclick&hosted_button_id=ST87LQH2CHGLA)
- Crypto
- Bitcoin: bc1q48jt5wg5jaj8g9zy7c3j03cv57j2m2u5anlutu
- Ethereum: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51
- Binance: bnb1l4ywvw5ejfmsgjdcx8jn5lxj7zsun8ktfu7rh8
- Smart Chain: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51

View File

@@ -15,22 +15,27 @@ hero:
- theme: brand
text: Начало работы
link: /docs/introduction/getting-started
- theme: alt
- theme: brand
text: RPM версия
link: https://dev.brepo.ru/bayrepo/hestiacp
- theme: alt
text: Оригинальная панель для Debian/Ubuntu
- theme: brand
text: Оригинал для Debian/Ubuntu
link: https://github.com/hestiacp/hestiacp
features:
- icon: 🚀
title: Быстро и легко обучиться
details: Hestia создана с учетом простоты использования. Создать пользователя или веб-сайт так же просто, как нажать кнопку и заполнить пару полей, при этом расширенные функции легко доступны.
title: Минималистичный опыт эксплуатации и обслуживания
details: Hestia разработана с учётом простоты использования. Создание пользователя или сайта так же просто, как нажать на кнопку и заполнить несколько полей. Расширенные функции также настраиваются очень легко.
link: /docs/introduction/getting-started
linkText: Документация
- icon: ❤️
title: Сделано с душой и гордостью
details: Hestia — это开源 серверное программное обеспечение, созданное увлечёнными разработчиками со всего мира. Это означает, что код проверяется многими людьми, и каждый может внести свой вклад в его развитие!
link: /team
linkText: Команда
- icon: 🛠️
title: Мощная и расширяемая
details: Hestia расширяема и проста в освоении. Вы можете создавать свои собственные темы, веб-шаблоны, быстро устанавливать приложения и взаимодействовать с ней с помощью программного обеспечения сторонних производителей через ее API.
title: Расширяемая и мощная
details: Hestia расширяема и проста в освоении. Вы можете создавать свои собственные темы, веб-шаблоны, быстро устанавливать приложения и взаимодействовать с ней с помощью программного обеспечения сторонних производителей через её API.
link: /docs/contributing/development
linkText: Помощь в разработке Hestia
linkText: Помочь разработке Hestia
---

View File

@@ -1,23 +1,54 @@
---
layout: page
title: Install
title: Установка панели
---
<script setup>
import InstallPageTitle from "./.vitepress/theme/components/InstallPageTitle.vue";
import InstallOptions from "./.vitepress/theme/components/InstallOptions.vue";
import InstallOptionsSection from "./.vitepress/theme/components/InstallOptionsSection.vue";
import { options } from "./_data/options";
import { languages } from "./_data/languages";
import PageHeader from './.vitepress/theme/components/PageHeader.vue';
import InstallOptions from './.vitepress/theme/components/InstallOptions.vue';
import InstallPage from './.vitepress/theme/components/InstallPage.vue';
import { options } from './_data/options';
</script>
<InstallPage>
<InstallPageTitle>
<template #title>Генератор установочной команды</template>
</InstallPageTitle>
<InstallOptionsSection>
<template #list>
<InstallOptions :items="options" :languages="languages"></InstallOptions>
</template>
</InstallOptionsSection>
<PageHeader>
<template #title>Генератор конфигурации для быстрой установки панели управления сервером Hestia</template>
</PageHeader>
<PageHeader>
<template #aside><a class="header-button" href="./docs/introduction/getting-started#требования">Посмотреть требования к установке</a></template>
</PageHeader>
<InstallOptions :options="options"></InstallOptions>
</InstallPage>
<style>
.header-button {
display: inline-block;
border: 1px solid transparent;
font-weight: 600;
transition: color 0.25s, border-color 0.25s, background-color 0.25s;
border-radius: 20px;
padding: 0 20px;
line-height: 38px;
font-size: 14px;
border-color: var(--vp-button-alt-border);
color: var(--vp-button-alt-text);
background-color: var(--vp-button-alt-bg);
&:hover {
border-color: var(--vp-button-alt-hover-border);
color: var(--vp-button-alt-hover-text);
background-color: var(--vp-button-alt-hover-bg);
}
}
</style>
<style>
.header-button {
color: white;
background-color: var(--vp-c-brand);
}
.header-button:hover {
color: white;
background-color: #d8036a;
}
</style>

6
docs/public/paypal.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,37 +1,38 @@
---
layout: page
title: The Team
title: Команда
---
<style>
.VPTeamPageSection {
margin-top: 50px !important;
}
</style>
<script setup>
import { VPTeamPage, VPTeamPageTitle, VPTeamPageSection, VPTeamMembers } from "vitepress/theme";
import { projectManagers, teamMembers } from "./_data/team";
import { projectManagers, teamMembers, teamRpm } from "./_data/team";
</script>
<VPTeamPage>
<VPTeamPageTitle>
<template #title>The Team</template>
<template #title>Команда</template>
<template #lead>
The development of Hestia is guided by an international team, some of whom have chosen to be featured below.
Разработка Hestia осуществляется международной командой, некоторые из участников которой представлены ниже.
</template>
</VPTeamPageTitle>
<VPTeamPageSection>
<template #title>Project Managers</template>
<template #title>Руководители проекта</template>
<template #members>
<VPTeamMembers :members="projectManagers" />
</template>
</VPTeamPageSection>
<VPTeamPageSection>
<template #title>Team Members</template>
<template #title>Участники команды</template>
<template #members>
<VPTeamMembers :members="teamMembers" />
</template>
</VPTeamPageSection>
<!-- <VPTeamPageSection>
<template #title>Contributors ❤️</template>
<VPTeamPageSection>
<template #title>Сопровождающий RPM-версии</template>
<template #members>
<VPTeamMembers size="small" :members="featuredContributors" />
<VPTeamMembers :members="teamRpm" />
</template>
</VPTeamPageSection> -->
</VPTeamPage>
</VPTeamPageSection>

View File

@@ -1,4 +1,4 @@
[hectiacp]
[hestiacp]
name=RPM Alma Rocky 9 hestia repo on repo.brepo.ru
baseurl=https://repo.brepo.ru/hestia/
enabled=1

2946
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -44,7 +44,7 @@
"prettier-plugin-sql": "0.14.0",
"stylelint": "15.10.2",
"stylelint-config-standard": "34.0.0",
"vitepress": "1.0.0-beta.6",
"vitepress": "1.6.4",
"vue": "3.3.4"
},
"browserslist": [