- Синхронизация с github

- Добавлены изменения в доку от hestiacn
This commit is contained in:
Alexey Berezhok
2026-06-04 14:11:27 +03:00
parent 317e3e215e
commit 09aa301dd1
21 changed files with 4258 additions and 1259 deletions

View File

@@ -1,224 +1,248 @@
import { defineConfig } from "vitepress";
import { version } from "../../package.json";
import { defineConfig } from 'vitepress';
import { version } from '../../package.json';
export default defineConfig({
lang: "en-US",
title: "Hestia Control Panel",
description: "Open-source web server control panel.",
lang: 'en-US',
title: 'Hestia Control Panel',
description: 'Open-source web server control panel.',
lastUpdated: true,
cleanUrls: false,
lastUpdated: true,
cleanUrls: false,
head: [
["link", { rel: "icon", sizes: "any", href: "/favicon.ico" }],
[
"link",
{ rel: "icon", type: "image/svg+xml", sizes: "16x16", href: "/logo.svg" },
],
[
"link",
{
rel: "apple-touch-icon",
sizes: "180x180",
href: "/apple-touch-icon.png",
},
],
["link", { rel: "manifest", href: "/site.webmanifest" }],
["meta", { name: "theme-color", content: "#b7236a" }],
],
head: [
['link', { rel: 'icon', sizes: 'any', href: '/favicon.ico' }],
['link', { rel: 'icon', type: 'image/svg+xml', sizes: '16x16', href: '/logo.svg' }],
[
'link',
{
rel: 'apple-touch-icon',
sizes: '180x180',
href: '/apple-touch-icon.png',
},
],
['link', { rel: 'manifest', href: '/site.webmanifest' }],
['meta', { name: 'theme-color', content: '#b7236a' }],
],
themeConfig: {
logo: "/logo.svg",
themeConfig: {
logo: '/logo.svg',
nav: nav(),
nav: nav(),
socialLinks: [
{ icon: "github", link: "https://dev.brepo.ru/bayrepo/hestiacp" },
{ icon: "github", link: "https://github.com/bayrepo/hestiacp-rpm" },
{ icon: "github", link: "https://github.com/hestiacp/hestiacp" },
],
socialLinks: [
{ icon: 'github', link: 'https://dev.brepo.ru/bayrepo/hestiacp' },
{ icon: 'github', link: 'https://github.com/bayrepo/hestiacp-rpm' },
{ icon: 'github', link: 'https://github.com/hestiacp/hestiacp' },
],
sidebar: { "/docs/": sidebarDocs() },
sidebar: { '/docs/': sidebarDocs() },
outline: [2, 3],
outline: [2, 3],
footer: {
message: "Выпущена под лицензией GPLv3.",
copyright:
"Copyright © 2019-present Hestia Control Panel и некоторые RPM based компоненты принадлежат bayrepo",
},
},
footer: {
message: 'Выпущена под лицензией GPLv3.',
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: 'закрыть',
},
},
},
},
},
},
});
/** @returns {import("vitepress").DefaultTheme.NavItem[]} */
function nav() {
return [
{ text: "Характеристики", link: "/features.md" },
{ text: "Установка", link: "/install.md" },
{
text: "Документация",
link: "/docs/introduction/getting-started.md",
activeMatch: "/docs/",
},
{
text: `v${version}`,
items: [
{
text: "Changelog",
link: "https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/CHANGELOG.md",
},
{
text: "Содействие в разработке",
link: "https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/CONTRIBUTING.md",
},
{
text: "Политика безопасности",
link: "https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/SECURITY.md",
},
],
},
];
return [
{ text: 'Характеристики', link: '/features.md' },
{ text: 'Установка', link: '/install.md' },
{ text: 'Документация', link: '/docs/introduction/getting-started.md', activeMatch: '/docs/' },
{ text: 'Разработчики', link: '/team.md' },
{ text: 'Поддержать', link: '/donate.md' },
{
text: `v${version}`,
items: [
{
text: 'Changelog',
link: 'https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/CHANGELOG.md',
},
{
text: 'Содействие в разработке',
link: 'https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/CONTRIBUTING.md',
},
{
text: 'Политика безопасности',
link: 'https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/SECURITY.md',
},
],
},
];
}
/** @returns {import("vitepress").DefaultTheme.SidebarItem[]} */
function sidebarDocs() {
return [
{
text: "Знакомство",
collapsed: false,
items: [
{
text: "С чего начать",
link: "/docs/introduction/getting-started.md",
},
{ text: "Рекомендации", link: "/docs/introduction/best-practices.md" },
],
},
{
text: "Инструкция пользователя",
collapsed: false,
items: [
{ text: "Аккаунт", link: "/docs/user-guide/account.md" },
{ text: "Резервные копии", link: "/docs/user-guide/backups.md" },
{ text: "Cron задачи", link: "/docs/user-guide/cron-jobs.md" },
{ text: "Базы данных", link: "/docs/user-guide/databases.md" },
{ text: "DNS", link: "/docs/user-guide/dns.md" },
{ text: "Менеджер файлов", link: "/docs/user-guide/file-manager.md" },
{ text: "Почтовые домены", link: "/docs/user-guide/mail-domains.md" },
{ text: "Оповещения", link: "/docs/user-guide/notifications.md" },
{ text: "Пакеты", link: "/docs/user-guide/packages.md" },
{ text: "Статистика", link: "/docs/user-guide/statistics.md" },
{ text: "Пользователи", link: "/docs/user-guide/users.md" },
{ text: "Веб домены", link: "/docs/user-guide/web-domains.md" },
],
},
{
text: "Администрирование сервера",
collapsed: false,
items: [
{
text: "Создание резервных копий и восстановление",
link: "/docs/server-administration/backup-restore.md",
},
{
text: "Конфигурация",
link: "/docs/server-administration/configuration.md",
},
{
text: "Персональная настройка",
link: "/docs/server-administration/customisation.md",
},
{
text: "Базы данных и phpMyAdmin",
link: "/docs/server-administration/databases.md",
},
{
text: "DNS кластера & DNSSEC",
link: "/docs/server-administration/dns.md",
},
{ text: "Email", link: "/docs/server-administration/email.md" },
{
text: "Менеджер файлов",
link: "/docs/server-administration/file-manager.md",
},
{ text: "Firewall", link: "/docs/server-administration/firewall.md" },
{
text: "Обновления ОС",
link: "/docs/server-administration/os-upgrades.md",
},
{ text: "Rest API", link: "/docs/server-administration/rest-api.md" },
{
text: "SSL сертификаты",
link: "/docs/server-administration/ssl-certificates.md",
},
{
text: "Веб шаблоны и кэширование",
link: "/docs/server-administration/web-templates.md",
},
{
text: "Troubleshooting",
link: "/docs/server-administration/troubleshooting.md",
},
],
},
{
text: "Содейтсвие в разработке",
collapsed: false,
items: [
{ text: "Сборка пакетов", link: "/docs/contributing/building.md" },
{ text: "Разработка", link: "/docs/contributing/development.md" },
{ text: "Документация", link: "/docs/contributing/documentation.md" },
{
text: "Установка приложений",
link: "/docs/contributing/quick-install-app.md",
},
{ text: "Тестирование", link: "/docs/contributing/testing.md" },
{ text: "Переводы", link: "/docs/contributing/translations.md" },
],
},
{
text: "Сообщество",
collapsed: false,
items: [
{
text: "Hestia Nginx Cache",
link: "/docs/community/hestia-nginx-cache.md",
},
{
text: "Ioncube installer for Hestia",
link: "/docs/community/ioncube-hestia-installer.md",
},
{
text: "Генератор установочной команды",
link: "/docs/community/install-script-generator.md",
},
],
},
{
text: "Ссылки",
collapsed: false,
items: [
{ text: "API", link: "/docs/reference/api.md" },
{ text: "CLI", link: "/docs/reference/cli.md" },
],
},
{
text: "Дополнения",
collapsed: false,
items: [
{
text: "PHP cli селектор",
link: "/docs/extensions/php-cli-selector.md",
},
{
text: "Расширенные модули",
link: "/docs/extensions/extended-modules.md",
},
{ text: "Настройка Local PHP", link: "/docs/extensions/local-php.md" },
{
text: "nginx+mod_rewrite",
link: "/docs/extensions/nginx-mod-rewrite.md",
},
],
},
];
return [
{
text: 'Знакомство',
collapsed: false,
items: [
{
text: 'С чего начать',
link: '/docs/introduction/getting-started.md',
},
{ text: 'Рекомендации', link: '/docs/introduction/best-practices.md' },
],
},
{
text: 'Инструкция пользователя',
collapsed: false,
items: [
{ text: 'Аккаунт', link: '/docs/user-guide/account.md' },
{ text: 'Резервные копии', link: '/docs/user-guide/backups.md' },
{ text: 'Cron задачи', link: '/docs/user-guide/cron-jobs.md' },
{ text: 'Базы данных', link: '/docs/user-guide/databases.md' },
{ text: 'DNS', link: '/docs/user-guide/dns.md' },
{ text: 'Менеджер файлов', link: '/docs/user-guide/file-manager.md' },
{ text: 'Почтовые домены', link: '/docs/user-guide/mail-domains.md' },
{ text: 'Оповещения', link: '/docs/user-guide/notifications.md' },
{ text: 'Пакеты', link: '/docs/user-guide/packages.md' },
{ text: 'Статистика', link: '/docs/user-guide/statistics.md' },
{ text: 'Пользователи', link: '/docs/user-guide/users.md' },
{ text: 'Веб домены', link: '/docs/user-guide/web-domains.md' },
],
},
{
text: 'Администрирование сервера',
collapsed: false,
items: [
{
text: 'Создание резервных копий и восстановление',
link: '/docs/server-administration/backup-restore.md',
},
{
text: 'Конфигурация',
link: '/docs/server-administration/configuration.md',
},
{
text: 'Персональная настройка',
link: '/docs/server-administration/customisation.md',
},
{
text: 'Базы данных и phpMyAdmin',
link: '/docs/server-administration/databases.md',
},
{
text: 'DNS кластера & DNSSEC',
link: '/docs/server-administration/dns.md',
},
{ text: 'Email', link: '/docs/server-administration/email.md' },
{
text: 'Менеджер файлов',
link: '/docs/server-administration/file-manager.md',
},
{ text: 'Firewall', link: '/docs/server-administration/firewall.md' },
{
text: 'Обновления ОС',
link: '/docs/server-administration/os-upgrades.md',
},
{ text: 'Rest API', link: '/docs/server-administration/rest-api.md' },
{
text: 'SSL сертификаты',
link: '/docs/server-administration/ssl-certificates.md',
},
{
text: 'Веб шаблоны и кэширование',
link: '/docs/server-administration/web-templates.md',
},
{
text: 'Troubleshooting',
link: '/docs/server-administration/troubleshooting.md',
},
],
},
{
text: 'Содейтсвие в разработке',
collapsed: false,
items: [
{ text: 'Сборка пакетов', link: '/docs/contributing/building.md' },
{ text: 'Разработка', link: '/docs/contributing/development.md' },
{ text: 'Документация', link: '/docs/contributing/documentation.md' },
{
text: 'Установка приложений',
link: '/docs/contributing/quick-install-app.md',
},
{ text: 'Тестирование', link: '/docs/contributing/testing.md' },
{ text: 'Переводы', link: '/docs/contributing/translations.md' },
],
},
{
text: 'Сообщество',
collapsed: false,
items: [
{
text: 'Hestia Nginx Cache',
link: '/docs/community/hestia-nginx-cache.md',
},
{
text: 'Ioncube installer for Hestia',
link: '/docs/community/ioncube-hestia-installer.md',
},
{
text: 'Генератор установочной команды',
link: '/docs/community/install-script-generator.md',
},
],
},
{
text: 'Ссылки',
collapsed: false,
items: [
{ text: 'API', link: '/docs/reference/api.md' },
{ text: 'CLI', link: '/docs/reference/cli.md' },
],
},
{
text: 'Дополнения',
collapsed: false,
items: [
{
text: 'PHP cli селектор',
link: '/docs/extensions/php-cli-selector.md',
},
{
text: 'Расширенные модули',
link: '/docs/extensions/extended-modules.md',
},
{ text: 'Настройка Local PHP', link: '/docs/extensions/local-php.md' },
{
text: 'nginx+mod_rewrite',
link: '/docs/extensions/nginx-mod-rewrite.md',
},
],
},
];
}

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,13 @@ 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 |
| **Операционная система (Debian/Ubuntu)** | Debian 11, 12, 13 LTS <br>Ubuntu 22.04, 24.04, 26.04 LTS | Последняя версия Debian<br>Последняя версия Ubuntu LTS |
| **Операционная система (RPM)** | MSVSphere 9<br>AlmaLinux 9<br>Rocky Linux 9 | MSVSphere 10<br>Rocky Linux 10<br>AlmaLinux 10 |
::: warning
Hestia работает только на процессорах AMD64 / x86_64 и ARM64 / aarch64. Также требуется 64-разрядная операционная система!
@@ -28,9 +29,9 @@ Hestia работает только на процессорах AMD64 / x86_64
### Поддерживаемые операционные системы
- MSVSphere 9
- AlmaLinux 9
- Rocky Linux 9
- MSVSphere 9,10
- AlmaLinux 9,10
- Rocky Linux 9,10
## Обычная установка
@@ -79,37 +80,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 +149,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 +1,546 @@
---
aside: false
lastUpdated: false
layout: page
title: Поддержать Hestia
---
# Donate to the project
<script setup>
import CopyToClipboardInput from './.vitepress/theme/components/CopyToClipboardInput.vue';
</script>
<div class="donation-header">
<h2>Поддержите проект Hestia</h2><br>
<p class="subtitle">
Ваша поддержка будет напрямую направлена на обслуживание серверов Hestia,<br>
разработку новых функций и оптимизацию сервисов,<br>
помогая создать более стабильную и надёжную панель управления.
</p>
</div>
<div class="table-container">
<table>
<thead>
<tr>
<th>Способ поддержки</th>
<th>Аккаунт / Действие</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td class="method-name" data-th="Способ поддержки">PayPal</td>
<td class="text-center" data-th="Аккаунт / Действие">
<a
href="https://www.paypal.com/donate/?hosted_button_id=ST87LQH2CHGLA"
target="_blank"
class="paypal-button">
<span class="paypal-logo">
<img src="/paypal.svg" alt="PayPal Logo" class="paypal-svg">
</span>
<span class="button-text">Поддержать сейчас</span>
</a>
</td>
<td class="text-center" data-th="Примечание">Поддержка кредитными/дебетовыми картами</td>
</tr>
<tr>
<td class="method-name" data-th="Способ поддержки">Bitcoin</td>
<td class="text-center" data-th="Аккаунт / Действие"><CopyToClipboardInput value="bc1q48jt5wg5jaj8g9zy7c3j03cv57j2m2u5anlutu" class="crypto-address" /></td>
<td class="text-center" data-th="Примечание">Основная сеть Bitcoin</td>
</tr>
<tr>
<td class="method-name" data-th="Способ поддержки">Ethereum</td>
<td class="text-center" data-th="Аккаунт / Действие"><CopyToClipboardInput value="0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51" class="crypto-address" /></td>
<td class="text-center" data-th="Примечание">Сеть ERC20</td>
</tr>
<tr class="deprecated-row">
<td class="method-name deprecated-text" data-th="Способ поддержки">Binance</td>
<td class="text-center" data-th="Аккаунт / Действие"><CopyToClipboardInput value="bnb1l4ywvw5ejfmsgjdcx8jn5lxj7zsun8ktfu7rh8" class="crypto-address deprecated-input" /></td>
<td class="text-center danger-alert" data-th="Примечание">
<strong>⚠️ Крайне опасно!</strong> Сеть BEP2 полностью прекратила работу в конце 2024 года! Не отправляйте средства, иначе они будут потеряны навсегда.
</td>
</tr>
<tr>
<td class="method-name" data-th="Способ поддержки">BNB Smart Chain</td>
<td class="text-center" data-th="Аккаунт / Действие"><CopyToClipboardInput value="0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51" class="crypto-address" /></td>
<td class="text-center warning" data-th="Примечание">Убедитесь, что используете сеть BSC (BEP20)</td>
</tr>
<tr>
<td class="method-name" data-th="Способ поддержки">Monero (XMR)</td>
<td class="text-center" data-th="Аккаунт / Действие"><CopyToClipboardInput value="45p5eKWfp3kYcY3cBtKq2TWpp5HGYFAbre2Xd76sRhWGXfahAj5MkxzV2oPF2VqU617pwS5JZh1h4gy6jTm73vE7PnQ48Rs" class="crypto-address" /></td>
<td class="text-center" data-th="Примечание">Конфиденциальная сеть</td>
</tr>
</tbody>
</table>
</div>
By donating to Hestia, you help maintain server costs, development time, and more!
<div class="donation-footer">
<h3 class="text-center">Искренне благодарим вас за поддержку!</h3><br>
Here are our official donation platforms:
<p class="text-center">Каждое пожертвование — это огромное вдохновение для разработки Hestia.<span class="mobile-line-break"></span> Мы будем неустанно работать, чтобы улучшить качество использования панели управления!</p>
<div class="notice-box">
<h4 class="text-center">
<span class="warning-icon"></span>
Важное примечание
</h4>
<ul>
<li>✅ Перед переводом <strong>внимательно проверьте</strong> адрес блокчейна</li>
<li>⏳ Перевод криптовалюты обычно требует от 1 до 30 минут для подтверждения</li>
<span class="mobile-br"><li>📧 Если у вас есть вопросы, пожалуйста, свяжитесь с нами по электронной почте!<br class="mobile-only"><a href="mailto:info@hestiacp.com">info@hestiacp.com</a></li></span>
</ul>
</div>
</div>
- [PayPal](https://www.paypal.com/donate/?cmd=_s-xclick&hosted_button_id=ST87LQH2CHGLA)
- Crypto
- Bitcoin: bc1q48jt5wg5jaj8g9zy7c3j03cv57j2m2u5anlutu
- Ethereum: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51
- Binance: bnb1l4ywvw5ejfmsgjdcx8jn5lxj7zsun8ktfu7rh8
- Smart Chain: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51
<style scoped>
.crypto-address {
font-family: monospace;
font-size: 18px;
color: #333;
}
.CopyToClipboardInput {
gap: 8px;
background: var(--vp-c-bg);
border-radius: 4px;
padding: 2px;
}
@keyframes pulse {
0% { opacity: 1 }
50% { opacity: 0.5 }
100% { opacity: 1 }
}
.donation-header h2 {
font-size: 2.5rem;
font-weight: 700;
color: var(--vp-c-brand);
margin-bottom: 1.2rem;
position: relative;
display: inline-block;
letter-spacing: -0.03em;
padding-top: 1rem;
transform: translateY(15px);
}
.donation-header h2::after {
content: '';
position: absolute;
bottom: -8px;
left: 50%;
transform: translateX(-50%);
width: 60%;
height: 3px;
background: linear-gradient(90deg, var(--vp-c-brand) 0%, rgba(0,0,0,0) 100%);
opacity: 0.6;
transition: all 0.3s ease;
}
.donation-header h2:hover::after {
width: 80%;
opacity: 1;
}
.table-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 1rem;
}
th:nth-child(2),
td:nth-child(2) {
width: 50%;
}
.table-container table {
width: 100%;
border-collapse: collapse;
}
.table-container td {
border: 1px solid #ddd;
padding: 10px;
text-align: center;
}
.paypal-button {
background-color: var(--vp-button-brand-bg);
color: white !important;
padding: 10px 20px;
text-decoration: none;
border-radius: 5px;
transition: background-color 0.3s;
}
.paypal-button:hover {
background-color: #9a1d5a;
}
.paypal-svg {
vertical-align: middle;
margin-right: 1px;
}
.warning {
color: #d32f2f;
font-weight: bold;
}
.paypal-button {
display: inline-flex;
align-items: center;
padding: 12px 24px;
border-radius: 24px;
background: var(--vp-c-brand);
color: white !important;
text-decoration: none;
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
border: 1px solid var(--vp-c-brand-dark);
}
.paypal-button:hover {
background: #dd0b71;
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
.paypal-logo {
display: flex;
margin-right: 12px;
}
.paypal-logo svg {
width: 24px;
height: 24px;
}
.button-text {
font-weight: 600;
font-size: 16px;
}
.donation-header {
text-align: center;
margin-bottom: 2.5rem;
}
.subtitle {
color: var(--vp-c-text-2);
margin-top: 0.8rem;
}
table {
width: 100%;
border-collapse: collapse;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
border-radius: 8px;
overflow: hidden;
}
th {
background-color: var(--vp-c-brand);
color: white;
padding: 1.2rem;
text-align: center;
}
td {
padding: 1rem;
background-color: var(--vp-c-bg-soft);
border-bottom: 1px solid var(--vp-c-divider);
}
.method-name {
font-weight: 600;
color: var(--vp-c-brand);
}
.text-center {
text-align: center !important;
}
.warning {
color: #ff4d4f;
font-weight: 500;
}
.donation-footer {
max-width: 800px;
margin: 3rem auto;
text-align: center;
}
.notice-box {
background: #fff9e6;
border-radius: 8px;
padding: 1.5rem 2rem;
margin-top: 2rem;
border-left: 4px solid #ffd700;
box-shadow: 0 2px 8px rgba(255, 193, 7, 0.1);
position: relative;
overflow: hidden;
}
.notice-box::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 40px;
height: 100%;
background: rgba(255, 193, 7, 0.1);
}
.notice-box h4 {
color: #d32f2f;
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
font-size: 1.1em;
margin-bottom: 1rem;
}
.notice-box ul {
list-style: none;
padding: 0;
margin: 1rem 0;
}
.notice-box li {
margin: 0.8rem 0;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
.paypal-svg {
width: 24px;
height: 24px;
color: currentColor;
}
.paypal-button:hover .paypal-svg {
filter: brightness(1.2);
}
.notice-box h4::before {
content: '';
display: inline-block;
width: 24px;
height: 24px;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23d32f2f"><path d="M12 2L1 21h22L12 2zm0 4.5l7.53 13h-15.06L12 6.5zM13 16h-2v2h2v-2zm-2-6h2v4h-2v-4z"/></svg>');
animation: pulse 1.5s infinite;
}
.notice-box a {
color: var(--vp-c-brand);
text-decoration: none;
transition: color 0.3s ease;
}
.notice-box a:hover {
color: var(--vp-c-brand-2);
}
.notice-box {
background: #fff9e6;
border-radius: 8px;
padding: 1.5rem 2rem;
margin-top: 2rem;
border-left: 4px solid #ffd700;
box-shadow: 0 2px 8px rgba(255, 193, 7, 0.1);
position: relative;
overflow: hidden;
}
.notice-box::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 40px;
height: 100%;
background: rgba(255, 193, 7, 0.1);
}
.notice-box h4 {
color: #d32f2f;
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
font-size: 1.1em;
margin-bottom: 1rem;
}
.notice-box ul {
list-style: none;
padding: 0;
margin: 1rem 0;
}
.notice-box li {
margin: 0.8rem 0;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
.notice-box a {
color: var(--vp-c-brand);
text-decoration: none;
transition: color 0.3s ease;
}
.notice-box a:hover {
color: var(--vp-c-brand-2);
}
.dark .table-container .crypto-address {
color: var(--vp-c-text);
}
.dark .table-container .CopyToClipboardInput input {
background-color: var(--vp-c-bg-alt);
color: var(--vp-c-text);
border: 1px solid var(--vp-c-border);
}
.dark .notice-box {
background: var(--vp-c-bg-alt);
border-left: 4px solid #ff9800;
box-shadow: 0 2px 8px rgba(255, 152, 0, 0.1);
}
.dark .notice-box::before {
background: rgba(255, 152, 0, 0.1);
}
.dark .notice-box h4 {
color: var(--vp-c-text);
}
.dark .notice-box a {
color: var(--vp-c-brand);
}
@media (max-width: 768px) {
.table-container {
max-width: 100%;
padding: 10px;
}
table {
width: 100%;
min-width: auto;
}
th:nth-child(2),
td:nth-child(2) {
width: 100%;
display: block;
}
}
@media (max-width: 640px) {
.notice-box {
padding: 1rem;
margin-top: 1.5rem;
}
.notice-box h4 {
font-size: 1rem;
}
.notice-box li {
font-size: 0.9rem;
margin: 0.6rem 0;
}
}
@media (max-width: 375px) {
.notice-box {
padding: 0.8rem;
}
.notice-box h4 {
font-size: 0.9rem;
}
.notice-box li {
font-size: 0.8rem;
margin: 0.5rem 0;
}
}
@media (max-width: 640px) {
.donation-header h2 {
font-size: 2rem;
line-height: 1.3;
margin-bottom: 1rem;
transform: none;
padding-top: 0.5rem;
letter-spacing: -0.02em;
}
.donation-header h2::after {
width: 50%;
bottom: -6px;
height: 2px;
}
.donation-header h2:hover::after {
width: 60%;
}
}
@media (max-width: 375px) {
.donation-header h2 {
font-size: 1.8rem;
margin-bottom: 0.8rem;
}
.donation-header h2::after {
width: 45%;
}
}
@media (max-width: 640px) {
table, thead, tbody, th, td, tr {
display: block;
width: 100%;
}
thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
tr {
margin: 0 0 1.5rem;
padding: 1.5rem 1rem;
background: var(--vp-c-bg-soft);
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0,0,0,0.1);
}
td {
position: relative;
padding: 1rem 0.5rem !important;
text-align: center !important;
border: none !important;
display: flex !important;
flex-direction: column;
align-items: center;
}
td:not(:first-child)::before {
content: attr(data-th) "";
display: block;
font-size: 0.9rem;
color: var(--vp-c-brand);
margin-bottom: 0.8rem;
font-weight: 600;
letter-spacing: 0.5px;
opacity: 0.9;
}
td.method-name {
font-size: 1.1rem;
padding-bottom: 1.2rem !important;
border-bottom: 2px solid var(--vp-c-divider) !important;
margin-bottom: 1rem;
}
.paypal-button {
width: 100%;
max-width: 150px;
margin: 0.5rem auto;
padding: 12px !important;
}
.CopyToClipboardInput input {
font-size: 0.9rem;
padding: 10px 15px;
min-width: 240px;
}
}
@media (max-width: 375px) {
.CopyToClipboardInput input {
font-size: 0.85rem;
padding: 8px 12px;
}
td:not(:first-child)::before {
font-size: 0.8rem;
}
}
.deprecated-row {
background-color: #f8f9fa;
opacity: 0.7;
}
.deprecated-text {
text-decoration: line-through;
color: #6c757d;
}
.danger-alert {
color: #dc3545;
font-weight: bold;
background-color: #f8d7da;
}
</style>

View File

@@ -15,22 +15,32 @@ 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
- icon: 🤝
title: Поддержка сообщества
details: У Hestia сильное поддерживающее сообщество. Если вы разработчик, ознакомьтесь с руководством по участию! Чтобы поддерживать проект, мы полагаемся на пожертвования. Вы можете сделать пожертвование через PayPal или криптовалюту.
link: /donate
linkText: Поддержать сообщество
---

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": [