- Синхронизация с github
- Добавлены изменения в доку от hestiacn
This commit is contained in:
@@ -1,51 +1,77 @@
|
||||
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,
|
||||
|
||||
head: [
|
||||
["link", { rel: "icon", sizes: "any", href: "/favicon.ico" }],
|
||||
['link', { rel: 'icon', sizes: 'any', href: '/favicon.ico' }],
|
||||
['link', { rel: 'icon', type: 'image/svg+xml', sizes: '16x16', href: '/logo.svg' }],
|
||||
[
|
||||
"link",
|
||||
{ rel: "icon", type: "image/svg+xml", sizes: "16x16", href: "/logo.svg" },
|
||||
],
|
||||
[
|
||||
"link",
|
||||
'link',
|
||||
{
|
||||
rel: "apple-touch-icon",
|
||||
sizes: "180x180",
|
||||
href: "/apple-touch-icon.png",
|
||||
rel: 'apple-touch-icon',
|
||||
sizes: '180x180',
|
||||
href: '/apple-touch-icon.png',
|
||||
},
|
||||
],
|
||||
["link", { rel: "manifest", href: "/site.webmanifest" }],
|
||||
["meta", { name: "theme-color", content: "#b7236a" }],
|
||||
['link', { rel: 'manifest', href: '/site.webmanifest' }],
|
||||
['meta', { name: 'theme-color', content: '#b7236a' }],
|
||||
],
|
||||
|
||||
themeConfig: {
|
||||
logo: "/logo.svg",
|
||||
logo: '/logo.svg',
|
||||
|
||||
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" },
|
||||
{ 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],
|
||||
|
||||
footer: {
|
||||
message: "Выпущена под лицензией GPLv3.",
|
||||
message: 'Выпущена под лицензией GPLv3.',
|
||||
copyright:
|
||||
"Copyright © 2019-present Hestia Control Panel и некоторые RPM based компоненты принадлежат bayrepo",
|
||||
'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: 'закрыть',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -53,27 +79,25 @@ export default defineConfig({
|
||||
/** @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: 'Характеристики', 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: '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/CONTRIBUTING.md',
|
||||
},
|
||||
{
|
||||
text: "Политика безопасности",
|
||||
link: "https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/SECURITY.md",
|
||||
text: 'Политика безопасности',
|
||||
link: 'https://dev.brepo.ru/bayrepo/hestiacp/src/branch/master/SECURITY.md',
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -83,140 +107,140 @@ function nav() {
|
||||
function sidebarDocs() {
|
||||
return [
|
||||
{
|
||||
text: "Знакомство",
|
||||
text: 'Знакомство',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "С чего начать",
|
||||
link: "/docs/introduction/getting-started.md",
|
||||
text: 'С чего начать',
|
||||
link: '/docs/introduction/getting-started.md',
|
||||
},
|
||||
{ text: "Рекомендации", link: "/docs/introduction/best-practices.md" },
|
||||
{ text: 'Рекомендации', link: '/docs/introduction/best-practices.md' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Инструкция пользователя",
|
||||
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: 'Аккаунт', 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: "Администрирование сервера",
|
||||
text: 'Администрирование сервера',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Создание резервных копий и восстановление",
|
||||
link: "/docs/server-administration/backup-restore.md",
|
||||
text: 'Создание резервных копий и восстановление',
|
||||
link: '/docs/server-administration/backup-restore.md',
|
||||
},
|
||||
{
|
||||
text: "Конфигурация",
|
||||
link: "/docs/server-administration/configuration.md",
|
||||
text: 'Конфигурация',
|
||||
link: '/docs/server-administration/configuration.md',
|
||||
},
|
||||
{
|
||||
text: "Персональная настройка",
|
||||
link: "/docs/server-administration/customisation.md",
|
||||
text: 'Персональная настройка',
|
||||
link: '/docs/server-administration/customisation.md',
|
||||
},
|
||||
{
|
||||
text: "Базы данных и phpMyAdmin",
|
||||
link: "/docs/server-administration/databases.md",
|
||||
text: 'Базы данных и phpMyAdmin',
|
||||
link: '/docs/server-administration/databases.md',
|
||||
},
|
||||
{
|
||||
text: "DNS кластера & DNSSEC",
|
||||
link: "/docs/server-administration/dns.md",
|
||||
text: 'DNS кластера & DNSSEC',
|
||||
link: '/docs/server-administration/dns.md',
|
||||
},
|
||||
{ text: "Email", link: "/docs/server-administration/email.md" },
|
||||
{ text: 'Email', link: '/docs/server-administration/email.md' },
|
||||
{
|
||||
text: "Менеджер файлов",
|
||||
link: "/docs/server-administration/file-manager.md",
|
||||
text: 'Менеджер файлов',
|
||||
link: '/docs/server-administration/file-manager.md',
|
||||
},
|
||||
{ text: "Firewall", link: "/docs/server-administration/firewall.md" },
|
||||
{ text: 'Firewall', link: '/docs/server-administration/firewall.md' },
|
||||
{
|
||||
text: "Обновления ОС",
|
||||
link: "/docs/server-administration/os-upgrades.md",
|
||||
text: 'Обновления ОС',
|
||||
link: '/docs/server-administration/os-upgrades.md',
|
||||
},
|
||||
{ text: "Rest API", link: "/docs/server-administration/rest-api.md" },
|
||||
{ text: 'Rest API', link: '/docs/server-administration/rest-api.md' },
|
||||
{
|
||||
text: "SSL сертификаты",
|
||||
link: "/docs/server-administration/ssl-certificates.md",
|
||||
text: 'SSL сертификаты',
|
||||
link: '/docs/server-administration/ssl-certificates.md',
|
||||
},
|
||||
{
|
||||
text: "Веб шаблоны и кэширование",
|
||||
link: "/docs/server-administration/web-templates.md",
|
||||
text: 'Веб шаблоны и кэширование',
|
||||
link: '/docs/server-administration/web-templates.md',
|
||||
},
|
||||
{
|
||||
text: "Troubleshooting",
|
||||
link: "/docs/server-administration/troubleshooting.md",
|
||||
text: 'Troubleshooting',
|
||||
link: '/docs/server-administration/troubleshooting.md',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Содейтсвие в разработке",
|
||||
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/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/quick-install-app.md',
|
||||
},
|
||||
{ text: "Тестирование", link: "/docs/contributing/testing.md" },
|
||||
{ text: "Переводы", link: "/docs/contributing/translations.md" },
|
||||
{ text: 'Тестирование', link: '/docs/contributing/testing.md' },
|
||||
{ text: 'Переводы', link: '/docs/contributing/translations.md' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Сообщество",
|
||||
text: 'Сообщество',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Hestia Nginx Cache",
|
||||
link: "/docs/community/hestia-nginx-cache.md",
|
||||
text: 'Hestia Nginx Cache',
|
||||
link: '/docs/community/hestia-nginx-cache.md',
|
||||
},
|
||||
{
|
||||
text: "Ioncube installer for Hestia",
|
||||
link: "/docs/community/ioncube-hestia-installer.md",
|
||||
text: 'Ioncube installer for Hestia',
|
||||
link: '/docs/community/ioncube-hestia-installer.md',
|
||||
},
|
||||
{
|
||||
text: "Генератор установочной команды",
|
||||
link: "/docs/community/install-script-generator.md",
|
||||
text: 'Генератор установочной команды',
|
||||
link: '/docs/community/install-script-generator.md',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Ссылки",
|
||||
text: 'Ссылки',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "API", link: "/docs/reference/api.md" },
|
||||
{ text: "CLI", link: "/docs/reference/cli.md" },
|
||||
{ text: 'API', link: '/docs/reference/api.md' },
|
||||
{ text: 'CLI', link: '/docs/reference/cli.md' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Дополнения",
|
||||
text: 'Дополнения',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "PHP cli селектор",
|
||||
link: "/docs/extensions/php-cli-selector.md",
|
||||
text: 'PHP cli селектор',
|
||||
link: '/docs/extensions/php-cli-selector.md',
|
||||
},
|
||||
{
|
||||
text: "Расширенные модули",
|
||||
link: "/docs/extensions/extended-modules.md",
|
||||
text: 'Расширенные модули',
|
||||
link: '/docs/extensions/extended-modules.md',
|
||||
},
|
||||
{ text: "Настройка Local PHP", link: "/docs/extensions/local-php.md" },
|
||||
{ text: 'Настройка Local PHP', link: '/docs/extensions/local-php.md' },
|
||||
{
|
||||
text: "nginx+mod_rewrite",
|
||||
link: "/docs/extensions/nginx-mod-rewrite.md",
|
||||
text: 'nginx+mod_rewrite',
|
||||
link: '/docs/extensions/nginx-mod-rewrite.md',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
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,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 |
|
||||
| **Операционная система (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
|
||||
|
||||
## Обычная установка
|
||||
|
||||
@@ -109,7 +110,6 @@ bash hst-install.sh -h
|
||||
-R, --with-rpms Path to Hestia rpms
|
||||
-f, --force Force installation
|
||||
-h, --help Print this help
|
||||
|
||||
```
|
||||
|
||||
#### Пример
|
||||
|
||||
551
docs/donate.md
551
docs/donate.md
@@ -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>
|
||||
|
||||
- [PayPal](https://www.paypal.com/donate/?cmd=_s-xclick&hosted_button_id=ST87LQH2CHGLA)
|
||||
- Crypto
|
||||
- Bitcoin: bc1q48jt5wg5jaj8g9zy7c3j03cv57j2m2u5anlutu
|
||||
- Ethereum: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51
|
||||
- Binance: bnb1l4ywvw5ejfmsgjdcx8jn5lxj7zsun8ktfu7rh8
|
||||
- Smart Chain: 0xfF3Dd2c889bd0Ff73d8085B84A314FC7c88e5D51
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
@@ -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: Поддержать сообщество
|
||||
---
|
||||
|
||||
@@ -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