Compare commits
2 Commits
bunkerweb
...
b31dce3817
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b31dce3817 | ||
|
|
09aa301dd1 |
@@ -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: [
|
||||
|
||||
125
docs/.vitepress/theme/components/CopyToClipboardInput.vue
Normal file
125
docs/.vitepress/theme/components/CopyToClipboardInput.vue
Normal 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>
|
||||
@@ -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="InstallOptions">
|
||||
<div class="container">
|
||||
<div class="grid">
|
||||
<div class="form-group" v-for="item in items">
|
||||
<div class="form-check u-mb10">
|
||||
<div class="output-card">
|
||||
<h1 class="u-text-center">Инструкция по установке для RHEL</h1>
|
||||
<p class="u-mb10">
|
||||
Войдите на свой сервер как root, напрямую или через SSH: ssh root@ваш.сервер, и загрузите
|
||||
установочный скрипт:
|
||||
</p>
|
||||
<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>
|
||||
<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
|
||||
@change="toggleOption"
|
||||
type="checkbox"
|
||||
class="form-check-input"
|
||||
v-model="item.selected"
|
||||
:value="item.value"
|
||||
:id="item.id"
|
||||
:conflicts="item.conflicts"
|
||||
:depends="item.depends"
|
||||
:id="option.flag"
|
||||
v-model="selectedOptions[option.flag].enabled"
|
||||
:conflicts="option.conflicts"
|
||||
:depends="option.depends"
|
||||
@change="toggleOption"
|
||||
/>
|
||||
<label :for="item.id">{{ item.id }}</label>
|
||||
<label :for="option.flag" @click.stop>{{ option.label }}</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">
|
||||
</div>
|
||||
<div class="option-description" v-html="option.description"></div>
|
||||
<div v-if="option.type === 'text'" class="option-content">
|
||||
<input
|
||||
@change="checkNeedEnabled"
|
||||
type="text"
|
||||
class="form-control"
|
||||
v-model="item.text"
|
||||
:target="item.id"
|
||||
:id="'input-' + item.id"
|
||||
:type="'+item.type+'"
|
||||
type="text"
|
||||
:id="`${option.flag}-input`"
|
||||
v-model="selectedOptions[option.flag].value"
|
||||
:placeholder="option.default"
|
||||
@input="checkNeedEnabled(option.flag, $event)"
|
||||
/>
|
||||
</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 }}
|
||||
<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>
|
||||
<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>
|
||||
<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:
|
||||
</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>
|
||||
</div>
|
||||
</dialog>
|
||||
</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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
82
docs/.vitepress/theme/components/PageHeader.vue
Normal file
82
docs/.vitepress/theme/components/PageHeader.vue
Normal 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>
|
||||
@@ -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);
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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' },
|
||||
];
|
||||
@@ -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',
|
||||
flag: 'exim',
|
||||
label: 'Exim',
|
||||
description:
|
||||
'Exim — это агент передачи сообщений (MTA), используемый для маршрутизации, доставки и приема сообщений электронной почты. Позволяет отправлять электронные письма через SMTP из сети или от локальных программ.',
|
||||
default: 'yes',
|
||||
},
|
||||
{
|
||||
name: ' --usemirrorclamav',
|
||||
id: 'usemirrorclamav',
|
||||
param: '--usemirrorclamav',
|
||||
desc: 'Использовать русское зеркало баз данных ClamaV',
|
||||
selected: false,
|
||||
depends: 'clamav',
|
||||
flag: 'dovecot',
|
||||
label: 'Dovecot',
|
||||
description:
|
||||
'Dovecot — это серверное программное обеспечение с открытым исходным кодом для IMAP и POP3. Обеспечивает почтовые услуги для Linux-систем. Известен своей безопасностью, простотой использования, скоростью и низким потреблением ресурсов.',
|
||||
default: 'yes',
|
||||
},
|
||||
{
|
||||
name: ' --spamassassin',
|
||||
id: 'spamassassin',
|
||||
param: '--spamassassin',
|
||||
desc: 'Фильтровать почту на спам.',
|
||||
selected: true,
|
||||
depends: 'exim',
|
||||
flag: 'sieve',
|
||||
label: 'Правила Sieve',
|
||||
description:
|
||||
'Включает поддержку правил фильтрации почты (Sieve), позволяя пользователям настраивать автоматическую сортировку, обработку спама, автоматические ответы и другие правила. Требует Dovecot и Exim.',
|
||||
default: 'no',
|
||||
},
|
||||
{
|
||||
name: ' --firewall',
|
||||
id: 'firewall',
|
||||
param: '--firewall',
|
||||
desc: 'Управлять фаерволом.',
|
||||
selected: true,
|
||||
flag: 'clamav',
|
||||
label: 'ClamAV',
|
||||
description:
|
||||
'ClamAV — это кроссплатформенное программное обеспечение с открытым исходным кодом для обеспечения безопасности электронной почты. Используется для обнаружения вирусов в электронных письмах и других файлах.',
|
||||
default: 'yes',
|
||||
},
|
||||
{
|
||||
name: ' --nopublicip',
|
||||
id: 'nopublicip',
|
||||
param: '--nopublicip',
|
||||
desc: 'Использовать локальный IP сервера',
|
||||
selected: false,
|
||||
flag: 'usemirrorclamav',
|
||||
label: 'Российское зеркало ClamAV',
|
||||
description:
|
||||
'Использовать российское зеркало для обновления вирусных баз ClamAV. Подходит для серверов, расположенных в России или соседних регионах, где загрузка с официального источника медленная или нестабильная. Базы будут загружаться с repo.brepo.ru, возможна задержка в несколько часов.',
|
||||
default: 'no',
|
||||
},
|
||||
{
|
||||
name: ' --uselocalphp',
|
||||
id: 'uselocalphp',
|
||||
param: '--uselocalphp',
|
||||
desc: 'Использовать PHP из текущего репозитория HestiaCP',
|
||||
selected: false,
|
||||
flag: 'spamassassin',
|
||||
label: 'SpamAssassin',
|
||||
description:
|
||||
'SpamAssassin — это инструмент с открытым исходным кодом для идентификации и фильтрации спама. Он анализирует заголовки, тело и информацию об отправителе письма, применяя ряд правил для оценки того, является ли письмо спамом.',
|
||||
default: 'yes',
|
||||
},
|
||||
{
|
||||
name: ' --usemirrorclamav',
|
||||
id: 'usemirrorclamav',
|
||||
param: '--usemirrorclamav',
|
||||
desc: 'Использовать clamav с базами скачанными с зеркала в России',
|
||||
selected: false,
|
||||
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: ' --fail2ban',
|
||||
id: 'fail2ban',
|
||||
param: '--fail2ban',
|
||||
desc: 'Предотвращение Bruteforce атак на SSH, Email, FTP, БД.',
|
||||
selected: true,
|
||||
flag: 'bunkerweb',
|
||||
label: 'Межсетевой экран WAF Bunkerweb',
|
||||
description:
|
||||
'Bunkerweb — это межсетевой экран веб-приложений (WAF) с открытым исходным кодом, обеспечивающий защиту на основе основных правил OWASP, черные/белые списки IP, ограничение скорости, HTTP-заголовки безопасности и другие функции безопасности.',
|
||||
default: 'no',
|
||||
},
|
||||
{
|
||||
name: ' --quota',
|
||||
id: 'quota',
|
||||
param: '--quota',
|
||||
desc: 'Использовать квоты на пользовательские аккаунты.',
|
||||
selected: false,
|
||||
flag: 'uselocalphp',
|
||||
label: 'Использовать официальную сборку PHP от Hestia',
|
||||
description:
|
||||
'Использовать версию PHP из официального репозитория HestiaCP вместо стандартного источника операционной системы. При включении пакеты PHP будут загружаться из репозитория brepo, что обеспечивает единообразие версий и совместимость.',
|
||||
default: 'no',
|
||||
},
|
||||
{ name: ' --api', id: 'api', param: '--api', desc: 'Activate API.', selected: true },
|
||||
{
|
||||
name: ' --interactive',
|
||||
id: 'interactive',
|
||||
param: '--interactive',
|
||||
desc: 'Интерактивная установка.',
|
||||
selected: true,
|
||||
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 },
|
||||
];
|
||||
|
||||
@@ -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' },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -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 |
|
||||
| **Операционная система (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
|
||||
```
|
||||
|
||||
#### Пример
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
---
|
||||
|
||||
@@ -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
6
docs/public/paypal.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 12 KiB |
29
docs/team.md
29
docs/team.md
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
2930
package-lock.json
generated
2930
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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": [
|
||||
|
||||
Reference in New Issue
Block a user