Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c0345aaa97 | |||
| f751a23e65 | |||
| 0756141fcc | |||
| 60c4327897 | |||
| ceb4c272c8 | |||
| 9332950817 | |||
| c4f0202ea2 | |||
| da7acee362 | |||
| 1f7d7a5f08 | |||
| ac94d11c26 | |||
| 46ab890306 | |||
| 29d9e6e697 | |||
| 4f98517e1c | |||
| e1e6c53af2 | |||
| 273fae5567 | |||
| a68d021683 | |||
| 2aa68fc251 | |||
| 0da343e3a0 | |||
| e05518d243 | |||
| 06afb4e637 | |||
| 9d074e416b |
@@ -17,4 +17,4 @@ packages-list.json
|
|||||||
/.vale
|
/.vale
|
||||||
/.vscode
|
/.vscode
|
||||||
/.vale.ini
|
/.vale.ini
|
||||||
/.markdownlint.json
|
/VimpelcomCAG2.pem
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
deploy-prod:
|
|
||||||
stage: deploy
|
|
||||||
image: harbor.vimpelcom.ru/dockerhub/library/alpine:3.21.2
|
|
||||||
variables:
|
|
||||||
stand: beecloud-docs.beecloud-docs.cloud.vimpelcom.ru
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_BRANCH && $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
||||||
when: never
|
|
||||||
- if: $CI_PIPELINE_SOURCE == "push"
|
|
||||||
when: manual
|
|
||||||
before_script:
|
|
||||||
- |
|
|
||||||
sed -i s%https://dl-cdn.alpinelinux.org/%http://rhrepo.vimpelcom.ru/ext/ya/mirrors/% /etc/apk/repositories && \
|
|
||||||
apk --no-cache add tzdata ca-certificates curl openssh-client yq jq && \
|
|
||||||
rm -rf /var/cache/apk/*
|
|
||||||
- which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)
|
|
||||||
- eval $(ssh-agent -s)
|
|
||||||
- mkdir -p ~/.ssh
|
|
||||||
- echo -n "$TECH_SSH_KEY" | tr -d '\r' > ~/.ssh/id_rsa
|
|
||||||
- chmod 700 ~/.ssh
|
|
||||||
- chmod 600 ~/.ssh/id_rsa
|
|
||||||
- >
|
|
||||||
echo "stand: ${stand}"
|
|
||||||
ssh-keyscan "${stand}" >> ~/.ssh/known_hosts
|
|
||||||
- chmod 644 ~/.ssh/known_hosts
|
|
||||||
- PRODUCT="$PRODUCT_DMZ"
|
|
||||||
script:
|
|
||||||
- >
|
|
||||||
echo -e "Connect to ${stand}..." &&
|
|
||||||
scp -o StrictHostKeyChecking=no ci/deploy/deploy.sh "dorootless@${stand}:~/deploy.sh" &&
|
|
||||||
ssh "dorootless@${stand}" "export CONTAINER_REGISTRY=$CONTAINER_REGISTRY &&
|
|
||||||
export PRODUCT=$PRODUCT &&
|
|
||||||
export PRODUCT_VERSION=$PRODUCT_VERSION &&
|
|
||||||
export IMAGE_NAME=$IMAGE_NAME &&
|
|
||||||
chmod 700 ~/deploy.sh &&
|
|
||||||
~/deploy.sh ${IMAGE_NAME} &&
|
|
||||||
rm -f ~/deploy.sh"
|
|
||||||
needs:
|
|
||||||
- job: build-image
|
|
||||||
optional: true
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "docs",
|
"name": "docs",
|
||||||
"version": "0.6.5-main",
|
"version": "0.6.4",
|
||||||
"description": "Beeline Cloud docs",
|
"description": "Beeline Cloud docs",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -15,17 +15,16 @@
|
|||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@beeline/design-tokens": "^1.31.6",
|
"@beeline/design-tokens": "^1.31.0",
|
||||||
"vue": "^3.5.0"
|
"vue": "3.4.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@docsearch/css": "4.1.0",
|
"@docsearch/css": "3.3.0",
|
||||||
"@types/node": "^22.0.0",
|
"@types/node": "20.10.7",
|
||||||
"@vitejs/plugin-vue": "^6.0.3",
|
"@vitejs/plugin-vue": "4.3.4",
|
||||||
"sass": "^1.70.0",
|
"sass": "1.69.7",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.8.3",
|
||||||
"vite-plugin-static-copy": "^3.1.4",
|
"vitepress": "1.0.0-rc.40",
|
||||||
"vitepress": "^1.6.4",
|
"vitepress-plugin-tabs": "0.5.0"
|
||||||
"vitepress-plugin-tabs": "^0.7.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
import { defineConfig } from 'vitepress'
|
import { defineConfig } from 'vitepress'
|
||||||
import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs'
|
import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs'
|
||||||
import { viteStaticCopy } from 'vite-plugin-static-copy'
|
|
||||||
import { overrideComponents } from './override-components'
|
import { overrideComponents } from './override-components'
|
||||||
import { resolve } from 'node:path'
|
|
||||||
import { fileURLToPath, URL } from 'node:url'
|
|
||||||
|
|
||||||
const gitlab = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
const gitlab = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<svg
|
<svg
|
||||||
@@ -46,11 +43,10 @@ console.log({ base: typeof new_version !== 'undefined' ? '/' : '/docs/' })
|
|||||||
// https://vitepress.dev/reference/site-config
|
// https://vitepress.dev/reference/site-config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
srcDir: ".",
|
srcDir: ".",
|
||||||
title: " ",
|
title: "cloud",
|
||||||
description: "Документация Beeline Cloud",
|
description: "Документация Beeline Cloud",
|
||||||
head: [['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/bee-favicon.png' }]],
|
head: [['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/bee-favicon.png' }]],
|
||||||
base: typeof new_version !== 'undefined' ? '/' : '/docs/',
|
base: typeof new_version !== 'undefined' ? '/' : '/docs/',
|
||||||
appearance: false,
|
|
||||||
markdown: {
|
markdown: {
|
||||||
config(md) {
|
config(md) {
|
||||||
md.use(tabsMarkdownPlugin)
|
md.use(tabsMarkdownPlugin)
|
||||||
@@ -58,31 +54,8 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
vite: {
|
vite: {
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: [
|
alias: overrideComponents(),
|
||||||
...overrideComponents(),
|
}
|
||||||
{
|
|
||||||
find: '@',
|
|
||||||
replacement: fileURLToPath(new URL('./theme', import.meta.url))
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
viteStaticCopy({
|
|
||||||
targets: [
|
|
||||||
{
|
|
||||||
src: resolve(__dirname, '../../node_modules/@beeline/design-tokens/assets/fonts'),
|
|
||||||
dest: 'assets',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
css: {
|
|
||||||
preprocessorOptions: {
|
|
||||||
scss: {
|
|
||||||
api: 'modern-compiler',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
locales: {
|
locales: {
|
||||||
root: {
|
root: {
|
||||||
@@ -92,9 +65,9 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
logo: {
|
logo: {
|
||||||
light: '/img/logo-cloud.svg',
|
light: '/logo-light-theme.svg',
|
||||||
dark: '/img/logo-cloud.svg',
|
dark: '/logo-dark-theme.svg',
|
||||||
alt: '',
|
alt: 'cloud',
|
||||||
},
|
},
|
||||||
search: {
|
search: {
|
||||||
provider: 'local',
|
provider: 'local',
|
||||||
@@ -107,8 +80,14 @@ export default defineConfig({
|
|||||||
buttonAriaLabel: 'Поиск'
|
buttonAriaLabel: 'Поиск'
|
||||||
},
|
},
|
||||||
modal: {
|
modal: {
|
||||||
noResultsText: 'По вашему запросу ничего не найдено',
|
noResultsText: 'Не удалось загрузить данные',
|
||||||
resetButtonTitle: 'Сбросить',
|
resetButtonTitle: 'Сбросить',
|
||||||
|
displayDetails: 'Показать расширенный список',
|
||||||
|
footer: {
|
||||||
|
selectText: 'Выбрать',
|
||||||
|
closeText: 'Закрыть',
|
||||||
|
navigateText: 'Перейти',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,94 +129,6 @@ export default defineConfig({
|
|||||||
{text: 'Техническая поддержка', link: '/platform/support/support-overview.md'},
|
{text: 'Техническая поддержка', link: '/platform/support/support-overview.md'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
|
||||||
'/security/': [
|
|
||||||
{
|
|
||||||
text: 'Сервисы информационной безопасности в Beeline Cloud', link: '/security/index.md',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Cloud Security Awareness (SA)', link: 'security/Cloud-SA/SA-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
text: 'Состав сервиса SA', link: '/security/Cloud-SA/SA-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор сервиса', link: '/security/Cloud-SA/compond-SA/about.md' },
|
|
||||||
{ text: 'Состав сервиса', link: '/security/Cloud-SA/compond-SA/compond-SA.md' },
|
|
||||||
{ text: 'Настройки сервиса по умолчанию', link: '/security/Cloud-SA/compond-SA/default-service.md' },
|
|
||||||
{ text: 'Почтовый ретранслятор (SMTP relay)', link: '/security/Cloud-SA/compond-SA/mail-relay.md' },
|
|
||||||
{ text: 'Мониторинг работоспособности платформы', link: '/security/Cloud-SA/compond-SA/monitoring.md' },
|
|
||||||
{ text: 'Модули платформы', link: '/security/Cloud-SA/compond-SA/platform-modules.md' },
|
|
||||||
{ text: 'Ограничения платформы', link: '/security/Cloud-SA/compond-SA/restrictions.md' },
|
|
||||||
{ text: 'Отказоустойчивость сервиса', link: '/security/Cloud-SA/compond-SA/stability.md' },
|
|
||||||
{ text: 'Шаблоны почтовых сообщений и веб-форм', link: '/security/Cloud-SA/compond-SA/templates.md' },
|
|
||||||
{ text: 'Дополнительные работы ', link: '/security/Cloud-SA/compond-SA/work.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ text: 'Качественные характеристики сервиса', link: '/security/Cloud-SA/characteristics.md' },
|
|
||||||
{ text: 'Инструкции для начала работы с сревисом', link: '/security/Cloud-SA/instructions.md' },
|
|
||||||
{ text: 'Порядок платежей', link: '/security/Cloud-SA/payment-procedure.md' },
|
|
||||||
{ text: 'Сроки и условия предоставления сервиса', link: '/security/Cloud-SA/provision.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Cloud Vulnerability Scanner (VS)', link: '/security/Cloud-VS/VS-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор сервиса VS', link: '/security/Cloud-VS/about.md'},
|
|
||||||
{ text: 'Варианты предоставления сервиса', link: '/security/Cloud-VS/provision-service.md' },
|
|
||||||
{ text: 'Мониторинг работоспособности и отказоустойчивость сервиса', link: '/security/Cloud-VS/monitoring.md' },
|
|
||||||
{ text: 'Состав работ', link: '/security/Cloud-VS/scope-work.md' },
|
|
||||||
{ text: 'Дополнительные работы', link: '/security/Cloud-VS/work.md' },
|
|
||||||
{ text: 'Зоны ответсвенности', link: '/security/Cloud-VS/areas-responsibility.md' },
|
|
||||||
{ text: 'Качественные характеристики сервиса', link: '/security/Cloud-VS/characteristics.md' },
|
|
||||||
{ text: 'Сроки предоставления сервиса', link: '/security/Cloud-VS/provision.md' },
|
|
||||||
{ text: 'Порядок платежей', link: '/security/Cloud-VS/payment-procedure.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Cloud Mobile Device Management (MDM)', link: '/security/Cloud-MDM/MDM-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор сервиса', link: '/security/Cloud-MDM/about.md' },
|
|
||||||
{
|
|
||||||
text: 'Описание сервиса MDM', link: '/security/Cloud-MDM/description/description-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Состав сервиса', link: '/security/Cloud-MDM/description/compound.md' },
|
|
||||||
{ text: 'Архитектура сервиса', link: '/security/Cloud-MDM/description/architecture.md' },
|
|
||||||
{ text: 'Зоны ответственности', link: '/security/Cloud-MDM/description/areas-responsibility.md' },
|
|
||||||
{ text: 'Мониторинг работоспособности и отказоустойчивость сервиса', link: '/security/Cloud-MDM/description/monitoring.md' },
|
|
||||||
{ text: 'Дополнительные работы', link: '/security/Cloud-MDM/description/work.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ text: 'Качественные характеристики сервиса', link: '/security/Cloud-MDM/characteristics.md' },
|
|
||||||
{ text: 'Сроки и условия предоставления сервиса', link: '/security/Cloud-MDM/provision.md' },
|
|
||||||
{ text: 'Порядок платежей', link: '/security/Cloud-MDM/payments.md' },
|
|
||||||
{
|
|
||||||
text: 'Инструкции', link: '/security/Cloud-MDM/instructions/index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Инструкции', link: '/security/Cloud-MDM/instructions/instructions.md' },
|
|
||||||
{ text: 'Активация учетной записи', link: '/security/Cloud-MDM/instructions/activation.md' },
|
|
||||||
{ text: 'Режим Device Owner', link: '/security/Cloud-MDM/instructions/device-owner.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Cloud NGFW', link: '/security/Cloud-NGFW/NGFW-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор сервиса', link: '/security/Cloud-NGFW/about.md'},
|
|
||||||
{ text: 'Основные возможности', link: '/security/Cloud-NGFW/possibilities.md' },
|
|
||||||
{ text: 'Спецификация сервиса', link: '/security/Cloud-NGFW/specification.md' },
|
|
||||||
{ text: 'Состав сеервиса', link: '/security/Cloud-NGFW/compound.md' },
|
|
||||||
{ text: 'Сроки и условия предоставления сервиса. Зоны ответственности', link: '/security/Cloud-NGFW/provision.md' },
|
|
||||||
{ text: 'Структура платежей', link: '/security/Cloud-NGFW/payment-structure.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'/start/': [
|
'/start/': [
|
||||||
{
|
{
|
||||||
@@ -247,44 +138,13 @@ export default defineConfig({
|
|||||||
{text: 'Бесплатный период', link: '/start/trial.md'},
|
{text: 'Бесплатный период', link: '/start/trial.md'},
|
||||||
{text: 'Платное использование', link: '/start/organization.md'},
|
{text: 'Платное использование', link: '/start/organization.md'},
|
||||||
],
|
],
|
||||||
|
'/ai/': [
|
||||||
'/PaaS/': [
|
{ text: 'AI платформа', link: '/ai/index.md' },
|
||||||
{
|
{ text: 'Обзор сервиса', link: '/ai/ai-overview-platform.md' },
|
||||||
text: 'Начало работы в Cloud PostgreSQL', link: '/PaaS/index.md',
|
{ text: 'Быстрый старт', link: '/ai/ai-getting-started.md' },
|
||||||
},
|
{ text: 'Управление сервисом', link: '/ai/ai-setting.md' },
|
||||||
{ text: 'Cloud PostgreSQL', link: '/PaaS/PostgreSQL/PostgreSQL-index.md',
|
{ text: 'Чат с LLM', link: '/ai/ai-chat-llm.md' },
|
||||||
collapsed: true,
|
{ text: 'Концепции', link: '/ai/ai-glossary.md' },
|
||||||
items: [
|
|
||||||
{text: 'Обзор сервиса', link: '/PaaS/PostgreSQL/about.md'},
|
|
||||||
{text: 'Описание технических параметров', link: '/PaaS/PostgreSQL/cluster-parameter.md'},
|
|
||||||
{text: 'Общая схема подключения', link: '/PaaS/PostgreSQL/connection.md'},
|
|
||||||
{text: 'Возможности пользователя', link: '/PaaS/PostgreSQL/user-capabilities.md'},
|
|
||||||
{text: 'Веб-интерфейс pgAdmin', link: '/PaaS/PostgreSQL/pgadmin.md'},
|
|
||||||
{text: 'Веб-интерфейс Grafana', link: '/PaaS/PostgreSQL/grafana.md'},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{text: 'Параметры конфигурации IPSEC', link: '/PaaS/IPSEC.md'},
|
|
||||||
],
|
|
||||||
|
|
||||||
// '/billing/': [
|
|
||||||
|
|
||||||
// ],
|
|
||||||
'/backups/': [
|
|
||||||
{
|
|
||||||
text: 'Резервное копирование', link: '/backups/index.md',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Обзор сервиса', link: '/backups/backups-overview.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{text: 'О сервисе', link: '/backups/about.md'},
|
|
||||||
{text: 'Квоты и лимиты', link: '/backups/backup-quatos.md'},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{text: 'Резервное копирование виртуальных машин Beeline Cloud', link: '/backups/backup-internal-infra.md'},
|
|
||||||
{text: 'Резервное копирование собственной инфраструктуры в Beeline Cloud', link: '/backups/backup-external-infra.md'},
|
|
||||||
{text: 'Каталог резервных копий', link: '/backups/view-backups.md'},
|
|
||||||
|
|
||||||
],
|
],
|
||||||
'/vdc/': [
|
'/vdc/': [
|
||||||
{
|
{
|
||||||
@@ -294,7 +154,6 @@ export default defineConfig({
|
|||||||
text: 'Обзор сервиса', link: '/vdc/vdc-overview.md',
|
text: 'Обзор сервиса', link: '/vdc/vdc-overview.md',
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
{ text: 'О сервисе', link: '/vdc/vdc-about.md' },
|
|
||||||
{ text: 'Техническое описание', link: '/vdc/vdc-tech.md' },
|
{ text: 'Техническое описание', link: '/vdc/vdc-tech.md' },
|
||||||
{ text: 'Квоты и лимиты', link: '/vdc/vdc-quatos.md' },
|
{ text: 'Квоты и лимиты', link: '/vdc/vdc-quatos.md' },
|
||||||
]
|
]
|
||||||
@@ -316,47 +175,21 @@ export default defineConfig({
|
|||||||
items: [
|
items: [
|
||||||
{text: 'Создание ВМ', link: '/vdc/vdc-how-to/vm/create-vm.md'},
|
{text: 'Создание ВМ', link: '/vdc/vdc-how-to/vm/create-vm.md'},
|
||||||
{text: 'Создание vApp', link: '/vdc/vdc-how-to/vm/create-vapp.md'},
|
{text: 'Создание vApp', link: '/vdc/vdc-how-to/vm/create-vapp.md'},
|
||||||
{text: 'Управление состоянием ВМ', link: '/vdc/vdc-how-to/vm/manage-vm.md'},
|
|
||||||
{text: 'Клонирование ВМ', link: '/vdc/vdc-how-to/vm/clone-vm.md'},
|
{text: 'Клонирование ВМ', link: '/vdc/vdc-how-to/vm/clone-vm.md'},
|
||||||
{text: 'Изменение конфигурации ВМ', link: '/vdc/vdc-how-to/vm/edit-vm.md'},
|
{text: 'Изменение конфигурации ВМ', link: '/vdc/vdc-how-to/vm/edit-vm.md'},
|
||||||
{text: 'Удаление ВМ', link: '/vdc/vdc-how-to/vm/delete-vm.md'},
|
{text: 'Удаление ВМ', link: '/vdc/vdc-how-to/vm/delete-vm.md'},
|
||||||
{text: 'Группы размещения', link: '/vdc/vdc-how-to/vm/create-affinity-rules.md'},
|
{text: 'Группы размещения', link: '/vdc/vdc-how-to/vm/create-affinity-rules.md'},
|
||||||
{ text: 'Снимки ВМ', link: '/vdc/vdc-how-to/vm/create-snapshot.md'},
|
{ text: 'Снимки ВМ', link: '/vdc/vdc-how-to/vm/create-snapshot.md'},
|
||||||
{text: 'VMware Tools', link: '/vdc/vdc-how-to/vm/vmware-tools.md'},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{ text: 'Диски', link: '/vdc/vdc-how-to/disks/disks-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{text: 'Обзор', link: '/vdc/vdc-how-to/disks/about.md'},
|
|
||||||
{text: 'Создание диска', link: '/vdc/vdc-how-to/disks/create-disk.md'},
|
|
||||||
{text: 'Проверка состояния диска', link: '/vdc/vdc-how-to/disks/view-disk.md'},
|
|
||||||
{text: 'Управление выделенными дисками', link: '/vdc/vdc-how-to/disks/attach-disk.md'},
|
|
||||||
{text: 'Изменение политики хранения дисков ВМ', link: '/vdc/vdc-how-to/disks/change-storage-policy-of-vm.md'},
|
|
||||||
{text: 'Редактирование параметров диска', link: '/vdc/vdc-how-to/disks/edit-disk.md'},
|
|
||||||
{text: 'Удаление диска', link: '/vdc/vdc-how-to/disks/delete-disk.md'},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{ text: 'Сети', link: '/vdc/vdc-how-to/networks/networks-index.md',
|
{ text: 'Сети', link: '/vdc/vdc-how-to/networks/networks-index.md',
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
{text: 'Обзор', link: '/vdc/vdc-how-to/networks/about.md'},
|
|
||||||
{text: 'Настройка доступа к ВМ из интернета', link: '/vdc/vdc-how-to/networks/allow-external-connections-to-vm.md'},
|
{text: 'Настройка доступа к ВМ из интернета', link: '/vdc/vdc-how-to/networks/allow-external-connections-to-vm.md'},
|
||||||
{text: 'Подключение ВМ в vApp к сети', link: '/vdc/vdc-how-to/networks/connect-vapp-to-network.md'},
|
{text: 'Подключение ВМ в vApp к сети', link: '/vdc/vdc-how-to/networks/connect-vapp-to-network.md'},
|
||||||
{text: 'Подключение ВМ к интернету', link: '/vdc/vdc-how-to/networks/connect-vm-to-network.md'},
|
{text: 'Подключение ВМ к интернету', link: '/vdc/vdc-how-to/networks/connect-vm-to-network.md'},
|
||||||
{text: 'Создание сети в организации и подключение к Edge Gateway', link: '/vdc/vdc-how-to/networks/create-network.md'},
|
{text: 'Создание сети в организации и подключение к Edge Gateway', link: '/vdc/vdc-how-to/networks/create-network.md'},
|
||||||
{text: 'Подключение сети к Edge Gateway', link: '/vdc/vdc-how-to/networks/connect-to-edge-gateway.md'},
|
{text: 'Подключение сети к Edge Gateway', link: '/vdc/vdc-how-to/networks/isolated-to-routed.md'},
|
||||||
{text: 'Создание Pre-Shared Key', link: '/vdc/vdc-how-to/networks/create-psk.md'},
|
|
||||||
{ text: 'Настройка site-to-site подключения с помощью IPSec', link: '/vdc/vdc-how-to/networks/how-to-setup-ipsec-vpn.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{text: 'Настройка IPSec VPN', link: '/vdc/vdc-how-to/networks/ipsec/setup-ipsec-vpn.md'},
|
|
||||||
{text: 'Настройка ASAv', link: '/vdc/vdc-how-to/networks/ipsec/asav.md'},
|
|
||||||
{text: 'Настройка CSR 1000v', link: '/vdc/vdc-how-to/networks/ipsec/csr1000v.md'},
|
|
||||||
{text: 'Настройка Fortigate', link: '/vdc/vdc-how-to/networks/ipsec/fortigate.md'},
|
|
||||||
{text: 'Проверить сетевую связанность', link: '/vdc/vdc-how-to/networks/ipsec/check-vpn-status.md'},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{ text: 'Пользователи и роли', link: '/vdc/vdc-how-to/users/users-index.md',
|
{ text: 'Пользователи и роли', link: '/vdc/vdc-how-to/users/users-index.md',
|
||||||
@@ -382,58 +215,25 @@ export default defineConfig({
|
|||||||
{
|
{
|
||||||
text: 'Виртуальные машины', link: '/compute/index.md',
|
text: 'Виртуальные машины', link: '/compute/index.md',
|
||||||
},
|
},
|
||||||
{ text: 'Обзор сервиса', link: '/compute/compute-overview-index.md' ,
|
{ text: 'Обзор сервиса', link: '/compute/compute-overview.md' },
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Техническое описание', link: '/compute/compute-overview.md' },
|
|
||||||
{ text: 'Квоты и лимиты', link: '/compute/compute-quatos.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{text: 'Быстрый старт', link: '/compute/compute-getting-started.md'},
|
{text: 'Быстрый старт', link: '/compute/compute-getting-started.md'},
|
||||||
{ text: 'Виртуальные машины', link: '/compute/compute-how-to/compute-index.md',
|
{ text: 'Виртуальные машины', link: '/compute/compute-how-to/compute-index.md',
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
{ text: 'Создание ВМ', link: '/compute/compute-how-to/compute-servers-create.md' },
|
{ text: 'Создание ВМ', link: '/compute/compute-how-to/compute-servers-create.md' },
|
||||||
{ text: 'Создание ВМ джамп-хоста', link: '/compute/compute-how-to/compute-servers-jump-create.md' },
|
|
||||||
{ text: 'Подключение к ВМ', link: '/compute/compute-how-to/compute-connect-index.md',
|
{ text: 'Подключение к ВМ', link: '/compute/compute-how-to/compute-connect-index.md',
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
{ text: 'Подключение по SSH по внешнему IP-адресу с помощью ключевой пары', link: '/compute/compute-how-to/compute-connect-public.md'},
|
{ text: 'Подключение по SSH к ВМ по внешнему IP-адресу', link: '/compute/compute-how-to/compute-connect-public.md'},
|
||||||
{ text: 'Подключение по SSH по внутреннему IP-адресу с помощью ключевой пары', link: '/compute/compute-how-to/compute-connect-inside.md' },
|
{ text: 'Подключение по SSH к ВМ по внутреннему IP-адресу', link: '/compute/compute-how-to/compute-connect-inside.md' },
|
||||||
{ text: 'Подключение по SSH по логину и паролю', link: '/compute/compute-how-to/compute-connect-pwd.md' },
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ text: 'Управление ВМ', link: '/compute/compute-how-to/compute-servers-manage.md' },
|
{ text: 'Управление ВМ', link: '/compute/compute-how-to/compute-servers-manage.md' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{ text: 'Диски', link: '/compute/compute-how-to/compute-disks/compute-disk-index.md',
|
{ text: 'Диски', link: '/compute/compute-how-to/compute-disks.md' },
|
||||||
collapsed: true,
|
{ text: 'IP-адреса', link: '/compute/compute-how-to/compute-ip.md' },
|
||||||
items: [
|
{ text: 'Группы размещения', link: '/compute/compute-how-to/compute-affinity.md' },
|
||||||
{ text: 'Обзор', link: '/compute/compute-how-to/compute-disks/compute-disk-about.md' },
|
|
||||||
{ text: 'Создание диска', link: '/compute/compute-how-to/compute-disks/compute-disk-create.md' },
|
|
||||||
{ text: 'Управление дисками', link: '/compute/compute-how-to/compute-disks/compute-disk-manage.md' },
|
|
||||||
{ text: 'Удаление диска', link: '/compute/compute-how-to/compute-disks/compute-disk-del.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ text: 'IP-адреса', link: '/compute/compute-how-to/compute-ip/compute-ip-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор', link: '/compute/compute-how-to/compute-ip/compute-ip-about.md' },
|
|
||||||
{ text: 'Просмотр IP-адресов', link: '/compute/compute-how-to/compute-ip/compute-ip-view.md' },
|
|
||||||
{ text: 'Создание IP-адреса', link: '/compute/compute-how-to/compute-ip/compute-ip-create.md' },
|
|
||||||
{ text: 'Управление IP-адресами', link: '/compute/compute-how-to/compute-ip/compute-ip-manager.md' },
|
|
||||||
{ text: 'Удаление IP-адреса', link: '/compute/compute-how-to/compute-ip/compute-ip-del.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ text: 'Группы размещения', link: '/compute/compute-how-to/compute-placement-groups/compute-placement-groups-index.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Обзор', link: '/compute/compute-how-to/compute-placement-groups/compute-placement-groups-about.md'},
|
|
||||||
{ text: 'Создание группы размещения', link: '/compute/compute-how-to/compute-placement-groups/compute-placement-groups-create.md'},
|
|
||||||
{ text: 'Управление группами размещения', link: '/compute/compute-how-to/compute-placement-groups/compute-placement-groups-manager.md' },
|
|
||||||
{ text: 'Удаление группы размещения', link: '/compute/compute-how-to/compute-placement-groups/compute-placement-groups-del.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ text: 'Сети', link: '/compute/compute-how-to/compute-network/compute-network-index.md',
|
{ text: 'Сети', link: '/compute/compute-how-to/compute-network/compute-network-index.md',
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
@@ -448,36 +248,26 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
{text: 'Управление ключевыми парами', link: '/admin/ssh.md'},
|
{text: 'Управление ключевыми парами', link: '/admin/ssh.md'},
|
||||||
],
|
],
|
||||||
'/vdi/': [
|
'/billing/': [
|
||||||
{
|
{ text: 'Биллинг', link: '/billing/about.md',
|
||||||
text: 'Виртуальные рабочие столы', link: '/vdi/index.md',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Обзор сервиса', link: '/vdi/vdi-overview.md',
|
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
items: [
|
items: [
|
||||||
{ text: 'О сервисе', link: '/vdi/vdi-about.md' },
|
{ text: 'Аналитика потребления', link: '/billing/usage-analytics.md' },
|
||||||
{ text: 'Техническое описание', link: '/vdi/vdi-tech.md' },
|
],
|
||||||
{ text: 'Квоты и лимиты', link: '/vdi/vdi-quatos.md' },
|
|
||||||
{ text: 'Тарификация', link: '/vdi/vdi-tarif.md' },
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
|
],
|
||||||
|
'/concepts/': [
|
||||||
|
{text: 'Виртуальные дата-центры', link: '/concepts/datacenters.md'},
|
||||||
|
{text: 'DNS', link: '/concepts/dns.md'},
|
||||||
|
{text: 'Edge Gateway', link: '/concepts/edge-gateway.md'},
|
||||||
|
{text: 'NAT', link: '/concepts/nat.md'},
|
||||||
|
{text: 'Типы сетей в vDC', link: '/concepts/network-types.md'},
|
||||||
|
{text: 'Ролевая модель', link: '/concepts/roles.md'},
|
||||||
|
{text: 'vApp', link: '/concepts/vApp.md'},
|
||||||
|
],
|
||||||
|
'/monitoring/': [
|
||||||
{
|
{
|
||||||
text: 'Заказ виртуальных рабочих столов', link: '/vdi/vdi-how-to/vdi-create.md'
|
text: 'Мониторинг', link: '/monitoring/about.md',
|
||||||
},
|
|
||||||
{
|
|
||||||
text: 'Настройка сервиса', link: '/vdi/vdi-how-to/vdi-nastroika.md',
|
|
||||||
collapsed: true,
|
|
||||||
items: [
|
|
||||||
{ text: 'Настройка интеграции с Active Directory', link: '/vdi/vdi-how-to/vdi-connect-to-ad.md' },
|
|
||||||
{ text: 'Настройка сети', link: '/vdi/vdi-how-to/vdi-interconnect.md' },
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// text: 'Gold-образ', link: '/vdi/vdi-how-to/vdi-gold.md'
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
text: 'Подключение к виртуальному рабочему месту', link: '/vdi/vdi-how-to/vdi-connect.md'
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -54,12 +54,10 @@ const pageName = computed(() =>
|
|||||||
<div class="content-container">
|
<div class="content-container">
|
||||||
<slot name="doc-before" />
|
<slot name="doc-before" />
|
||||||
<main class="main">
|
<main class="main">
|
||||||
<div class="vp-doc" :class="[
|
<Content class="vp-doc" :class="[
|
||||||
pageName,
|
pageName,
|
||||||
theme.externalLinkIcon && 'external-link-icon-enabled'
|
theme.externalLinkIcon && 'external-link-icon-enabled'
|
||||||
]">
|
]" />
|
||||||
<Content />
|
|
||||||
</div>
|
|
||||||
<SectionLinkList v-if="frontmatter.section_links" :links="frontmatter.section_links" />
|
<SectionLinkList v-if="frontmatter.section_links" :links="frontmatter.section_links" />
|
||||||
</main>
|
</main>
|
||||||
<VPDocFooter>
|
<VPDocFooter>
|
||||||
@@ -76,7 +74,7 @@ const pageName = computed(() =>
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@use '@/scss/helpers/media';
|
@use 'src/assets/scss/app/helpers/media';
|
||||||
|
|
||||||
.VPDoc {
|
.VPDoc {
|
||||||
padding: 32px 24px 96px;
|
padding: 32px 24px 96px;
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import { usePrevNext } from 'vitepress/dist/client/theme-default/composables/pre
|
|||||||
import VPIconEdit from 'vitepress/dist/client/theme-default/components/icons/VPIconEdit.vue'
|
import VPIconEdit from 'vitepress/dist/client/theme-default/components/icons/VPIconEdit.vue'
|
||||||
import VPLink from 'vitepress/dist/client/theme-default/components/VPLink.vue'
|
import VPLink from 'vitepress/dist/client/theme-default/components/VPLink.vue'
|
||||||
import VPDocFooterLastUpdated from 'vitepress/dist/client/theme-default/components/VPDocFooterLastUpdated.vue'
|
import VPDocFooterLastUpdated from 'vitepress/dist/client/theme-default/components/VPDocFooterLastUpdated.vue'
|
||||||
import CustomIcon from './CustomIcon.vue'
|
|
||||||
import { Icons } from '@beeline/design-tokens/js/iconfont/icons'
|
|
||||||
|
|
||||||
const { theme, page, frontmatter } = useData()
|
const { theme, page, frontmatter } = useData()
|
||||||
|
|
||||||
@@ -45,14 +43,14 @@ const showFooter = computed(() => {
|
|||||||
<nav v-if="control.prev?.link || control.next?.link" class="prev-next">
|
<nav v-if="control.prev?.link || control.next?.link" class="prev-next">
|
||||||
<div class="pager">
|
<div class="pager">
|
||||||
<VPLink v-if="control.prev?.link" class="pager-link prev" :href="control.prev.link">
|
<VPLink v-if="control.prev?.link" class="pager-link prev" :href="control.prev.link">
|
||||||
<CustomIcon class="desc-prev" :icon="Icons.ArrowRight" />
|
<span class="desc" v-html="theme.docFooter?.prev || 'Previous page'"></span>
|
||||||
<span class="title" v-html="control.prev.text"></span>
|
<span class="title" v-html="control.prev.text"></span>
|
||||||
</VPLink>
|
</VPLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="pager">
|
<div class="pager">
|
||||||
<VPLink v-if="control.next?.link" class="pager-link next" :href="control.next.link">
|
<VPLink v-if="control.next?.link" class="pager-link next" :href="control.next.link">
|
||||||
|
<span class="desc" v-html="theme.docFooter?.next || 'Next page'"></span>
|
||||||
<span class="title" v-html="control.next.text"></span>
|
<span class="title" v-html="control.next.text"></span>
|
||||||
<CustomIcon class="desc-next" :icon="Icons.ArrowRight" />
|
|
||||||
</VPLink>
|
</VPLink>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -61,7 +59,7 @@ const showFooter = computed(() => {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.VPDocFooter {
|
.VPDocFooter {
|
||||||
margin-top: 40px;
|
margin-top: 64px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.edit-info {
|
.edit-info {
|
||||||
@@ -100,6 +98,8 @@ const showFooter = computed(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.prev-next {
|
.prev-next {
|
||||||
|
border-top: 1px solid var(--vp-c-divider);
|
||||||
|
padding-top: 24px;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-row-gap: 8px;
|
grid-row-gap: 8px;
|
||||||
}
|
}
|
||||||
@@ -115,19 +115,10 @@ const showFooter = computed(() => {
|
|||||||
display: block;
|
display: block;
|
||||||
border: 1px solid var(--vp-c-divider);
|
border: 1px solid var(--vp-c-divider);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 10px 16px 10px 12px;
|
padding: 11px 16px 13px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
transition: border-color 0.25s;
|
transition: border-color 0.25s;
|
||||||
display: flex;
|
|
||||||
gap: 8px;
|
|
||||||
|
|
||||||
color: #1a73e8;
|
|
||||||
|
|
||||||
&.next {
|
|
||||||
padding: 10px 12px 10px 16px;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pager-link:hover {
|
.pager-link:hover {
|
||||||
@@ -145,14 +136,6 @@ const showFooter = computed(() => {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: var(--vp-c-text-2);
|
color: var(--vp-c-text-2);
|
||||||
|
|
||||||
&-next {
|
|
||||||
rotate: -270deg;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-prev {
|
|
||||||
rotate: -90deg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ import { escapeRegExp } from 'vitepress/dist/client/shared'
|
|||||||
import { useData } from 'vitepress/dist/client/theme-default/composables/data'
|
import { useData } from 'vitepress/dist/client/theme-default/composables/data'
|
||||||
import { LRUCache } from 'vitepress/dist/client/theme-default/support/lru'
|
import { LRUCache } from 'vitepress/dist/client/theme-default/support/lru'
|
||||||
import { createSearchTranslate } from 'vitepress/dist/client/theme-default/support/translation'
|
import { createSearchTranslate } from 'vitepress/dist/client/theme-default/support/translation'
|
||||||
import CustomIcon from './CustomIcon.vue';
|
|
||||||
import { Icons } from '@beeline/design-tokens/js/iconfont/icons';
|
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(e: 'close'): void
|
(e: 'close'): void
|
||||||
@@ -498,7 +496,21 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
:title="$t('modal.resetButtonTitle')"
|
:title="$t('modal.resetButtonTitle')"
|
||||||
@click="resetSearch"
|
@click="resetSearch"
|
||||||
>
|
>
|
||||||
<CustomIcon :icon="Icons.Close" size="large" style="padding: 12px 0;" />
|
<svg
|
||||||
|
width="18"
|
||||||
|
height="18"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
d="M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -564,6 +576,12 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
<p class="no-results-text">
|
<p class="no-results-text">
|
||||||
{{ $t('modal.noResultsText') }}
|
{{ $t('modal.noResultsText') }}
|
||||||
</p>
|
</p>
|
||||||
|
<button
|
||||||
|
class="no-results-button"
|
||||||
|
@click="retrySearch(searchIndex, filterText)"
|
||||||
|
>
|
||||||
|
Попробовать еще раз
|
||||||
|
</button>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -592,6 +610,7 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
background: var(--vp-local-search-bg);
|
background: var(--vp-local-search-bg);
|
||||||
width: min(100vw - 60px, 900px);
|
width: min(100vw - 60px, 900px);
|
||||||
height: min-content;
|
height: min-content;
|
||||||
|
max-height: min(100vh - 128px, 900px);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -660,7 +679,7 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.search-actions button {
|
.search-actions button {
|
||||||
padding: 0px;
|
padding: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-actions button:not([disabled]):hover,
|
.search-actions button:not([disabled]):hover,
|
||||||
@@ -709,11 +728,11 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
overscroll-behavior: contain;
|
overscroll-behavior: contain;
|
||||||
|
box-shadow: var(--vp-c-shadow-3);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
border: 1px solid rgba(25, 28, 52, 0.18);
|
border: 1px solid rgba(25, 28, 52, 0.18);
|
||||||
padding: 8px 0;
|
padding: 8px 0;
|
||||||
max-height: min(100vh - 214px, 900px);
|
max-height: min(100vh - 214px, 900px);
|
||||||
box-shadow: 0px 6px 38px rgba(0, 0, 0, 0.16), 0px 0px 10px rgba(0, 0, 0, 0.08);
|
|
||||||
|
|
||||||
li:hover {
|
li:hover {
|
||||||
background-color: rgba(25, 28, 52, 0.08);
|
background-color: rgba(25, 28, 52, 0.08);
|
||||||
@@ -726,7 +745,7 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
transition: none;
|
transition: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
min-height: 66px;
|
height: 66px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.result > div {
|
.result > div {
|
||||||
@@ -839,18 +858,17 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
gap: 24px;
|
gap: 24px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
box-shadow: 0px 6px 38px rgba(0, 0, 0, 0.16), 0px 0px 10px rgba(0, 0, 0, 0.08);
|
box-shadow: 0 0 10 0 rgba(0, 0, 0, 0.16);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
border: 1px solid rgba(25, 28, 52, 0.18);
|
border: 1px solid rgba(25, 28, 52, 0.18);
|
||||||
background-color: rgb(255, 255, 255);
|
background-color: rgb(255, 255, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-results-text {
|
.no-results-text {
|
||||||
font-weight: 400;
|
font-weight: 700;
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
letter-spacing: 0.2px;
|
letter-spacing: 0.2px;
|
||||||
color: rgba(25, 28, 52, 0.48);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-results-button {
|
.no-results-button {
|
||||||
@@ -861,7 +879,6 @@ function formMarkRegex(terms: Set<string>) {
|
|||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
letter-spacing: 0.2px;
|
letter-spacing: 0.2px;
|
||||||
color: rgba(9, 11, 22, 0.94);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
|
|||||||
@@ -1,329 +1,11 @@
|
|||||||
@use "@beeline/design-tokens/scss/tokens/globals/colors";
|
|
||||||
@use "@beeline/design-tokens/scss/tokens/themes";
|
|
||||||
@use '@beeline/design-tokens/scss/tokens/themes/theme-variables' as *;
|
|
||||||
|
|
||||||
.custom-block {
|
.custom-block {
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
|
|
||||||
&-title {
|
&-title {
|
||||||
font-size: 17px !important;
|
font-size: 18px;
|
||||||
line-height: 22px !important;
|
line-height: 22px;
|
||||||
font-weight: 700 !important;
|
font-weight: 500;
|
||||||
letter-spacing: .2px !important;
|
letter-spacing: .2px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.tip a {
|
|
||||||
color: #1a73e8;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #1a73e8;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block {
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 24px 24px 24px 64px;
|
|
||||||
line-height: 24px;
|
|
||||||
font-size: var(--vp-custom-block-font-size);
|
|
||||||
color: var(--vp-c-text-2);
|
|
||||||
|
|
||||||
&.custom-block.details {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.info {
|
|
||||||
border-color: var(--vp-custom-block-info-border);
|
|
||||||
color: var(--vp-custom-block-info-text);
|
|
||||||
background-color: var(--vp-custom-block-info-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.info a,
|
|
||||||
.custom-block.info code {
|
|
||||||
color: var(--vp-c-brand-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.info a:hover,
|
|
||||||
.custom-block.info a:hover > code {
|
|
||||||
color: var(--vp-c-brand-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.info code {
|
|
||||||
background-color: var(--vp-custom-block-info-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.note {
|
|
||||||
border-color: var(--vp-custom-block-note-border);
|
|
||||||
color: var(--vp-custom-block-note-text);
|
|
||||||
background-color: var(--vp-custom-block-note-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.note a,
|
|
||||||
.custom-block.note code {
|
|
||||||
color: var(--vp-c-brand-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.note a:hover,
|
|
||||||
.custom-block.note a:hover > code {
|
|
||||||
color: var(--vp-c-brand-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.note code {
|
|
||||||
background-color: var(--vp-custom-block-note-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.tip {
|
|
||||||
border-color: var(--vp-custom-block-tip-border);
|
|
||||||
color: var(--vp-custom-block-tip-text);
|
|
||||||
background-color: var(--vp-custom-block-tip-bg);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
background-image: var(--vp-icon-clock);
|
|
||||||
position: absolute;
|
|
||||||
left: 24px;
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.tip a,
|
|
||||||
.custom-block.tip code {
|
|
||||||
color: var(--vp-c-tip-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.tip a:hover,
|
|
||||||
.custom-block.tip a:hover > code {
|
|
||||||
color: var(--vp-c-tip-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.tip code {
|
|
||||||
background-color: var(--vp-custom-block-tip-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.important {
|
|
||||||
border-color: var(--vp-custom-block-important-border);
|
|
||||||
color: var(--vp-custom-block-important-text);
|
|
||||||
background-color: var(--vp-custom-block-important-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.important a,
|
|
||||||
.custom-block.important code {
|
|
||||||
color: var(--vp-c-important-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.important a:hover,
|
|
||||||
.custom-block.important a:hover > code {
|
|
||||||
color: var(--vp-c-important-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.important code {
|
|
||||||
background-color: var(--vp-custom-block-important-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.warning {
|
|
||||||
border-color: var(--vp-custom-block-warning-border);
|
|
||||||
color: var(--vp-custom-block-warning-text);
|
|
||||||
background-color: var(--vp-custom-block-warning-bg);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
background-image: var(--vp-icon-info-circled);
|
|
||||||
position: absolute;
|
|
||||||
left: 24px;
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.warning a,
|
|
||||||
.custom-block.warning code {
|
|
||||||
color: $color-text-link;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.warning a:hover,
|
|
||||||
.custom-block.warning a:hover > code {
|
|
||||||
color: $color-text-link;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.warning code {
|
|
||||||
background-color: var(--vp-custom-block-warning-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.danger {
|
|
||||||
border-color: var(--vp-custom-block-danger-border);
|
|
||||||
color: var(--vp-custom-block-danger-text);
|
|
||||||
background-color: var(--vp-custom-block-danger-bg);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
background-image: var(--vp-icon-warning-triangle);
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
left: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.danger a,
|
|
||||||
.custom-block.danger code {
|
|
||||||
color: var(--vp-c-danger-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.danger a:hover,
|
|
||||||
.custom-block.danger a:hover > code {
|
|
||||||
color: var(--vp-c-danger-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.danger code {
|
|
||||||
background-color: var(--vp-custom-block-danger-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.caution {
|
|
||||||
border-color: var(--vp-custom-block-caution-border);
|
|
||||||
color: var(--vp-custom-block-caution-text);
|
|
||||||
background-color: var(--vp-custom-block-caution-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.caution a,
|
|
||||||
.custom-block.caution code {
|
|
||||||
color: var(--vp-c-caution-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.caution a:hover,
|
|
||||||
.custom-block.caution a:hover > code {
|
|
||||||
color: var(--vp-c-caution-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.caution code {
|
|
||||||
background-color: var(--vp-custom-block-caution-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details {
|
|
||||||
border-color: var(--vp-custom-block-details-border);
|
|
||||||
color: var(--vp-custom-block-details-text);
|
|
||||||
background-color: transparent;
|
|
||||||
border-radius: 12px;
|
|
||||||
border: 1px solid $color-border;
|
|
||||||
|
|
||||||
pre {
|
|
||||||
border: none !important;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
margin: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:open {
|
|
||||||
&.custom-block.details summary {
|
|
||||||
background-color: $color-background-base-hover;
|
|
||||||
border-top-left-radius: 12px;
|
|
||||||
border-top-right-radius: 12px;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
background-image: var(--vp-icon-nav-arrow-up);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details a {
|
|
||||||
color: var(--vp-c-brand-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details a:hover,
|
|
||||||
.custom-block.details a:hover > code {
|
|
||||||
color: var(--vp-c-brand-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details code {
|
|
||||||
background-color: var(--vp-custom-block-details-code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block-title {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block p + p {
|
|
||||||
margin: 8px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details summary {
|
|
||||||
margin: 0;
|
|
||||||
padding: 24px;
|
|
||||||
font-weight: 500;
|
|
||||||
cursor: pointer;
|
|
||||||
user-select: none;
|
|
||||||
font-size: 19px;
|
|
||||||
line-height: 24px;
|
|
||||||
letter-spacing: 0.2px;
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
position: absolute;
|
|
||||||
right: 24px;
|
|
||||||
content: '';
|
|
||||||
background-image: var(--vp-icon-nav-arrow-down);
|
|
||||||
height: 24px;
|
|
||||||
width: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details {
|
|
||||||
h1, h2, h3, h4, h5, ul, p {
|
|
||||||
margin: 0 24px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 24px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
margin-top: 24px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ol {
|
|
||||||
padding: 0 24px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 24px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
margin-top: 24px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.details summary + p {
|
|
||||||
padding: 24px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block a {
|
|
||||||
color: inherit;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: underline;
|
|
||||||
text-underline-offset: 2px;
|
|
||||||
transition: opacity 0.25s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block a:hover {
|
|
||||||
opacity: 0.75;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block code {
|
|
||||||
font-size: var(--vp-custom-block-code-font-size);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-block.custom-block th,
|
|
||||||
.custom-block.custom-block blockquote > p {
|
|
||||||
font-size: var(--vp-custom-block-font-size);
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
.VPDocAside {
|
.VPDocAside {
|
||||||
.outline-link {
|
.outline-link {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 15px;
|
font-size: 17px;
|
||||||
line-height: 18px;
|
line-height: 22px;
|
||||||
letter-spacing: 0.2px;
|
letter-spacing: 0.2px;
|
||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
@@ -19,11 +19,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.outline-title {
|
.outline-title {
|
||||||
font-size: 15px;
|
font-size: 17px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 18px;
|
line-height: 22px;
|
||||||
padding-bottom: 16px;
|
padding-bottom: 16px;
|
||||||
color: colors.$color-text-black-active;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
@use "@beeline/design-tokens/scss/tokens/globals/colors";
|
@use "@beeline/design-tokens/scss/tokens/globals/colors";
|
||||||
@use "@beeline/design-tokens/scss/tokens/themes";
|
@use "@beeline/design-tokens/scss/tokens/themes";
|
||||||
@use '@beeline/design-tokens/scss/tokens/themes/theme-variables' as *;
|
|
||||||
|
|
||||||
@mixin font_style($fontSize, $fontWeight, $lineHeight, $letterSpacing) {
|
@mixin font_style($fontSize, $fontWeight, $lineHeight, $letterSpacing) {
|
||||||
font-size: $fontSize;
|
font-size: $fontSize;
|
||||||
@@ -24,13 +23,13 @@
|
|||||||
|
|
||||||
// Titles
|
// Titles
|
||||||
h1 {
|
h1 {
|
||||||
@include font_style(44px, 500, 56px, 0.3px);
|
@include font_style(44px, 500, 46px, 0.3px);
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@include font_style(26px, 500, 32px, 0.2px);
|
@include font_style(34px, 400, 36px, 0.3px);
|
||||||
margin: 40px 0 24px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
@@ -53,8 +52,8 @@
|
|||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
counter-reset: list;
|
counter-reset: list;
|
||||||
margin: 0 0 0 50px;
|
margin: 0 0 0 50px;
|
||||||
padding: 0;
|
padding: 0 0 5px 0;
|
||||||
font-size: 15px;
|
font-size: 16px;
|
||||||
|
|
||||||
& > * + * {
|
& > * + * {
|
||||||
margin-top: 50px;
|
margin-top: 50px;
|
||||||
@@ -65,29 +64,18 @@
|
|||||||
|
|
||||||
ol li {
|
ol li {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 8px 0 0 0;
|
padding: 5px 0 0 0;
|
||||||
line-height: 18px;
|
line-height: 1.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
li + li {
|
li + li {
|
||||||
margin-top: 30px;
|
margin-top: 34px;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul li {
|
ul li {
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
@include font_style(15px, 400, 18px, 0.2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
ol li:nth-last-of-type(n+2)::after {
|
|
||||||
content: '';
|
|
||||||
border-left: 1px solid rgb(201, 197, 197);
|
|
||||||
position: absolute;
|
|
||||||
line-height: 100%;
|
|
||||||
left: -30px;
|
|
||||||
top: 43px;
|
|
||||||
bottom: -25px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ol li::before {
|
ol li::before {
|
||||||
@@ -101,7 +89,9 @@
|
|||||||
height: 35px;
|
height: 35px;
|
||||||
background-color: colors.$color-background-brand;
|
background-color: colors.$color-background-brand;
|
||||||
color: themes.$color-text-active;
|
color: themes.$color-text-active;
|
||||||
@include font_style(15px, 400, 18px, 0.2px);
|
text-align: center;
|
||||||
|
line-height: 25px;
|
||||||
|
font-size: 16px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -118,27 +108,21 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ol li:last-child {
|
ol li:last-child, ul li:last-child {
|
||||||
margin-bottom: 40px;
|
margin-bottom: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul li:last-child {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol li p {
|
ol li p {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@include font_style(15px, 400, 18px, 0.2px);
|
line-height: 22px;
|
||||||
margin: 24px 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Links
|
// Links
|
||||||
a {
|
a {
|
||||||
color: #1a73e8;
|
color: #1a73e8;
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:hover, &:focus-visible, &:focus, &:active {
|
&:hover, &:focus-visible, &:focus, &:active {
|
||||||
color: #1a73e8;
|
color: #1a73e8;
|
||||||
@@ -149,418 +133,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tabs
|
|
||||||
.plugin-tabs {
|
|
||||||
border-radius: 12px;
|
|
||||||
border: 1px solid $color-border;
|
|
||||||
background-color: revert-layer !important;
|
|
||||||
|
|
||||||
&--tab {
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--content {
|
|
||||||
padding: 24px !important;
|
|
||||||
|
|
||||||
.language- {
|
|
||||||
border: none;
|
|
||||||
padding: 0px !important;
|
|
||||||
overflow-y: hidden !important;
|
|
||||||
overflow-x: hidden !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Code
|
|
||||||
.vp-doc :not(pre, h1, h2, h3, h4, h5, h6) > code {
|
|
||||||
font-size: var(--vp-code-font-size);
|
|
||||||
color: var(--vp-code-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc :not(pre) > code {
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 3px 6px;
|
|
||||||
background-color: var(--vp-code-bg);
|
|
||||||
transition:
|
|
||||||
color 0.25s,
|
|
||||||
background-color 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc a > code {
|
|
||||||
color: var(--vp-code-link-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc a:hover > code {
|
|
||||||
color: var(--vp-code-link-hover-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc h1 > code,
|
|
||||||
.vp-doc h2 > code,
|
|
||||||
.vp-doc h3 > code {
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc div[class*='language-'],
|
|
||||||
.vp-block {
|
|
||||||
position: relative;
|
|
||||||
margin: 16px -24px;
|
|
||||||
background-color: transparent;
|
|
||||||
overflow-x: auto;
|
|
||||||
transition: background-color 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 640px) {
|
|
||||||
.vp-doc div[class*='language-'],
|
|
||||||
.vp-block {
|
|
||||||
border-radius: 12px;
|
|
||||||
margin: 16px 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 639px) {
|
|
||||||
.vp-doc li div[class*='language-'] {
|
|
||||||
border-radius: 8px 0 0 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc div[class*='language-'] + div[class*='language-'],
|
|
||||||
.vp-doc div[class$='-api'] + div[class*='language-'],
|
|
||||||
.vp-doc div[class*='language-'] + div[class$='-api'] > div[class*='language-'] {
|
|
||||||
margin-top: -8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] pre,
|
|
||||||
.vp-doc [class*='language-'] code {
|
|
||||||
/*rtl:ignore*/
|
|
||||||
direction: ltr;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
text-align: left;
|
|
||||||
white-space: pre;
|
|
||||||
word-spacing: normal;
|
|
||||||
word-break: normal;
|
|
||||||
word-wrap: normal;
|
|
||||||
-moz-tab-size: 4;
|
|
||||||
-o-tab-size: 4;
|
|
||||||
tab-size: 4;
|
|
||||||
-webkit-hyphens: none;
|
|
||||||
-moz-hyphens: none;
|
|
||||||
-ms-hyphens: none;
|
|
||||||
hyphens: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] pre {
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
margin: 0;
|
|
||||||
padding: 24px;
|
|
||||||
overflow-x: auto;
|
|
||||||
border-radius: 12px;
|
|
||||||
border: 1px solid $color-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code {
|
|
||||||
display: block;
|
|
||||||
padding: 0px;
|
|
||||||
width: fit-content;
|
|
||||||
min-width: 100%;
|
|
||||||
line-height: var(--vp-code-line-height);
|
|
||||||
font-size: var(--vp-code-font-size);
|
|
||||||
color: var(--vp-code-color);
|
|
||||||
transition: color 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .highlighted {
|
|
||||||
background-color: var(--vp-code-line-highlight-color);
|
|
||||||
transition: background-color 0.5s;
|
|
||||||
margin: 0 -24px;
|
|
||||||
padding: 0 24px;
|
|
||||||
width: calc(100% + 2 * 24px);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .highlighted.error {
|
|
||||||
background-color: var(--vp-code-line-error-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .highlighted.warning {
|
|
||||||
background-color: var(--vp-code-line-warning-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff {
|
|
||||||
transition: background-color 0.5s;
|
|
||||||
margin: 0 -24px;
|
|
||||||
padding: 0 24px;
|
|
||||||
width: calc(100% + 2 * 24px);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff::before {
|
|
||||||
position: absolute;
|
|
||||||
left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] .has-focused-lines .line:not(.has-focus) {
|
|
||||||
filter: blur(0.095rem);
|
|
||||||
opacity: 0.4;
|
|
||||||
transition:
|
|
||||||
filter 0.35s,
|
|
||||||
opacity 0.35s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] .has-focused-lines .line:not(.has-focus) {
|
|
||||||
opacity: 0.7;
|
|
||||||
transition:
|
|
||||||
filter 0.35s,
|
|
||||||
opacity 0.35s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-']:hover .has-focused-lines .line:not(.has-focus) {
|
|
||||||
filter: blur(0);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff.remove {
|
|
||||||
background-color: var(--vp-code-line-diff-remove-color);
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff.remove::before {
|
|
||||||
content: '-';
|
|
||||||
color: var(--vp-code-line-diff-remove-symbol-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff.add {
|
|
||||||
background-color: var(--vp-code-line-diff-add-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] code .diff.add::before {
|
|
||||||
content: '+';
|
|
||||||
color: var(--vp-code-line-diff-add-symbol-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc div[class*='language-'].line-numbers-mode {
|
|
||||||
/*rtl:ignore*/
|
|
||||||
padding-left: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .line-numbers-wrapper {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
left: 0;
|
|
||||||
z-index: 3;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
border-right: 1px solid var(--vp-code-block-divider-color);
|
|
||||||
padding-top: 20px;
|
|
||||||
width: 32px;
|
|
||||||
text-align: center;
|
|
||||||
font-family: var(--vp-font-family-mono);
|
|
||||||
line-height: var(--vp-code-line-height);
|
|
||||||
font-size: var(--vp-code-font-size);
|
|
||||||
color: var(--vp-code-line-number-color);
|
|
||||||
transition:
|
|
||||||
border-color 0.5s,
|
|
||||||
color 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] > button.copy {
|
|
||||||
/*rtl:ignore*/
|
|
||||||
direction: ltr;
|
|
||||||
position: absolute;
|
|
||||||
top: 12px;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
right: 12px;
|
|
||||||
z-index: 3;
|
|
||||||
border: none;
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
background-color: transparent;
|
|
||||||
opacity: 1;
|
|
||||||
cursor: pointer;
|
|
||||||
background-image: var(--vp-icon-copy);
|
|
||||||
background-position: 50%;
|
|
||||||
background-size: 20px;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
transition:
|
|
||||||
border-color 0.25s,
|
|
||||||
background-color 0.25s,
|
|
||||||
opacity 0.25s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-']:hover > button.copy,
|
|
||||||
.vp-doc [class*='language-'] > button.copy:focus {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] > button.copy:hover,
|
|
||||||
.vp-doc [class*='language-'] > button.copy.copied {
|
|
||||||
border: none;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] > button.copy.copied,
|
|
||||||
.vp-doc [class*='language-'] > button.copy:hover.copied {
|
|
||||||
/*rtl:ignore*/
|
|
||||||
background-color: transparent;
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] > button.copy.copied::before,
|
|
||||||
.vp-doc [class*='language-'] > button.copy:hover.copied::before {
|
|
||||||
position: relative;
|
|
||||||
top: -1px;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
transform: translateX(calc(-100% - 1px));
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
border: none;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
border-right: 0;
|
|
||||||
padding: 0 10px;
|
|
||||||
width: fit-content;
|
|
||||||
height: 40px;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: var(--vp-code-copy-code-active-text);
|
|
||||||
white-space: nowrap;
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-'] > span.lang {
|
|
||||||
position: absolute;
|
|
||||||
top: 2px;
|
|
||||||
/*rtl:ignore*/
|
|
||||||
right: 8px;
|
|
||||||
z-index: 2;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: var(--vp-code-lang-color);
|
|
||||||
transition:
|
|
||||||
color 0.4s,
|
|
||||||
opacity 0.4s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc [class*='language-']:hover > button.copy + span.lang,
|
|
||||||
.vp-doc [class*='language-'] > button.copy:focus + span.lang {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Banner
|
|
||||||
.vp-doc .custom-block {
|
|
||||||
margin: 40px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block p {
|
|
||||||
margin: 8px 0;
|
|
||||||
line-height: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block p:first-child {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block div[class*='language-'] {
|
|
||||||
margin: 8px 0;
|
|
||||||
border-radius: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block div[class*='language-'] code {
|
|
||||||
font-weight: 400;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block .vp-code-group .tabs {
|
|
||||||
margin: 0;
|
|
||||||
border-radius: 8px 8px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Table
|
|
||||||
.vp-doc table {
|
|
||||||
display: block;
|
|
||||||
border-collapse: collapse;
|
|
||||||
overflow-x: auto;
|
|
||||||
border-radius: 12px;
|
|
||||||
border: 1px solid $color-border;
|
|
||||||
// width: 100%;
|
|
||||||
margin: 24px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc tr {
|
|
||||||
border-top: hidden;
|
|
||||||
transition: background-color 0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc tr:nth-child(2n) {
|
|
||||||
background-color: var(--vp-c-bg-soft);
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc th,
|
|
||||||
.vp-doc td {
|
|
||||||
padding: 18px 16px;
|
|
||||||
padding: 18px 16px;
|
|
||||||
width: 100vh;
|
|
||||||
background-color: var(--vp-c-bg);
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc tbody tr {
|
|
||||||
border-top: 1px solid $color-border;
|
|
||||||
|
|
||||||
&:last-child{
|
|
||||||
border-bottom: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc th {
|
|
||||||
@include font_style(15px, 500, 20px, 0.2px);
|
|
||||||
color: $color-text-active;
|
|
||||||
background-color: var(--vp-c-bg);
|
|
||||||
border-top: 1px solid $color-border;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc td {
|
|
||||||
@include font_style(15px, 400, 18px, 0.2px);
|
|
||||||
padding: 18px 16px;
|
|
||||||
background-color: var(--vp-c-bg);
|
|
||||||
border-right: hidden;
|
|
||||||
border-left: hidden;
|
|
||||||
color: $color-text-active;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block
|
|
||||||
.vp-doc .custom-block {
|
|
||||||
margin: 16px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block p {
|
|
||||||
margin: 8px 0;
|
|
||||||
line-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block p:first-child {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block div[class*='language-'] {
|
|
||||||
margin: 40px 0;
|
|
||||||
border-radius: 12px;
|
|
||||||
|
|
||||||
&.vp-doc .custom-block {
|
|
||||||
margin: 0;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block div[class*='language-'] code {
|
|
||||||
font-weight: 400;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .custom-block .vp-code-group .tabs {
|
|
||||||
margin: 0;
|
|
||||||
border-radius: 8px 8px 0 0;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
@use '@beeline/design-tokens/scss/tokens/components/navigationDrawer';
|
@use '@beeline/design-tokens/scss/tokens/components/navigationDrawer';
|
||||||
@use '@beeline/design-tokens/scss/tokens/themes/theme-variables' as theme;
|
@use '@beeline/design-tokens/scss/tokens/themes/theme-variables' as theme;
|
||||||
@use '@/scss/helpers/media';
|
@use 'src/assets/scss/app/helpers/media';
|
||||||
|
|
||||||
.VPSidebar {
|
.VPSidebar {
|
||||||
--vp-sidebar-bg-color: var(--vp-c-bg);
|
--vp-sidebar-bg-color: var(--vp-c-bg);
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
@use '@beeline/design-tokens/scss/font-face';
|
|
||||||
@use "@beeline/design-tokens/scss/iconfont/iconfont" with (
|
|
||||||
$font-path-iconfont: '../assets/fonts/iconfont'
|
|
||||||
);
|
|
||||||
@use "@beeline/design-tokens/scss/iconfont/icons";
|
|
||||||
@use '@beeline/design-tokens/scss/tokens/themes/dark';
|
@use '@beeline/design-tokens/scss/tokens/themes/dark';
|
||||||
@use '@beeline/design-tokens/scss/tokens/themes';
|
@use '@beeline/design-tokens/scss/tokens/themes';
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
@use "@beeline/design-tokens/scss/iconfont/iconfont" with (
|
||||||
|
$font-path-iconfont: '/fonts/iconfont'
|
||||||
|
);
|
||||||
|
@use "@beeline/design-tokens/scss/iconfont/icons";
|
||||||
|
|
||||||
|
$font-path-beeline-sans: '/fonts/beeline-sans' !default;
|
||||||
|
|
||||||
|
@mixin beeline-sans-font($type, $weight, $style: normal) {
|
||||||
|
@font-face {
|
||||||
|
font-family: "Beeline Sans";
|
||||||
|
src:url('#{$font-path-beeline-sans}/BeelineSans-#{$type}.woff2') format('woff2'),
|
||||||
|
url('#{$font-path-beeline-sans}/BeelineSans-#{$type}.woff') format('woff'),
|
||||||
|
url('#{$font-path-beeline-sans}/BeelineSans-#{$type}.ttf') format('truetype');
|
||||||
|
font-weight: $weight;
|
||||||
|
font-style: $style;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin beeline-sans-font-pair($type, $weight) {
|
||||||
|
@include beeline-sans-font($type, $weight);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@include beeline-sans-font-pair(Regular, 400);
|
||||||
|
|
||||||
|
@include beeline-sans-font-pair(Medium, 500);
|
||||||
|
|
||||||
|
@include beeline-sans-font-pair(Bold, 700);
|
||||||
|
|
||||||
|
@include beeline-sans-font-pair(Black, 900);
|
||||||
|
|
||||||
|
$font-path-roboto-mono: '/fonts/roboto-mono' !default;
|
||||||
|
|
||||||
|
@mixin roboto-mono-font($type, $weight, $style: normal) {
|
||||||
|
@font-face {
|
||||||
|
font-family: "Roboto Mono";
|
||||||
|
src:url('#{$font-path-roboto-mono}/RobotoMono-#{$type}.woff2') format('woff2'),
|
||||||
|
url('#{$font-path-roboto-mono}/RobotoMono-#{$type}.woff') format('woff'),
|
||||||
|
url('#{$font-path-roboto-mono}/RobotoMono-#{$type}.ttf') format('truetype');
|
||||||
|
font-weight: $weight;
|
||||||
|
font-style: $style;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin roboto-mono-font-pair($type, $weight) {
|
||||||
|
@include roboto-mono-font($type, $weight);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@include roboto-mono-font-pair(Light, 300);
|
||||||
|
|
||||||
|
@include roboto-mono-font-pair(Regular, 400);
|
||||||
|
|
||||||
|
@include roboto-mono-font-pair(Medium, 500);
|
||||||
|
|
||||||
|
@include roboto-mono-font-pair(Bold, 700);
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@forward "media";
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
@use "design-tokens";
|
@use "fonts";
|
||||||
|
@use "design-system";
|
||||||
@use "vars";
|
@use "vars";
|
||||||
@use "components";
|
@use "components";
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
|
|
||||||
:root {
|
:root {
|
||||||
--vp-font-family-base: 'Beeline Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
--vp-font-family-base: 'Beeline Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
--vp-font-family-mono: 'JetBrains Mono', monospace;
|
--vp-font-family-mono: 'Roboto Mono', monospace;
|
||||||
|
|
||||||
// Code
|
// Code
|
||||||
// --vp-code-font-size: ;
|
// --vp-code-font-size: ;
|
||||||
@@ -183,18 +183,16 @@
|
|||||||
--vp-custom-block-code-font-size: 17px;
|
--vp-custom-block-code-font-size: 17px;
|
||||||
--vp-custom-block-tip-border: transparent;
|
--vp-custom-block-tip-border: transparent;
|
||||||
--vp-custom-block-tip-text: var(--vp-c-text-1);
|
--vp-custom-block-tip-text: var(--vp-c-text-1);
|
||||||
--vp-custom-block-tip-bg: #f9f9f9;
|
--vp-custom-block-tip-bg: #f1f1f3;
|
||||||
--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
|
--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
|
||||||
--vp-custom-block-warning-bg: #e3f2ff;
|
--vp-custom-block-warning-bg: #fff4e1;
|
||||||
--vp-custom-block-warning-icon: #1a73e8;
|
--vp-custom-block-danger-bg: #ffecef;
|
||||||
--vp-custom-block-danger-bg: #fff4e1;
|
|
||||||
--vp-custom-block-danger-icon: #ff9419;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark {
|
.dark {
|
||||||
--vp-custom-block-warning-bg: #132338;
|
--vp-custom-block-warning-bg: #3d392a;
|
||||||
--vp-custom-block-tip-bg: #36383c;
|
--vp-custom-block-tip-bg: #36383c;
|
||||||
--vp-custom-block-danger-bg: #3d392a;
|
--vp-custom-block-danger-bg: #371313;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -206,11 +204,5 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--vp-icon-copy: url('../../../public/icons/copy.svg');
|
|
||||||
--vp-icon-clock: url('../../../public/icons/clock.svg');
|
|
||||||
--vp-icon-info-circled: url('../../../public/icons/info_circled.svg');
|
|
||||||
--vp-icon-warning-triangle: url('../../../public/icons/warning_triangle.svg');
|
|
||||||
--vp-icon-nav-arrow-down: url('../../../public/icons/nav_arrow_down.svg');
|
|
||||||
--vp-icon-nav-arrow-up: url('../../../public/icons/nav_arrow_up.svg');
|
|
||||||
--vp-sidebar-width: 320px;
|
--vp-sidebar-width: 320px;
|
||||||
}
|
}
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
# Параметры конфигурации IPsec-соединения
|
|
||||||
|
|
||||||
В данном разделе приведены параметры конфигурации IPsec-соединения, используемого для организации защищенного канала связи между инфраструктурой заказчика и кластерами. Материал описывает настройки этапов установки соединения и передачи данных, включая методы аутентификации, алгоритмы шифрования и хеширования, группы Диффи-Хеллмана, а также параметры времени жизни ключей.
|
|
||||||
|
|
||||||
Ниже приведены основные параметры, задаваемые при развертывании кластера Kafka. Часть параметров определяется клиентом на этапе заказа услуги, часть - фиксирована и не подлежит изменению.
|
|
||||||
|
|
||||||
## Данные о конфигурации IPSEC
|
|
||||||
|
|
||||||
Параметры подключения (имя туннеля, устройство, публичный IP-адрес) заполняются вручную на основании информации, предоставленной заказчиком.
|
|
||||||
|
|
||||||
#### Версия IKE (Internet Key Exchange)
|
|
||||||
|
|
||||||
Версия IKE выбирается из выпадающего списка, который содержит в себе два параметра - **v1** и **v2**.
|
|
||||||
|
|
||||||
- **IKE v1** - более ранняя версия протокола;
|
|
||||||
- **IKE v2** - более современная версия (обеспечивает более устойчивое соединение и гибкую обработку ошибок).
|
|
||||||
|
|
||||||
Рекомендуется использовать **IKE v2**, если оборудование заказчика это поддерживает.
|
|
||||||
|
|
||||||
## Метод аутентификации
|
|
||||||
|
|
||||||
Метод аутентификации выбирается вручную из выпадающего списка, который содержит два варианта:
|
|
||||||
|
|
||||||
- **PSK (Pre-Shared Key)** - метод аутентификации, при котором используется заранее согласованный общий ключ;
|
|
||||||
- **Certificate** - аутентификация с использованием цифровых сертификатов.
|
|
||||||
|
|
||||||
## Этап 1 - установка защищенного соединения
|
|
||||||
|
|
||||||
#### Hash
|
|
||||||
|
|
||||||
Определяет алгоритм хеширования **для защиты управляющего канала**.
|
|
||||||
|
|
||||||
Данный параметр заполняется вручную из выпадающего списка следующего содержания:
|
|
||||||
|
|
||||||
- **SHA 1** - Формирует хеш длиной 160 бит, имеет коллизии (уязвимости), в современных системах считается устаревшим, используется только для совместимости со старым оборудованием;
|
|
||||||
- **SHA 2 - 256** - Формирует хеш длиной 256 бит, существенно более устойчив к атакам, оптимальный баланс между безопасностью и производительностью, а также, на сегодняшний день, является стандартом по умолчанию в большинстве систем;
|
|
||||||
- **SHA 2 - 384** - Длина хеша составляет 384 бита, имеет повышенную криптостойкость, требует больше вычислительных ресурсов, чем SHA-1 и SHA 2-256. Используется в средах с повышенными требованиями к безопасности;
|
|
||||||
- **SHA 2 - 512** - Длина хеша составляет 512 бит, осуществляет самый высокий уровень стойкости из перечисленных, а также создает большую нагрузку на процессор. Обычно применяется в системах с повышенными требованиями к криптографии.
|
|
||||||
|
|
||||||
#### Шифрование
|
|
||||||
|
|
||||||
Определяет **алгоритм симметричного шифрования.**
|
|
||||||
|
|
||||||
Данный параметр заполняется вручную из выпадающего списка следующего содержания:
|
|
||||||
|
|
||||||
- **AES 128** - имеет 128-битный ключ, обеспечивает быстрое шифрование, имеет достаточный уровень безопасности для большинства задач;
|
|
||||||
- **AES 256** - имеет 256-битный ключ, обеспечивает более высокую криптостойкость, оказывает немного большую нагрузку на CPU;
|
|
||||||
- **AES GCM 12** / **AES GCM 192** / **AES GCM 256** - данные алгоритмы совмещают шифрование и контроль целостности, обладают более современным режимом работы, считаются более эффективными по производительности, а также рекомендуются в современных конфигурациях. Разница между этими тремя алгоритмами лишь в длине ключа.
|
|
||||||
|
|
||||||
#### DH Group - группа Деффи Хеллмана
|
|
||||||
|
|
||||||
Механизм Diffie-Hellman используется **для безопасной генерации общего секретного ключа** между сторонами туннеля без передачи этого ключа по сети.
|
|
||||||
Чем выше номер группы и длина ключа - тем выше криптографическая стойкость соединения.
|
|
||||||
|
|
||||||
Данный параметр так же содержит в себе выпадающий список, состоящий из следующих значений:
|
|
||||||
- **group 2**;
|
|
||||||
- **group 5**;
|
|
||||||
- **group 14**;
|
|
||||||
- **group 15**;
|
|
||||||
- **group 16**;
|
|
||||||
- **group 19**;
|
|
||||||
- **group 20**;
|
|
||||||
- **group 21**.
|
|
||||||
|
|
||||||
#### IKE Mode (только для IKEv1)
|
|
||||||
|
|
||||||
Параметр IKE Mode **определяет способ установления соединения** на этапе 1 при использовании протокола IKEv1.
|
|
||||||
|
|
||||||
Доступны два режима: **Main** и **Aggressive**. Они отличаются количеством сообщений при установке соединения и уровнем защиты идентификационных данных.
|
|
||||||
- Main Mode - является стандартным и более безопасным режимом работы IKEv1.
|
|
||||||
- Aggressive Mode - упрощённый и ускоренный режим установления соединения. (более низкий уровень защиты данных)
|
|
||||||
|
|
||||||
#### Время жизни
|
|
||||||
|
|
||||||
Определяет, как долго действуют согласованные ключи в рамках первой фазы.
|
|
||||||
|
|
||||||
- Рекомендуемое значение: 86400 секунд (24 часа);
|
|
||||||
- После истечения времени выполняется повторная генерация ключей.
|
|
||||||
|
|
||||||
|
|
||||||
## Этап 2 - передача данных
|
|
||||||
|
|
||||||
Этап 2 IPsec-соединения отвечает за шифрование и защиту пользовательского трафика после того, как защищённый канал был установлен на этапе 1. Этот этап регулирует передачу данных между сторонами через безопасный туннель, который обеспечивает конфиденциальность и целостность данных.
|
|
||||||
|
|
||||||
#### Hash
|
|
||||||
|
|
||||||
Аналогично этапу 1, параметр Hash используется **для защиты целостности передаваемых данных**. Он обеспечивает проверку, что данные не были изменены при передаче.
|
|
||||||
|
|
||||||
Содержит элементы для выбора:
|
|
||||||
|
|
||||||
- **SHA 1**;
|
|
||||||
- **SHA 2 - 256**;
|
|
||||||
- **SHA 2 - 384**;
|
|
||||||
- **SHA 2 - 512**.
|
|
||||||
|
|
||||||
#### Шифрование
|
|
||||||
|
|
||||||
Этап 2 отвечает за **шифрование пользовательского трафика**. Это важнейший параметр, который защищает данные при их передаче по сети.
|
|
||||||
|
|
||||||
Доступны следующие алгоритмы:
|
|
||||||
|
|
||||||
- **AES 128**;
|
|
||||||
- **AES 256**;
|
|
||||||
- **AES GCM 128**;
|
|
||||||
- **AES GCM 192**;
|
|
||||||
- **AES GCM 256**.
|
|
||||||
|
|
||||||
#### PFS
|
|
||||||
|
|
||||||
**Enable perfect forward secrecy (PFS)** - параметр, активирующий генерацию нового ключа на этапе 2. При включенном PFS группа DH будет такая же как и на 1-й фазе. Данный параметр представлен в виде чекбокса.
|
|
||||||
|
|
||||||
При его включении:
|
|
||||||
|
|
||||||
- На этапе 2 выполняется дополнительный обмен ключами Diffie-Hellman;
|
|
||||||
- Для каждой новой IPsec-сессии формируется новый независимый криптографический секрет;
|
|
||||||
- Ключи шифрования пользовательского трафика не зависят от ключей этапа 1.
|
|
||||||
|
|
||||||
#### DH Group - группа Деффи Хеллмана
|
|
||||||
|
|
||||||
Группа DH **определяет параметры обмена ключами** между сторонами. Чем выше номер группы, тем выше криптографическая стойкость и безопасность обмена.
|
|
||||||
|
|
||||||
Данный параметр так же содержит в себе выпадающий список, состоящий из следующих значений:
|
|
||||||
|
|
||||||
- **group 2**;
|
|
||||||
- **group 5**;
|
|
||||||
- **group 14**;
|
|
||||||
- **group 15**;
|
|
||||||
- **group 16**;
|
|
||||||
- **group 19**;
|
|
||||||
- **group 20**;
|
|
||||||
- **group 21**.
|
|
||||||
|
|
||||||
#### Время жизни (в секундах)
|
|
||||||
|
|
||||||
Определяет, как долго действуют согласованные ключи в рамках второй фазы.
|
|
||||||
|
|
||||||
- Рекомендуемое значение: 3600 секунд (1 час).
|
|
||||||
- После истечения времени выполняется повторная генерация ключей.
|
|
||||||
|
|
||||||
#### Префиксы локальной сети заказчика
|
|
||||||
|
|
||||||
Этот параметр определяет, какие сети на стороне заказчика будут маршрутизироваться через IPsec-туннель.
|
|
||||||
|
|
||||||
Префиксы задаются в формате `192.168.1.0/24`, который позволяет указать диапазон IP-адресов.
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
section_links:
|
|
||||||
- title: Назначение сервиса
|
|
||||||
link: /PaaS/PostgreSQL/about.md
|
|
||||||
description: Конфигурации и возможности сервиса
|
|
||||||
- title: Параметры кластера PostgreSQL
|
|
||||||
link: /PaaS/PostgreSQL/cluster-parameter.md
|
|
||||||
description: Технические параметры кластера PostgreSQL
|
|
||||||
- title: Схема подключения
|
|
||||||
link: /PaaS/PostgreSQL/connection.md
|
|
||||||
description: Общая схема подключения к Cloud PostgreSQL
|
|
||||||
- title: Возможности пользователя
|
|
||||||
link: /PaaS/PostgreSQL/user-capabilities.md
|
|
||||||
description: Возможности пользователя при создании сервиса
|
|
||||||
- title: Веб-интерфейс Grafana
|
|
||||||
link: /PaaS/PostgreSQL/grafana.md
|
|
||||||
description: Инструкция по работе с Grafana
|
|
||||||
- title: Веб-интерфейс PgAdmin
|
|
||||||
link: /PaaS/PostgreSQL/pgadmin.md
|
|
||||||
description: Инструкция по работе с PgAdmin
|
|
||||||
---
|
|
||||||
|
|
||||||
# Cloud PostgreSQL
|
|
||||||
|
|
||||||
В данном разделе представлена документация по управляемому сервису **Cloud PostgreSQL** платформы Beeline Cloud.
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
# Cloud PostgreSQL
|
|
||||||
|
|
||||||
## Назначение сервиса
|
|
||||||
|
|
||||||
**Cloud PostgreSQL** - это управляемый облачный сервис реляционной базы данных PostgreSQL. Он позволяет развернуть и использовать отказоустойчивый кластер базы данных без необходимости самостоятельно настраивать серверы, репликацию и механизмы отказоустойчивости.
|
|
||||||
|
|
||||||
PostgreSQL - это современная система управления базами данных, которая поддерживает стандарт SQL и используется для хранения и обработки данных приложений.
|
|
||||||
|
|
||||||
В **Cloud PostgreSQL** все основные операции по управлению кластером выполняются автоматически.
|
|
||||||
|
|
||||||
Сервис самостоятельно:
|
|
||||||
- управляет ролями серверов базы данных (основной сервер и реплики);
|
|
||||||
- отслеживает состояние узлов;
|
|
||||||
- автоматически переключает основной сервер при сбоях.
|
|
||||||
|
|
||||||
Для обеспечения стабильной работы сервиса используется несколько инфраструктурных компонентов:
|
|
||||||
- **Patroni** - управляет кластером PostgreSQL и автоматическим переключением при отказах;
|
|
||||||
- **etcd** - хранит состояние кластера и обеспечивает согласованность работы узлов;
|
|
||||||
- **HAProxy** - обеспечивает единую точку подключения и распределяет клиентские подключения между узлами.
|
|
||||||
|
|
||||||
Подключение к базе данных выполняется через прокси-узлы сервиса. Пользователю не требуется подключаться к отдельным серверам кластера — все операции производятся через единую точку доступа.
|
|
||||||
|
|
||||||
Для управления базами данных и пользователями доступен [web-интерфейс **pgAdmin**](./pgadmin.md), позволяющий выполнять администрирование непосредственно через браузер.
|
|
||||||
|
|
||||||
## Конфигурации кластера
|
|
||||||
|
|
||||||
Сервис **Cloud PostgreSQL** поддерживает версии СУБД с 13 по 17 включительно.
|
|
||||||
|
|
||||||
Кластер предоставляется в архитектуре Primary–Standby, которая обеспечивает:
|
|
||||||
|
|
||||||
- синхронную репликацию данных;
|
|
||||||
- повышенную отказоустойчивость.
|
|
||||||
|
|
||||||
В рамках данной конфигурации создаётся кластер из виртуальных серверов, включающий:
|
|
||||||
|
|
||||||
- **Primary** (основной сервер) — обязательный узел, на котором выполняются операции записи данных;
|
|
||||||
- **Replica** (реплики) — дополнительные узлы (от 0 до 4), создаваемые по желанию пользователя.
|
|
||||||
|
|
||||||
Реплики являются полноценными участниками кластера PostgreSQL и могут использоваться для выполнения запросов, не изменяющих данные (например, SELECT).
|
|
||||||
|
|
||||||
В многоузловой конфигурации серверы кластера размещаются на разных физических хостах гипервизора, что повышает устойчивость сервиса к отказам оборудования.
|
|
||||||
|
|
||||||
## Режимы репликации
|
|
||||||
|
|
||||||
По умолчанию фиксация изменений выполняется в **синхронном режиме**. Это означает, что операция записи считается завершённой только после того, как данные будут зафиксированы как на основном сервере, так и на одной из реплик.
|
|
||||||
|
|
||||||
Если в кластере настроено несколько реплик, синхронный режим применяется только к одной из них. Остальные реплики работают в асинхронном режиме — изменения передаются на них без ожидания подтверждения.
|
|
||||||
|
|
||||||
При необходимости режим репликации может быть изменён на полностью **асинхронный**. В этом случае изменения сначала фиксируются на основном сервере, а затем передаются на реплики с задержкой.
|
|
||||||
|
|
||||||
## Доступ к серверам и оптимизация соединений
|
|
||||||
|
|
||||||
Прямой доступ к серверам кластера (например, по протоколу SSH) не предоставляется. Пользователь взаимодействует с базой данных исключительно через точки подключения, предоставленные сервисом.
|
|
||||||
|
|
||||||
На каждом узле кластера установлен пулер соединений **PgBouncer**, который может использоваться для ускорения работы приложений за счёт оптимизации подключений к базе данных.
|
|
||||||
|
|
||||||
::: warning Примечание
|
|
||||||
|
|
||||||
Использование PgBouncer не является обязательным - подключение возможно как напрямую к PostgreSQL, так и через пулер, а также одновременно обоими способами.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Возможности сервиса
|
|
||||||
|
|
||||||
**Cloud PostgreSQL** предоставляет набор возможностей, позволяющих использовать PostgreSQL в облаке без необходимости самостоятельного администрирования инфраструктуры.
|
|
||||||
|
|
||||||
Сервис обеспечивает:
|
|
||||||
|
|
||||||
- автоматическое управление кластером PostgreSQL;
|
|
||||||
- высокую доступность за счёт репликации и автоматического переключения primary-узла;
|
|
||||||
- единую точку подключения к базе данных через прокси;
|
|
||||||
- автоматическое переключение при отказе узлов кластера без вмешательства пользователя;
|
|
||||||
- web-доступ к управлению базами данных и пользователями через pgAdmin;
|
|
||||||
- совместимость со стандартными клиентскими инструментами PostgreSQL;
|
|
||||||
- возможность установки расширений PostgreSQL в базу данных.
|
|
||||||
|
|
||||||
## Сценарии использования сервиса
|
|
||||||
|
|
||||||
**Cloud PostgreSQL** подходит для использования в системах, где требуется надёжное хранение данных и упрощённое управление инфраструктурой базы данных.
|
|
||||||
|
|
||||||
Сервис может применяться в следующих сценариях:
|
|
||||||
|
|
||||||
- размещение production-баз данных с высокими требованиями к доступности;
|
|
||||||
- использование PostgreSQL в микросервисной архитектуре с единой точкой подключения к базе данных;
|
|
||||||
- хранение критичных данных с минимальным временем простоя при отказах инфраструктуры;
|
|
||||||
- быстрое развёртывание PostgreSQL-кластера без необходимости ручной настройки репликации и failover;
|
|
||||||
- администрирование баз данных через веб-интерфейс без прямого доступа к серверам кластера.
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
# Описание технических параметров
|
|
||||||
|
|
||||||
Данный раздел содержит технические параметры кластера PostgreSQL и порядок их первичной конфигурации.
|
|
||||||
|
|
||||||
Настройка указанных параметров выполняется администратором облачного провайдера на этапе развёртывания сервиса. Пользователь не имеет прямого доступа к их самостоятельной установке.
|
|
||||||
|
|
||||||
Перед созданием кластера клиент предоставляет перечень требуемых параметров менеджеру. Администратор облачного провайдера выполняет конфигурацию в соответствии с согласованными требованиями.
|
|
||||||
|
|
||||||
## Выбор типа и размера дискового хранилища
|
|
||||||
|
|
||||||
Производительность базы данных напрямую зависит от скорости, с которой она может читать и записывать данные на диск. При заказе кластера необходимо выбрать тип дискового хранилища, который определит максимальную скорость работы (IOPS) и время отклика.
|
|
||||||
|
|
||||||
**IOPS (Input/Output Operations Per Second)** — количество операций чтения или записи, которые диск может выполнить за секунду. Чем выше этот показатель, тем быстрее база данных обрабатывает запросы.
|
|
||||||
|
|
||||||
## Доступные типы хранилищ:
|
|
||||||
|
|
||||||
| Название | Лимит IOPS |
|
|
||||||
| -------------- | ------------------ |
|
|
||||||
| **Fast SAS** | до 2 IOPS на 1 ГБ |
|
|
||||||
| **SSD** | до 5 IOPS на 1 ГБ |
|
|
||||||
| **Fast SSD** | до 10 IOPS на 1 ГБ |
|
|
||||||
| **Ultra NVMe** | до 25 IOPS на 1 ГБ |
|
|
||||||
|
|
||||||
::: warning Примечание
|
|
||||||
|
|
||||||
После выбора типа диска необходимо указать объем дискового хранилища, который будет выделен под данные кластера PostgreSQL. Минимальный объем - 50 ГБ.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Конфигурация вычислительных ресурсов
|
|
||||||
|
|
||||||
В данном разделе определяются вычислительные мощности кластера: процессорные ресурсы, оперативная память и количество серверов (нод), из которых будет состоять кластер PostgreSQL.
|
|
||||||
|
|
||||||
#### Количество нод в кластере
|
|
||||||
|
|
||||||
Количество нод определяет отказоустойчивость кластера и возможность распределять запросы на чтение между репликами. Чем больше нод, тем выше надёжность и производительность операций чтения.
|
|
||||||
|
|
||||||
Количество нод выбирается в диапазоне **от 1 до 5**.
|
|
||||||
|
|
||||||
#### Процессор (CPU)
|
|
||||||
|
|
||||||
Процессор — это вычислительная мощность, выделяемая каждой ноде кластера. Количество vCPU определяет, насколько быстро база данных сможет:
|
|
||||||
|
|
||||||
- обрабатывать запросы;
|
|
||||||
- выполнять сложные операции (сортировки, объединения таблиц);
|
|
||||||
- обслуживать одновременные подключения.
|
|
||||||
|
|
||||||
Доступный диапазон: **от 2 до 24 vCPU** на ноду.
|
|
||||||
|
|
||||||
#### Оперативная память (RAM)
|
|
||||||
|
|
||||||
Оперативная память — один из ключевых ресурсов для производительности базы данных. Данные, помещающиеся в RAM, обрабатываются максимально быстро, без обращения к диску.
|
|
||||||
|
|
||||||
Доступный диапазон: **от 4 до 768 ГБ RAM** на ноду.
|
|
||||||
|
|
||||||
#### Доступ в интернет
|
|
||||||
|
|
||||||
При заказе сервиса можно выбрать пропускную способность канала связи, через который будет осуществляться доступ к кластеру PostgreSQL из сети интернет.
|
|
||||||
|
|
||||||
**Доступные варианты скорости:**
|
|
||||||
- 50 Мбит/с;
|
|
||||||
- 100 Мбит/с;
|
|
||||||
- 200 Мбит/с;
|
|
||||||
- 300 Мбит/с;
|
|
||||||
- 400 Мбит/с;
|
|
||||||
- 500 Мбит/с;
|
|
||||||
- 1000 Мбит/с (1 Гбит/с).
|
|
||||||
|
|
||||||
::: warning Примечание
|
|
||||||
|
|
||||||
Для выбранного канала предоставляется статический белый IP-адрес.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Сетевой доступ к кластеру
|
|
||||||
|
|
||||||
Для организации защищенного подключения к кластеру Kafka доступны стандартные механизмы, используемые во всех сервисах платформы:
|
|
||||||
- **IPsec-подключение** - организация защищенного туннеля между инфраструктурой и кластером PostgreSQL. Подробнее см. [раздел IPsec](../IPSEC.md);
|
|
||||||
- **Interconnection** - прямое сетевое соединение между сервисами внутри платформы без выхода в интернет. Подробнее см. раздел Interconnection.
|
|
||||||
|
|
||||||
Выбор конкретного способа подключения зависит от архитектуры приложений и требований к безопасности.
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
# Общая схема подключения
|
|
||||||
|
|
||||||
Подключение к кластеру **Cloud PostgreSQL** осуществляется через прокси-сервер. Клиентские подключения принимаются прокси, который маршрутизирует трафик к соответствующим узлам кластера (master или replica) в зависимости от выбранного порта.
|
|
||||||
|
|
||||||
Прокси является единой точкой входа для всех клиентских подключений и принимает входящие соединения от приложений, административных инструментов и пользователей.
|
|
||||||
|
|
||||||
В зависимости от выбранного порта прокси автоматически направляет трафик:
|
|
||||||
- **на активный primary-узел** - для операций чтения и записи
|
|
||||||
- **на реплики** - для операций только чтения
|
|
||||||
|
|
||||||
::: warning Примечание
|
|
||||||
Прямое подключение к отдельным узлам базы данных **не используется и не предоставляется**. Взаимодействие с кластером всегда выполняется **через прокси-сервер**.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Подключение к базе данных
|
|
||||||
|
|
||||||
Для подключения к базе данных необходимо использовать IP-адрес прокси-сервера, который предоставляется после заказа услуги.
|
|
||||||
|
|
||||||
Этот IP-адрес является единой точкой входа для работы с кластером PostgreSQL. Все подключения к базе данных - как из приложений, так и из клиентских инструментов - выполняются через него.
|
|
||||||
|
|
||||||
Использование других IP-адресов или попытка прямого подключения к отдельным узлам кластера не предусмотрены.
|
|
||||||
|
|
||||||
## Доступные порты
|
|
||||||
|
|
||||||
Для разных типов нагрузки используются разные порты:
|
|
||||||
|
|
||||||
|Порт |Назначение |
|
|
||||||
|------|-----------------------------------------|
|
|
||||||
|5432 |Primary (чтение и запись) |
|
|
||||||
|15432 |Replica (только чтение) |
|
|
||||||
|6432 |Primary через PgBouncer (чтение и запись)|
|
|
||||||
|16432 |Replica через PgBouncer (только чтение) |
|
|
||||||
|
|
||||||
#### Особенности работы портов
|
|
||||||
|
|
||||||
- Порты **для чтения и записи** (5432, 6432) всегда направляют трафик на активный primary-узел. При смене primary переключение происходит автоматически;
|
|
||||||
- Порты **только для чтения** (15432, 16432) направляют трафик на активные реплики. Если реплик несколько, нагрузка распределяется между ними по принципу round-robin;
|
|
||||||
- Если в кластере **отсутствуют реплики**, порты для чтения не используются - подключение по ним не устанавливается.
|
|
||||||
|
|
||||||
#### Рекомендации по выбору порта
|
|
||||||
|
|
||||||
- Для OLTP-нагрузки и большого количества соединений рекомендуется использовать **порты PgBouncer (6432 или 16432)**;
|
|
||||||
- Для операций записи используйте **master-порты (5432 или 6432)**;
|
|
||||||
- Для read-only запросов можно использовать **replica-порты (15432 или 16432)**.
|
|
||||||
|
|
||||||
## Доступ к pgAdmin
|
|
||||||
|
|
||||||
Для администрирования базы данных используется [web-интерфейс pgAdmin](./pgadmin.md).
|
|
||||||
Доступ осуществляется по DNS-имени, которое нужно прописать локально в инфраструктуре откуда будет происходить доступ к web-интерфейсу сервиса:
|
|
||||||
`10.X.X.4 <domain>.cloud-pg.dfcloud.ru`
|
|
||||||
|
|
||||||
После добавления записи pgAdmin будет доступен по адресу:
|
|
||||||
`https://<domain>.cloud-pg.dfcloud.ru`
|
|
||||||
|
|
||||||
Авторизация выполняется с использованием учётных данных, предоставленных вместе с доступом к сервису.
|
|
||||||
|
|
||||||
::: warning Примечание
|
|
||||||
|
|
||||||
- подключение к базе данных возможно только через указанный прокси-IP;
|
|
||||||
- в интерфейсе pgAdmin уже добавлен сервер базы данных, созданный для данной инсталляции. Для подключения требуется ввести пароль от учётной записи базы данных;
|
|
||||||
- pgAdmin предназначен для администрирования и не рекомендуется для выполнения тяжёлых или длительных запросов в production-среде.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Примеры подключения к PostgreSQL
|
|
||||||
|
|
||||||
Подключение к primary:
|
|
||||||
`psql -h 10.X.X.4 -p 5432 -U <username> -d <database>`
|
|
||||||
|
|
||||||
Подключение через PgBouncer:
|
|
||||||
`psql -h 10.X.X.4 -p 6432 -U <username> -d <database>`
|
|
||||||
|
|
||||||
#### Подключение через DBeaver / DataGrip
|
|
||||||
|
|
||||||
При создании подключения укажите:
|
|
||||||
- Host: 10.X.X.4;
|
|
||||||
- Port: 5432 или 6432;
|
|
||||||
- Database: `<database>`;
|
|
||||||
- User / Password: согласно выданным доступам;
|
|
||||||
- Тип подключения: PostgreSQL.
|
|
||||||
|
|
||||||
#### Пример строки подключения
|
|
||||||
|
|
||||||
Primary:
|
|
||||||
`postgresql://<username>:<password>@10.X.X.4:5432/<database>`
|
|
||||||
|
|
||||||
Через PgBouncer:
|
|
||||||
`postgresql://<username>:<password>@10.X.X.4:6432/<database>`
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
# Grafana
|
|
||||||
|
|
||||||
## Инструкция по работе с метриками
|
|
||||||
|
|
||||||
Доступ к метрикам кластера предоставляется после запроса соответствующих прав. После получения доступа можно перейти в систему мониторинга по ссылке: https://metrics.dfcloud.ru. После перехода по ссылке будет представлена главная страница Grafana.
|
|
||||||
|
|
||||||
Для просмотра метрик кластера PostgreSQL выполните следующие шаги:
|
|
||||||
|
|
||||||
1. В левом боковом меню нажмите **Dashboard**;
|
|
||||||
2. В списке доступных дашбордов выберите **папку Cloud PostgreSQL**;
|
|
||||||
3. Внутри папки выберите **дашборд Cloud PostgreSQL** — в нём отображаются все метрики кластера.
|
|
||||||
|
|
||||||
## Управление отображаемыми данными
|
|
||||||
|
|
||||||
В верхней части дашборда доступны селекторы для настройки отображения:
|
|
||||||
|
|
||||||
- **InstallationID** - выбор одного опеределенного кластера;
|
|
||||||
- **Cluster node name** - выбор конкретного нода кластера, в котором значения графиков меняются в зависимости от выбранного хоста (селектор влияет на все графики, кроме блока Patroni);
|
|
||||||
- **Database** - выбор базы данных, по которым отображаются метрики;
|
|
||||||
- **Lock table** - выбор типа блокировки для отображения (применим не для всех графиков).
|
|
||||||
|
|
||||||
## Метрики PostgreSQL
|
|
||||||
|
|
||||||
Метрики отображают ключевые параметры конфигурации и текущие показатели работы экземпляра PostgreSQL.
|
|
||||||
|
|
||||||
| Наименование метрики | Описание метрики |
|
|
||||||
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| **Version** | Показывает текущую версию PostgreSQL, установленную на кластере. |
|
|
||||||
| **Current fetch data** | Объем данных, извлеченных из базы за текущий период (операции чтения). |
|
|
||||||
| **Current insert data** | Объем данных, вставленных в базу (операции записи новых данных). |
|
|
||||||
| **Current update data** | Объем данных, обновленных в базе. |
|
|
||||||
| **Seq Page Cost** | Стоимость последовательного чтения страницы данных. Влияет на выбор плана запроса: чем выше значение, тем реже оптимизатор будет выбирать последовательное сканирование таблиц. |
|
|
||||||
| **Random Page Cost** | Стоимость чтения случайной страницы данных. Низкое значение говорит о том, что в системе используются быстрые диски, и оптимизатор будет чаще выбирать доступ по индексам. |
|
|
||||||
| **Max Connections** | Максимальное количество одновременных подключений к базе данных, разрешенное на сервере. |
|
|
||||||
| **Shared Buffers** | Объем оперативной памяти, выделенный под кэш данных PostgreSQL. Здесь хранятся часто используемые данные для ускорения доступа к ним. |
|
|
||||||
| **Effective Cache** | Предполагаемый размер системного кэша файлов. Используется оптимизатором для оценки вероятности нахождения данных в кэше операционной системы. |
|
|
||||||
| **Maintenance Work Mem** | Объем памяти для выполнения операций обслуживания. |
|
|
||||||
| **Work Mem** | Объем памяти, выделяемый для внутренних сортировок и хеш-таблиц при выполнении запросов (на каждую операцию). |
|
|
||||||
| **Max WAL Size** | Максимальный размер журнала предзаписи, после достижения которого запускается процесс контрольной точки (checkpoint). |
|
|
||||||
| **Max Worker Processes** | Максимальное количество фоновых процессов, которые могут быть запущены в системе. |
|
|
||||||
| **Max Parallel Workers** | Максимальное количество параллельных процессов, которые могут быть задействованы при выполнении одного запроса. |
|
|
||||||
|
|
||||||
## Метрики Database Stats
|
|
||||||
|
|
||||||
Метрики отображают текущую нагрузку и состояние баз данных в кластере PostgreSQL. Данные метрики позволяют:
|
|
||||||
- оценить эффективность работы баз данных;
|
|
||||||
- отследить скачки нагрузки;
|
|
||||||
- своевременно среагировать на потенциальные проблемы до того, как они повлияют на работу приложений.
|
|
||||||
|
|
||||||
| Наименование | Описание |
|
|
||||||
|---------------------------| -------------------|
|
|
||||||
| **Average CPU Usage** | Показывает время, затраченное на выполнение пользовательских и системных задач, а также, насколько интенсивно используются вычислительные ресурсы сервера базы данных. |
|
|
||||||
| **Average Memory Usage** | Средний объем оперативной памяти, используемой процессами PostgreSQL за 5-минутные интервалы. Показывает, сколько памяти потребляет база данных в процессе работы. |
|
|
||||||
| **Open File Descriptors** | Количество открытых файловых дескрипторов процессами PostgreSQL. Метрика показывает среднее (Mean), последнее (Last), максимальное (Max) и минимальное (Min) значение за интервал. |
|
|
||||||
| **Active sessions** | Показывает, сколько в данный момент выполняется запросов к PostgreSQL. Метрика показывает среднее (Mean), последнее (Last), максимальное (Max) значение. |
|
|
||||||
| **Transcations** | Количество транзакций в базах данных кластера. Метрика разделена на два типа операций: commits (успешно завершенные транзакции) и rollbacks (откаченные транзакции). |
|
|
||||||
| **Update data** | Объем данных, обновленных в базах данных кластера. Показывает, сколько данных было изменено в результате выполнения операций UPDATE. |
|
|
||||||
| **Fetch data (SELECT)** | Объем данных, извлеченных из базы с помощью запросов SELECT. Показывает, сколько данных было считано из базы в результате операций чтения. |
|
|
||||||
| **Insert data** | Объем данных, вставленных в базы данных кластера. Показывает, сколько данных было добавлено в результате выполнения операций INSERT. |
|
|
||||||
| **Lock tables** | Количество блокировок таблиц в базах данных кластера. Показывает, сколько раз таблицы были заблокированы для выполнения операций.<br>AccessShareLock - это блокировка, которая возникает, когда кто-то читает данные из таблицы (делает SELECT). Данная блокировка не мешает операциям чтения, но не дает удалить в этот момент таблицу или изменить ее структуру. |
|
|
||||||
| **Return data** | Объем данных, возвращаемых клиенту в результате выполнения запросов. Показывает, сколько данных было отправлено обратно клиенту после обработки запросов в базе. |
|
|
||||||
| **Idle sessions** | Количество бездействующих сессий подключения к базе данных. Показывает, сколько открытых подключений в данный момент не выполняют никаких запросов и просто ждут. |
|
|
||||||
| **Delete data** | Объем данных, удаленных из базы данных в результате выполнения операций DELETE. Показывает, сколько данных было удалено из таблиц. |
|
|
||||||
| **Cache Hit Rate** | Показывает процент запросов к данным, которые были удовлетворены из кэша (оперативной памяти), без обращения к диску. Показывает, насколько эффективно используется кэш PostgreSQL. |
|
|
||||||
| **Buffers (bgwriter)** | Метрика, показывающая активность фонового процесса записи, который занимается синхронизацией данных из оперативной памяти на диск. |
|
|
||||||
| **Conflicts/Deadlocks** | Метрика, отслеживающая две проблемы при работе с базой данных: конфликты восстановления и взаимоблокировки. |
|
|
||||||
| **Temp File (Bytes)** | Объем данных, записанных во временные файлы при выполнении запросов в базах данных. PostgreSQL создает временные файлы на диске, когда для выполнения запроса не хватает оперативной памяти. |
|
|
||||||
| **Checkpoint Stats** | Метрика, показывающая время, затрачиваемое на выполнение checkpoints в PostgreSQL, где: <br>- **write_time** - время, затраченное на запись данных на диск во время checkpoint (сколько миллисекунд ушло на запись файлов).<br>- **sync_time** - время, затраченное на синхронизацию файлов с диском (чтобы данные гарантированно сохранились). |
|
|
||||||
|
|
||||||
## Метрики Patroni
|
|
||||||
|
|
||||||
Метрик отображают состояние и конфигурацию кластера PostgreSQL под управлением Patroni. Эти метрики позволяют контролировать отказоустойчивость кластера, отслеживать переключения мастера и убеждаться, что репликация работает штатно.
|
|
||||||
|
|
||||||
| Наименование | Описание |
|
|
||||||
|------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| **Patroni Leader** | Метрика, которая показывает, какая нода в кластере PostgreSQL в данный момент является master-сервером, принимающим запросы на запись. |
|
|
||||||
| **Patroni Replica** | Метрика, которая показывает, какие узлы кластера PostgreSQL в данный момент выполняют роль реплики. |
|
|
||||||
| **Sync Standby** | Метрика, которая показывает, какая из реплик в кластере PostgreSQL назначена синхронной. |
|
|
||||||
| **PostgreSQL WAL Replay** | Метрика, которая показывает, включена ли на узлах кластера синхронизация данных через WAL. |
|
|
||||||
| **PostgreSQL Pending Restart** | Метрика, которая показывает, требуется ли перезагрузка PostgreSQL на узлах кластера после изменения конфигурационных параметров. |
|
|
||||||
| **Patroni Primary Node** | Метрика, которая показывает, какой узел в кластере PostgreSQL в данный момент является основным и принимает запросы на запись. |
|
|
||||||
| **Patroni Secondary Nodes** | Метрика, которая показывает, какие узлы кластера PostgreSQL в определенные моменты времени выполняли роль реплик. |
|
|
||||||
| **Replicas Received WAL Location** | Метрика, показывающая объем журналов предзаписи (WAL), полученных каждой репликой кластера. |
|
|
||||||
| **Primary WAL Location** | Метрика, показывающая объем журналов предзаписи (WAL), на основном сервере кластера PostgreSQL. |
|
|
||||||
| **Replicas Replayed WAL Location** | Метрика, показывающая объем журналов предзаписи (WAL), которые были не просто получены, а уже применены на репликах кластера. |
|
|
||||||
| **WAL Replay Paused** | Метрика, которая отслеживает, не приостановлен ли процесс применения WAL-журналов на узлах кластера. Если передача или применение WAL-файлов останавливается, на графике происходит скачок. |
|
|
||||||
|
|
||||||
## Метрики Hosts
|
|
||||||
|
|
||||||
Блок Hosts управляется селектором **Cluster node name**. Метрики отображают состояние и ресурсы серверов, на которых развернут кластер PostgreSQL. Данные метрики позволяют оценить, хватает ли серверу ресурсов для текущей нагрузки, и своевременно обнаружить проблемы с производительностью или нехваткой места на дисках.
|
|
||||||
|
|
||||||
| Наименование | Описание |
|
|
||||||
| -------------------------------|-------------------------------------------------------------------------------------------------------------------------------|
|
|
||||||
| **CPU Busy** | Метрика, показывающая общую загруженность всех процессорных ядер на сервере, где работает PostgreSQL. |
|
|
||||||
| **RAM Used** | Метрика, показывающая процент оперативной памяти, который занят на сервере всеми процессами. |
|
|
||||||
| **CPU Cores** | Метрика, показывающая общее количество процессорных ядер, доступных на сервере, где работает PostgreSQL. |
|
|
||||||
| **RAM Total** | Метрика, показывающая общий объем оперативной памяти, установленный на сервере. |
|
|
||||||
| **DB Disk Total** | Метрика, показывающая общий объем дискового пространства, выделенного для хранения данных базы данных PostgreSQL на сервере. |
|
|
||||||
| **CPU Basic** | Метрика, которая показывает детальную разбивку загрузки процессора по типам выполняемых задач. Она позволяет увидеть, на что именно тратится процессорное время на сервере. |
|
|
||||||
| **Memory Basic** | Метрика, которая показывает детальную разбивку использования оперативной памяти на сервере, а также информацию о SWAP. |
|
|
||||||
| **Disk IOps** | Метрика, показывающая количество операций чтения и записи, выполняемых на диске сервера в секунду. |
|
|
||||||
| **Disk Space Used Basic** | Метрика, показывающая процент занятого дискового пространства на всех подключенных файловых системах сервера. |
|
|
||||||
| **Disk R/W Data** | Показывает объем данных в байтах, читаемых с диска и записываемых на диск в секунду. |
|
|
||||||
| **Filesystem space available** | Метрика, показывающая объем свободного дискового пространства на файловой системе сервера. |
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
# PgAdmin
|
|
||||||
|
|
||||||
После предоставления доступа к сервису **Cloud PostgreSQL** пользователь получает возможность управлять базами данных через веб-интерфейс **pgAdmin**. Ниже приведена инструкция по входу в систему и выполнению основных операций.
|
|
||||||
|
|
||||||
## Вход в pgAdmin
|
|
||||||
|
|
||||||
1. Откройте веб-браузер и перейдите по адресу, предоставленному для доступа к pgAdmin;
|
|
||||||
2. На странице авторизации введите **логин и пароль от pgAdmin**;
|
|
||||||
> Учетные данные направляются пользователю на электронную почту при предоставлении доступа.
|
|
||||||
3. После входа в систему в левой панели навигации откройте раздел **Servers**;
|
|
||||||
4. Выберите предварительно настроенный сервер с названием **PostgreSQL**;
|
|
||||||
5. В открывшемся окне введите пароль;
|
|
||||||
> Важно: на данном этапе необходимо указать **пароль учетной записи базы данных**, а не пароль от pgAdmin.
|
|
||||||
6. Нажмите **ОК**.
|
|
||||||
|
|
||||||
После успешной аутентификации станет доступен веб-интерфейс СУБД PostgreSQL.
|
|
||||||
|
|
||||||
## Реплики и параметры конфигураций
|
|
||||||
|
|
||||||
pgAdmin позволяет осуществлять мониторинг реплик, входящих в состав кластера. Чтобы просмотреть список реплик необходимо открыть раздел **Replica nodes** в панели навигации.
|
|
||||||
|
|
||||||
|
|
||||||
### Просмотр состояния репликаций
|
|
||||||
|
|
||||||
Чтобы проверить состояние репликации:
|
|
||||||
1. Выберите нужную реплику в разделе **Replica nodes**;
|
|
||||||
2. Перейдите в подраздел **Replication**;
|
|
||||||
3. Откройте пункт **Replication stats**;
|
|
||||||
4. Разверните раздел **Подробности** - в нем отображаются все параметры и текущее состояние репликации.
|
|
||||||
|
|
||||||
Вкладка **Replication** позволяет определить, выполняется ли передача данных на дополнительные узлы кластера.
|
|
||||||
|
|
||||||
### Просмотр конфигураций реплики
|
|
||||||
|
|
||||||
Чтобы просмотреть **параметры конфигурации PostgreSQL**, применённые к конкретной реплике, перейдите в раздел **Конфигурация**, расположенный в блоке **Replica nodes**.
|
|
||||||
|
|
||||||
Раздел **Конфигурация** содержит следующие параметры:
|
|
||||||
- **Имя** - наименование конфигурационного параметра;
|
|
||||||
- **Категория** - логическая группа параметра;
|
|
||||||
- **Значение** - текущее установленное значение;
|
|
||||||
- **Единицы** - единицы измерения (если применимо);
|
|
||||||
- **Описание** - краткое пояснение назначения параметра.
|
|
||||||
> Вкладка **Конфигурация** предназначена для просмотра текущих настроек реплики.
|
|
||||||
|
|
||||||
## Базы данных
|
|
||||||
|
|
||||||
### Просмотр существующих баз данных:
|
|
||||||
|
|
||||||
Чтобы просмотреть существующие базы данных, откройте раздел Базы данных в левой панели навигации. В этом разделе отображается перечень всех созданных баз.
|
|
||||||
|
|
||||||
### Создание новой базы данных:
|
|
||||||
|
|
||||||
1. Щелкните правой кнопкой мыши по разделу **Базы данных**;
|
|
||||||
2. В контекстном меню выберите **Создать**, затем - **База данных**;
|
|
||||||
3. Заполните обязательные поля в открывшейся форме;
|
|
||||||
4. Нажмите **Сохранить**.
|
|
||||||
|
|
||||||
## Роли входа / группы
|
|
||||||
|
|
||||||
В разделе **Роли входа/группы** отображается список пользователей (ролей), имеющих доступ к базам данных кластера.
|
|
||||||
|
|
||||||
### Создание новой роли:
|
|
||||||
|
|
||||||
1. Щелкните правой кнопкой мыши по разделу **Роли входа/группы**;
|
|
||||||
2. Выберите **Создать**, затем - **Роль входа/группы**;
|
|
||||||
3. Заполните необходимые параметры в форме создания роли;
|
|
||||||
4. Нажмите **Сохранить**.
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
# Возможности пользователя
|
|
||||||
|
|
||||||
Данный раздел описывает права, которые предоставляются пользователю PostgreSQL при создании сервиса **Cloud PostgreSQL**, а также перечень административных операций, доступных ему для самостоятельного выполнения.
|
|
||||||
|
|
||||||
При развертывании сервиса автоматически создаётся пользователь базы данных с преднастроенными атрибутами и привилегиями. Эти права позволяют заказчику самостоятельно управлять своими базами данных, ролями и пользователями в рамках созданного экземпляра PostgreSQL.
|
|
||||||
|
|
||||||
|
|
||||||
## Общая информация о пользователе
|
|
||||||
|
|
||||||
При инициализации сервиса автоматически создаётся пользователь:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
client
|
|
||||||
```
|
|
||||||
|
|
||||||
Данный пользователь является основной учётной записью для административной работы в рамках предоставленного экземпляра PostgreSQL.
|
|
||||||
|
|
||||||
Он предназначен для самостоятельного управления в пределах выданных привилегий:
|
|
||||||
- базами данных;
|
|
||||||
- ролями;
|
|
||||||
- правами доступа.
|
|
||||||
|
|
||||||
|
|
||||||
## Выданные права и ограничения
|
|
||||||
|
|
||||||
Пользователю `client` назначается набор атрибутов и привилегий, позволяющих выполнять административные операции в рамках своего экземпляра базы данных.
|
|
||||||
|
|
||||||
#### Атрибуты роли
|
|
||||||
|
|
||||||
Пользователь создаётся со следующими атрибутами:
|
|
||||||
- `CREATEDB` — разрешено создание и удаление баз данных;
|
|
||||||
- `CREATEROLE` — разрешено создание ролей и пользователей, а также управление их.
|
|
||||||
|
|
||||||
Атрибут `SUPERUSER` пользователю не предоставляется. Соответственно, доступ к системным операциям уровня кластера и настройкам сервера отсутствует.
|
|
||||||
|
|
||||||
#### Права на системную базу postgres:
|
|
||||||
|
|
||||||
К стандартной базе данных `postgres` пользователю предоставлено только право подключения — `CONNECT`
|
|
||||||
|
|
||||||
**Иные привилегии (создание объектов, изменение схем и т.д.) на данную базу не выдаются.**
|
|
||||||
|
|
||||||
|
|
||||||
## Мониторинг и системные представления
|
|
||||||
|
|
||||||
Для выполнения базовых задач мониторинга пользователю дополнительно предоставлены:
|
|
||||||
- членство в роли `pg_monitor`;
|
|
||||||
- право `SELECT` на системное представление:
|
|
||||||
```sql
|
|
||||||
pg_catalog.pg_stat_replication
|
|
||||||
```
|
|
||||||
|
|
||||||
Доступ к системной информации предоставляется исключительно **в режиме чтения**. Изменение системных представлений и параметров сервера недоступно.
|
|
||||||
|
|
||||||
|
|
||||||
## Изменение пароля
|
|
||||||
|
|
||||||
После первого подключения к базе данных пользователь `client` обязан выполнить изменения пароля.
|
|
||||||
|
|
||||||
Изменить пароля можно:
|
|
||||||
- в открытом виде (с передачей нового значения пароля);
|
|
||||||
- с указанием заранее сгенерированного хэша.
|
|
||||||
|
|
||||||
На сервере используется алгоритм шифрования паролей:
|
|
||||||
|
|
||||||
```
|
|
||||||
scram-sha-256
|
|
||||||
```
|
|
||||||
|
|
||||||
При использовании **SCRAM** применяется следующий формат хэша:
|
|
||||||
|
|
||||||
```
|
|
||||||
$<iterations>:<salt>$<storedkey>:<serverkey>
|
|
||||||
```
|
|
||||||
|
|
||||||
| Операция | Описание | Команда SQL |
|
|
||||||
|----------|----------|-------------|
|
|
||||||
|Смена пароля в открытом виде | Для смены пароля в открытом виде | ```ALTER USER client WITH PASSWORD 'new_strong_password';``` |
|
|
||||||
|Смена пароля с указанием хэша | Рекомендуется использовать сложный уникальный пароль, соответствующий требованиям информационной безопасности, и хранить его в защищённом хранилище | ```ALTER USER client WITH ENCRYPTED PASSWORD '$4096:...';``` |
|
|
||||||
|Создание новой базы данных | Для создания базы данных | ```CREATE DATABASE app_db;``` |
|
|
||||||
|Создание базы данных с указанием владельца | Пользователь, указанный как владелец, будет иметь полный контроль над базой данных, включая права на её удаление и изменение. По умолчанию владельцем создаваемой базы данных является пользователь, который её создает | ```CREATE DATABASE app_db OWNER client;``` |
|
|
||||||
|
|
||||||
|
|
||||||
## Создание пользователей и ролей
|
|
||||||
|
|
||||||
Пользователь `client` имеет право создавать новые роли и пользователей для приложений, а также управлять их правами доступа.
|
|
||||||
|
|
||||||
| Операция | Описание | Команда SQL |
|
|
||||||
|----------|----------|-------------|
|
|
||||||
|Создание роли без логина | Для входа в базу данных (например, для организации прав доступа) | ```CREATE ROLE app_role; ```|
|
|
||||||
|Создание пользователя с паролем | Для создания пользователя с паролем. После выполнения этой команды новый пользователь `app_user` будет иметь возможность входа в базу данных, используя указанный пароль. | ```CREATE USER app_user WITH PASSWORD 'app_password';``` |
|
|
||||||
|Назначение роли пользователю | Для назначения роли пользователю. Данная команда позволяет управлять правами пользователя в рамках определённой роли. После выполнения этой команды пользователь `app_user` станет членом роли `app_role`, и будет наследовать все права, связанные с этой ролью. | ```GRANT app_role TO app_user; ``` |
|
|
||||||
|
|
||||||
|
|
||||||
## Управление правами доступа
|
|
||||||
|
|
||||||
После создания пользователей и ролей необходимо назначить им соответствующие права доступа.
|
|
||||||
|
|
||||||
| Операция | Описание | Команда SQL |
|
|
||||||
|----------|----------|-------------|
|
|
||||||
|Передача владельца базы данных | Для передачи прав владения базой данных другому пользователю. После выполнения этой команды база данных `app_db` будет принадлежать пользователю `app_user`, и он будет иметь полный контроль над ней.| ```ALTER DATABASE app_db OWNER TO app_user;``` |
|
|
||||||
|Выдача прав на подключение к базе данных | Для предоставления прав к подключению к базе данных. После выполнения этой команды пользователь может `app_user` подключаться к базе данных `app_db`. | ```GRANT CONNECT ON DATABASE app_db TO app_user;```|
|
|
||||||
|Предоставление прав на схему public | Для предоставления прав на использование схемы `public`. После выполнения этой команды пользователь `app_user` может использовать объекты в схеме `public`, а также создавать новые объекты внутри неё. | ```GRANT USAGE, CREATE ON SCHEMA public TO app_user;```|
|
|
||||||
|Предоставление прав на существующие таблицы | Для предоставления доступа пользователю к существующим таблицам в схеме `public`. После выполнения этой команды пользователь `app_user` может выполнять операции чтения, вставки, обновления и удаления данных в существующих таблицах схемы `public`.| ```GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;``` |
|
|
||||||
|Предоставление прав на будущие таблицы | Если необходимо автоматически предоставить пользователю права на новые таблицы, создаваемые в схеме `public`. После выполнения этой команды все будущие таблицы, создаваемые в схеме `public`, будут автоматически иметь права для пользователя `app_user` на чтение, вставку, обновление и удаление данных. | ```ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;```|
|
|
||||||
|
|
||||||
|
|
||||||
## Мониторинг репликации
|
|
||||||
|
|
||||||
Пользователь `client` имеет доступ к системным представлениям для мониторинга состояния репликации в кластере PostgreSQL.
|
|
||||||
|
|
||||||
| Операция | Описание | Команда SQL |
|
|
||||||
|----------|----------|-------------|
|
|
||||||
|Просмотр состояния репликации | Для просмотра текущего статуса репликации. Этот запрос возвращает информацию о всех репликах, подключённых к основному (primary) серверу. |```SELECT * FROM pg_stat_replication;```|
|
|
||||||
|
|
||||||
::: warning Ограничения доступа реплкации
|
|
||||||
|
|
||||||
Пользователь `client` имеет доступ к данным в представлении `pg_stat_replication` только в режиме **read-only**. Это означает, что он может просматривать состояние репликации, но не может изменять или вмешиваться в процесс репликации.
|
|
||||||
|
|
||||||
:::
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
section_links:
|
|
||||||
- title: Cloud PostgreSQL
|
|
||||||
link: /PaaS/PostgreSQL/PostgreSQL-index.md
|
|
||||||
description: Обзор сервиса PostgreSQL
|
|
||||||
- title: IPSEC
|
|
||||||
link: /PaaS/IPSEC.md
|
|
||||||
description: Параметры конфигурации IPSEC
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Начало работы в Cloud PostgreSQL
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Матрица региональной доступности
|
||||||
|
|
||||||
|
Регион доступности — это один или несколько центров обработки данных (ЦОД), в которых могут быть размещены компоненты облачной инфраструктуры.
|
||||||
|
|
||||||
|
| Регион | Статус | Гипервизор | Процессор | HDD| SSD | NVME|
|
||||||
|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||||
|
| **ДатаФорт 1** | Доступен | OpenStack | Intel® Xeon® Gold 6248R | ✘ | ✘ | ✅ |
|
||||||
|
|
||||||
|
Условные обозначения:
|
||||||
|
|
||||||
|
✅ — есть возможность выдачи ресурсов.
|
||||||
|
|
||||||
|
✘ — нет возможности выдачи ресурсов.
|
||||||
@@ -10,3 +10,5 @@ section_links:
|
|||||||
При [регистрации пользователя](../start/getting-started.md#1-регистрация-в-beeline-cloud) в Beeline Cloud создается аккаунт и проект в Beeline Cloud.
|
При [регистрации пользователя](../start/getting-started.md#1-регистрация-в-beeline-cloud) в Beeline Cloud создается аккаунт и проект в Beeline Cloud.
|
||||||
|
|
||||||
С помощью аккаунта можно управлять профилем пользователя - добавлять SSH-ключи, чтобы подключаться к виртуальным машинам без ввода пароля.
|
С помощью аккаунта можно управлять профилем пользователя - добавлять SSH-ключи, чтобы подключаться к виртуальным машинам без ввода пароля.
|
||||||
|
|
||||||
|
В проекте можно создавать ресурсы, добавлять пользователей в проект и управлять доступом к ресурсам.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# Квоты и лимиты
|
||||||
|
|
||||||
|
Ограничения включают в себя лимиты и квоты на потребление ресурсов в проекте.
|
||||||
|
|
||||||
|
Квоты ограничивают потребление ресурсов в проекте. В проекте на каждый ресурс выделяется квота, не превышающая лимит.
|
||||||
|
|
||||||
|
После создания проекту становятся доступны базовые квоты. Для них установлены значения по умолчанию.
|
||||||
|
|
||||||
|
**Базовые квоты**
|
||||||
|
|
||||||
|
| Название квоты | Количество |
|
||||||
|
|---------------------|------------|
|
||||||
|
| Количество виртуальных ВМов | 3 штуки|
|
||||||
|
| ЦПУ | 200 |
|
||||||
|
| ОЗУ | 200 Гбайт |
|
||||||
|
| Хранилище NVME | 5000 Гбайт |
|
||||||
|
| Объектное хранилище | 100 Гбайт |
|
||||||
|
|
||||||
|
## Просмотр квот проекта
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. В шапке выберите **Проекты**.
|
||||||
|
3. Откроется список проектов, в которых вы являетесь участником.
|
||||||
|
4. Нажмите на имя нужного проекта.
|
||||||
|
5. Откройте раздел **Обзор**.
|
||||||
|
|
||||||
|
## Редактирование квот проекта
|
||||||
|
|
||||||
|
::: tip Информация
|
||||||
|
Изменить квоты проекта может пользователь с ролью **Владелец проекта**.
|
||||||
|
:::
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. В шапке выберите **Проекты**.
|
||||||
|
3. Откроется список проектов, в которых вы являетесь участником.
|
||||||
|
4. Нажмите на имя нужного проекта.
|
||||||
|
5. Откройте раздел **Обзор**.
|
||||||
|
6. В правом верхнем углу нажмите **Изменить квоты**.
|
||||||
|
7. Увеличите или уменьшите квоты для ресурсов.
|
||||||
|
8. Нажмите **Сохранить**.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Управление проектами
|
||||||
|
|
||||||
|
Проект — это структурная единица публичного облака, в которой содержатся ресурсы: виртуальные машины, хранилища, IP-адреса и др.
|
||||||
|
|
||||||
|
Ресурсы могут быть вычислительными и аппаратными.
|
||||||
|
|
||||||
|
Вычислительные ресурсы:
|
||||||
|
- оперативная память (ОЗУ);
|
||||||
|
- ядра процессора (ЦПУ);
|
||||||
|
- локальные диски;
|
||||||
|
- сетевые диски;
|
||||||
|
- IP-адреса.
|
||||||
|
|
||||||
|
Аппаратные ресурсы (ВМы, сети, диски) размещены в центрах обработки данных (ЦОД). Каждый дата-центр разделен на модули. Модули оснащены независимыми системами электропитания и охлаждения.
|
||||||
|
|
||||||
|
При получении доступа в публичное облако текущий пользователь становится менеджера проектов. Менеджер проектов может создавать новые проекты, в которых он получает роль владельца проекта. Владелец проекта может добавлять пользователей в проект, назначая им роли.
|
||||||
|
|
||||||
|
Доступ к проекту осуществляется из консоли управления.
|
||||||
|
|
||||||
|
## Создать проект
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. Нажмите кнопку **Создать → Проект** в правом верхнем углу.
|
||||||
|
3. Заполните информацию о проекте:
|
||||||
|
- **Название**: введите наименование проекта.
|
||||||
|
- **Идентификатор**: введите идентификатор проекта:
|
||||||
|
- допустимы строчные и прописные буквы латинского алфавита, цифры и дефис;
|
||||||
|
- длина не более 64 символов;
|
||||||
|
- не должно начинаться или заканчиваться дефисом.
|
||||||
|
- **Описание**: введите краткое описание проекта.
|
||||||
|
4. Нажмите **Создать**.
|
||||||
|
|
||||||
|
## Изменить имя проекта
|
||||||
|
|
||||||
|
::: tip Информация
|
||||||
|
Изменить имя и описание проекта может только пользователь с ролью **Владелец проекта**.
|
||||||
|
:::
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. В шапке выберите **Проекты**.
|
||||||
|
3. Откроется список проектов, в которых вы являетесь участником.
|
||||||
|
4. Нажмите на имя нужного проекта.
|
||||||
|
5. Откройте раздел **Настройки → Основное**.
|
||||||
|
6. Измените имя, описание проекта.
|
||||||
|
7. Нажмите **Сохранить**.
|
||||||
|
|
||||||
|
## Удаление проекта
|
||||||
|
|
||||||
|
Функциональность не предусмотрена в публичном облаке.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Ролевая модель
|
||||||
|
|
||||||
|
Управление проектом основано на ролевой модели.
|
||||||
|
|
||||||
|
**Базовые роли**
|
||||||
|
|
||||||
|
В проекте предусмотрен базовый набор ролей:
|
||||||
|
|
||||||
|
- **Владелец продукта** — управление пользователями проекта, просмотр ресурсов.
|
||||||
|
- **DevOps-инженер** — управление инфраструктурой, стандартное администрирование ОС UNIX по протоколу ssh и права управления виртуальными ВМами и дисками в консоли управления.
|
||||||
|
|
||||||
|
## Матрица ролей
|
||||||
|
|
||||||
|
| Действие | Владелец проекта | DevOps-инженер |
|
||||||
|
|---|---|---|
|
||||||
|
| Обзор проекта<br> (квоты и количество использованных ресурсов)| ✅ | ✅ |
|
||||||
|
| ВМы: обзор | ✅ | ✅ |
|
||||||
|
| ВМы: мониторинг | ✅ | ✅ |
|
||||||
|
| ВМы: создать ВМ |✘ | ✅ |
|
||||||
|
| ВМы: подключить диск | ✘ | ✅ |
|
||||||
|
| ВМы: отключить диск | ✘ | ✅ |
|
||||||
|
| ВМы: добавить диск | ✘ | ✅ |
|
||||||
|
| ВМы: теги | ✘ |✅ |
|
||||||
|
| ВМы: масштабирование ВМа | ✘ | ✅ |
|
||||||
|
| ВМы: выключить ВМ | ✘ | ✅ |
|
||||||
|
| ВМы: включить ВМ | ✘ | ✅ |
|
||||||
|
| ВМы: перезагрузить ВМ | ✘ | ✅ |
|
||||||
|
| ВМы: принудительно перезагрузить ВМ | ✘ | ✅ |
|
||||||
|
| ВМы: удалить ВМ | ✘ | ✅ |
|
||||||
|
| ВМы: группы размещения | ✘ | ✅ |
|
||||||
|
| ВМы: IP-адреса | ✘ | ✅ |
|
||||||
|
| Диски: просмотр дисков | ✅ | ✅ |
|
||||||
|
| Диски: добавление дискового пространства | ✘ | ✅ |
|
||||||
|
| Диски: удалить диск| ✘ | ✅ |
|
||||||
|
| Объектное хранилище: просмотр| ✅ | ✅ |
|
||||||
|
| Объектное хранилище: добавить хранилище | ✘ | ✅ |
|
||||||
|
| Объектное хранилище: удалить хранилище | ✘ | ✅|
|
||||||
|
| DNS: добавить зону | ✘ | ✅ |
|
||||||
|
| DNS: редактировать зону | ✘ | ✅ |
|
||||||
|
| DNS: удалить зону |✘ | ✅ |
|
||||||
|
| Настройки проекта: просмотр| ✅ | ✅ |
|
||||||
|
| Настройки проекта: изменить описание проекта |✅ | ✘ |
|
||||||
|
| Участники: просмотр | ✅ | ✅ |
|
||||||
|
| Участники: добавить участника | ✅ | ✘ |
|
||||||
|
| Участники: удалить участника | ✅ | ✘ |
|
||||||
|
| Участники: назначить роль | ✅| ✘ |
|
||||||
|
| Квоты: просмотр | ✅ | ✅ |
|
||||||
|
| Веб-обработчики | ✘ | ✅ |
|
||||||
|
| Наблюдаемость | ✅ | ✅ |
|
||||||
@@ -10,7 +10,7 @@ SSH-ключ добавляется на этапе [создания вирту
|
|||||||
|
|
||||||
## Добавить SSH-ключ
|
## Добавить SSH-ключ
|
||||||
|
|
||||||
1. Войдите в [личный кабинет](https://console.cloud.beeline.ru/).
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
2. Перейдите в профиль пользователя в правом верхнем углу.
|
2. Перейдите в профиль пользователя в правом верхнем углу.
|
||||||
3. Перейдите в раздел **SSH-ключи**.
|
3. Перейдите в раздел **SSH-ключи**.
|
||||||
4. Нажмите **Добавить ключ**.
|
4. Нажмите **Добавить ключ**.
|
||||||
@@ -31,14 +31,14 @@ SSH-ключ добавляется на этапе [создания вирту
|
|||||||
|
|
||||||
## Посмотреть SSH-ключи
|
## Посмотреть SSH-ключи
|
||||||
|
|
||||||
1. Войдите в [личный кабинет](https://console.cloud.beeline.ru/).
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
2. Перейдите в профиль пользователя в правом верхнем углу.
|
2. Перейдите в профиль пользователя в правом верхнем углу.
|
||||||
3. Перейдите в раздел **SSH-ключи**.
|
3. Перейдите в раздел **SSH-ключи**.
|
||||||
4. В таблице показаны SSH-ключи пользователя.
|
4. В таблице показаны SSH-ключи пользователя.
|
||||||
|
|
||||||
## Изменить название SSH-ключа
|
## Изменить название SSH-ключа
|
||||||
|
|
||||||
1. Войдите в [личный кабинет](https://console.cloud.beeline.ru/).
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
2. Перейдите в профиль пользователя в правом верхнем углу.
|
2. Перейдите в профиль пользователя в правом верхнем углу.
|
||||||
3. Перейдите в раздел **SSH-ключи**.
|
3. Перейдите в раздел **SSH-ключи**.
|
||||||
4. Выберите нужный ключ.
|
4. Выберите нужный ключ.
|
||||||
@@ -48,7 +48,7 @@ SSH-ключ добавляется на этапе [создания вирту
|
|||||||
|
|
||||||
## Удалить SSH-ключ
|
## Удалить SSH-ключ
|
||||||
|
|
||||||
1. Войдите в [личный кабинет](https://console.cloud.beeline.ru/).
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
2. Перейдите в профиль пользователя в правом верхнем углу.
|
2. Перейдите в профиль пользователя в правом верхнем углу.
|
||||||
3. Перейдите в раздел **SSH-ключи**.
|
3. Перейдите в раздел **SSH-ключи**.
|
||||||
4. Выберите нужный ключ.
|
4. Выберите нужный ключ.
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Управление пользователями в проекте
|
||||||
|
|
||||||
|
В консоли управления можно добавлять пользователей, управлять ролями пользователей в проекте. Один пользователей может участвовать в нескольких проектах и иметь в них разные роли.
|
||||||
|
|
||||||
|
::: tip Информация
|
||||||
|
Добавлять и удалять пользователей, изменять права пользователей в проекте может только владелец проекта.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Добавить пользователя
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. Откройте **Настройки → Участники**.
|
||||||
|
3. Нажмите **Добавить пользователя**.
|
||||||
|
4. Найдите пользователя по ФИО или email.
|
||||||
|
5. Назначьте [роль](../admin/roles.md) пользователю.
|
||||||
|
6. Нажмите **Добавить**.
|
||||||
|
|
||||||
|
## Назначить права пользователю
|
||||||
|
|
||||||
|
Каждому пользователю проекта должна быть выдана хотя бы одна роль. У пользователя может быть несколько ролей в одном проекте.
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. Откройте **Настройки → Участники**.
|
||||||
|
3. Найдите пользователя.
|
||||||
|
4. Нажмите ⠇ в строке с именем пользователя и выберите **Редактировать**.
|
||||||
|
5. Назначьте [роль](../admin/roles.md) пользователю: установите флажок напротив роли.
|
||||||
|
6. Нажмите **Сохранить**.
|
||||||
|
|
||||||
|
Права на существующие ОС применятся в течение 10 минут.
|
||||||
|
|
||||||
|
## Отозвать права у пользователя
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. Откройте **Настройки → Участники**.
|
||||||
|
3. Найдите пользователя.
|
||||||
|
4. Нажмите ⠇ в строке с именем пользователя и выберите **Редактировать**.
|
||||||
|
5. Отзовите роль у пользователя: уберите флажок напротив роли. Оставьте пользователю хотя бы одну роль в проекте.
|
||||||
|
6. Нажмите кнопку **Сохранить**.
|
||||||
|
|
||||||
|
## Удалить пользователя
|
||||||
|
|
||||||
|
1. Перейдите в консоль управления.
|
||||||
|
2. Откройте **Настройки → Участники**.
|
||||||
|
3. Найдите пользователя.
|
||||||
|
4. Нажмите ⠇ в строке с именем пользователя и выберите **Удалить**.
|
||||||
|
|
||||||
|
Пользователь будет удален из списка участников проекта. Ресурсы проекта станут недоступны пользователю.
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
# Чат с LLM
|
||||||
|
|
||||||
|
**Чат с LLM** - это интерфейс для общения с LLM-моделями. Подходит для знакомства и тестирования моделей.
|
||||||
|
|
||||||
|
Исходя из возможностей сервиса Чат с LLM пользовательский путь от авторизации к диалогу выглядит следующим образом:
|
||||||
|
|
||||||
|
1. Переход в чат с LLM.
|
||||||
|
2. Выбор LLM.
|
||||||
|
3. Выбор базы знаний.
|
||||||
|
4. Настройка системного промпта.
|
||||||
|
5. Диалог с LLM.
|
||||||
|
|
||||||
|
## Доступные модели
|
||||||
|
|
||||||
|
Чат с LLM поддерживает модели:.
|
||||||
|
|
||||||
|
| Модель | Контекст | Параметры | Reasoning | Инструменты | Картинки |
|
||||||
|
|:-------|:-------|:-------|:-------|:-------|:-------|
|
||||||
|
| Deepseek-chat | 131k | 671B | ✅ | ✅ | ❌ |
|
||||||
|
| Gemma 3 | 128k | 27B | ❌ | ❌ | ✅ |
|
||||||
|
| Qwen 3 | 131k | 32B | ✅ |✅ | ❌|
|
||||||
|
|
||||||
|
::: details Описание моделей
|
||||||
|
|
||||||
|
- **DeepSeek Chat**
|
||||||
|
|
||||||
|
DeepSeek V3 — это мощная гибридная модель с 671 млрд. параметров, специально оптимизированная для кодогенерации и работы поисковых агентов. Модель поддерживает контекст до 128 тыс. токенов и позволяет гибко управлять режимом рассуждений через параметр "reasoning_enabled". Она демонстрирует производительность уровня DeepSeek-R1, но работает быстрее, идеально подходя для программирования, исследований и агентных workflow.
|
||||||
|
|
||||||
|
- **Gemma 3**
|
||||||
|
|
||||||
|
Основная особенность этой модели в том, что она поддерживает картинки. Вы можете использовать ее как OCR: модель распознает рукописный текст на русском языке. Кроме этого, модель распознает и классифицирует объекты на фотографиях; может распознавать и переводить надписи.
|
||||||
|
|
||||||
|
- **Qwen 3 32B**
|
||||||
|
|
||||||
|
Основная модель, с которой рекомендуется начинать эксперименты. Поддерживает нативный вызов инструментов.
|
||||||
|
|
||||||
|
Режимы работы:
|
||||||
|
|
||||||
|
- с рассуждениями (включен по умолчанию).
|
||||||
|
- без рассуждений (нужно передать в запросе /no_think).
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Авторизация в чате с LLM
|
||||||
|
|
||||||
|
Доступ к чату с LLM-моделями предоставляется по уникальной ссылке, которая формируется после [создания тенанта](ai-setting.md#создать-тенант).
|
||||||
|
|
||||||
|
1. В левом меню откройте раздел **Тенанты**.
|
||||||
|
2. Нажмите на имя тенанта.
|
||||||
|
3. Из поля **Url приложения** скопируйте ссылку на чат с LLM.
|
||||||
|
4. Вставьте ссылку в браузер. Откроется чат с LLM.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
::: details Интерфейс чата с LLM
|
||||||
|
|
||||||
|
- **Чат**
|
||||||
|
|
||||||
|
Раздел включает функции:
|
||||||
|
|
||||||
|
- диалог с моделью в режиме вопрос-ответ;
|
||||||
|
- выбор LLM;
|
||||||
|
- выбор базы знаний.
|
||||||
|
|
||||||
|
- **Базы знаний**
|
||||||
|
|
||||||
|
Раздел предназначен для подготовки базы знаний, на основе которой модель будет генерировать ответы.
|
||||||
|
|
||||||
|
- **Системные промпты**
|
||||||
|
|
||||||
|
Раздел предназначен для создания системных промптов. Системный промпт представляет из себя набор инструкций, на которые опирается модель при подготовке ответа на запрос пользователя.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Начать диалог с моделью
|
||||||
|
|
||||||
|
1. [Авторизоваться в чате с LLM](#авторизация-в-чате-с-llm).
|
||||||
|
2. В левом меню выберите раздел **Чаты**.
|
||||||
|
3. Выберите из списка модель. Если в списке отсутствует нужная [модель](#доступные-модели), то [добавьте модель](ai-setting.md#добавить-модель) в тенант.
|
||||||
|
|
||||||
|
::: tip Информация
|
||||||
|
|
||||||
|
Эксперименты рекомендуется с модели **Qwen 3 32B**, которая имеет больший контекст и поддерживает нативный вызов инструментов.
|
||||||
|
|
||||||
|
Модель **Qwen 3 32B** может работать:
|
||||||
|
- [с рассуждениями](ai-glossary.md#рассуждения) - этот режим включен по умолчанию;
|
||||||
|
- без рассуждений - в этом случае нужно передать в запросе `/no_think`.
|
||||||
|
|
||||||
|
:::
|
||||||
|
4. (опционально) Выберите базу знаний, на основе которой модель составит ответ. Если список баз данных пуст, то [создайте](#создать-базу-знаний) базу знаний.
|
||||||
|
5. (опциоанльно) Выберите системный промпт. По умолчанию в чате задан системный промпт. Если необходим промпт под определенную задачу, то [измените](#редактировать-системный-промпт) системный промпт.
|
||||||
|
6. Введите запрос к модели. Дождитесь ответа.
|
||||||
|
|
||||||
|
## Использовать базу знаний
|
||||||
|
|
||||||
|
Если необходимо, чтобы модель генерировала ответы не на базе своего раннего обучения, а обращалась, например, к актуальной нормативной базе или актуальным тарифам, то необходимо указать [базу знаний](ai-glossary.md#база-знаний-rag), с которой чат должен расширить свой контекст.
|
||||||
|
|
||||||
|
Для этого необходимо выбрать базу знаний и продолжить диалог.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Если база знаний отсутствует в списке, то [создайте](#создать-базу-знаний) базу знаний и добавьте документы.
|
||||||
|
|
||||||
|
### Создать базу знаний
|
||||||
|
|
||||||
|
1. [Авторизоваться в чате с LLM](#авторизация-в-чате-с-llm).
|
||||||
|
2. В левом меню выберите раздел **Базы знаний**.
|
||||||
|
3. Нажмите кнопку **Создать базу знаний**.
|
||||||
|
4. Заполните параметры базы знаний:
|
||||||
|
- **Имя**: введите имя базы знаний, имя будет отображаться при выборе базы знаний в чате.
|
||||||
|
- **Описание**: введите описание базы знаний.
|
||||||
|
5. Нажмите кнопку **Создать**.
|
||||||
|
|
||||||
|
База знаний будет создана, но в ней пока нет информации для генерации ответов модели. Добавьте документы в базу знаний.
|
||||||
|
|
||||||
|
### Добавить документ в базу знаний
|
||||||
|
|
||||||
|
1. [Авторизоваться в чате с LLM](#авторизация-в-чате-с-llm).
|
||||||
|
2. В левом меню выберите раздел **Базы знаний**.
|
||||||
|
3. В списке нажмите на нужную базу знаний.
|
||||||
|
4. Нажмите кнопку **Добавить документ**.
|
||||||
|
5. Загрузите файлы в базу знаний.
|
||||||
|
6. Нажмите **Добавить**.
|
||||||
|
|
||||||
|
## Редактировать системный промпт
|
||||||
|
|
||||||
|
По умолчанию задан простой "размытый" [промпт](ai-glossary.md#промпт), который указывает, что ответы модели должны быть полезными. Но такой чат не всегда сможет предоставить пользователю ответ, который его устроит.
|
||||||
|
|
||||||
|
В чате с LLM доступен редактор системных промптов. Возможны способы редактирования системных промптов:
|
||||||
|
|
||||||
|
- редактирование системного промпта в текущей сессии диалога с моделью;
|
||||||
|
- создание системного промпта в библиотеке системных промптов для дальнейшего использования.
|
||||||
|
|
||||||
|
### Редактирование системного промпта в текущей сессии
|
||||||
|
|
||||||
|
1. [Начните](#начать-диалог-с-моделью) диалог с моделью.
|
||||||
|
2. Системный промпт отображается над строкой для ввода текста в чате.
|
||||||
|
3. Нажмите на значок карандаша справа от системного промпта.
|
||||||
|
4. В появившемся окне справа введите содержимое промпта.
|
||||||
|
5. Нажмите кнопку **Сохранить**.
|
||||||
|
6. Содержимое системного промпта обновится.
|
||||||
|
|
||||||
|
Редактируемый системный промпт доступен для всех моделей и сохраняется только в рамках текущей сессии.
|
||||||
|
|
||||||
|
### Создать системный промпт
|
||||||
|
|
||||||
|
1. [Авторизоваться в чате с LLM](#авторизация-в-чате-с-llm).
|
||||||
|
2. В левом меню выберите раздел **Системные промпты**.
|
||||||
|
3. Нажмите кнопку **Создать системный промпт**.
|
||||||
|
4. Заполните параметры промпта:
|
||||||
|
- **Название**: введите название системного промпта.
|
||||||
|
- **Содержание**: введите содержание промпта.
|
||||||
|
5. Нажмите **Создать**.
|
||||||
|
|
||||||
|
Системный промпт добавлен в библиотеку системных промптов. Посмотреть список промптов можно в левом меню в разделе **Системные промпты**.
|
||||||
|
|
||||||
|
## Сменить тенант
|
||||||
|
|
||||||
|
В чате с LLM-моделями есть возможность работать сразу с несколькими [тенантами](ai-setting.md#создать-тенант).
|
||||||
|
|
||||||
|
Для смены текущего тенанта необходимо:
|
||||||
|
|
||||||
|
1. В верхнем меню нажмите на вкладку **Тенант**.
|
||||||
|
2. Выберите из списка тенант.
|
||||||
|
|
||||||
|
К тенанта привязаны сущности:
|
||||||
|
|
||||||
|
- модели;
|
||||||
|
- базы знаний;
|
||||||
|
- системные промпты.
|
||||||
|
|
||||||
|
Для каждого тенанта эти сущности будут отличаться.
|
||||||
|
|
||||||
|
## Очистить контекст диалога
|
||||||
|
|
||||||
|
При длительном диалоге модель накапливает [контекст](ai-glossary.md#контекст) и может начать генерировать неточные ответы ("галлюцинации"). Для предотвращения "галлюцинации" рекомендуется периодически очищать контекст диалога.
|
||||||
|
|
||||||
|
Для очистки контекста диалога нажмите на значок корзины в правом верхнем углу окна чата.
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Быстрый старт с AI платформа
|
||||||
|
|
||||||
|
Данная инструкция рассматривает начальную настройку сервиса **AI платформа** и отправку первого запроса к LLM-модели.
|
||||||
|
|
||||||
|
## Перед началом работы
|
||||||
|
|
||||||
|
- [Зарегистрируйтесь](../start/getting-started.md#1-регистрация-в-beeline-cloud) в личном кабинете Beeline Cloud.
|
||||||
|
|
||||||
|
## 1. Создать тенант
|
||||||
|
|
||||||
|
1. В верхнем меню нажмите на пункт **Сервисы**.
|
||||||
|
2. Выберите **Сервис AI платфома**.
|
||||||
|
3. В левом меню откройте раздел **Тенанты**.
|
||||||
|
4. Нажмите кнопку **Создать тенант**.
|
||||||
|
5. Введите имя тенанта.
|
||||||
|
6. Нажмите **Создать тенант**.
|
||||||
|
|
||||||
|
## 2. Добавить модель
|
||||||
|
|
||||||
|
1. В левом меню откройте раздел **Модель**.
|
||||||
|
2. Нажмите кнопку **Добавить модель**.
|
||||||
|
3. В поле **Тенант** выберите созданный тенант.
|
||||||
|
4. В поле **Модель** выберите из списка подходящую **LLM-модель**.
|
||||||
|
5. Установите лимит использования токенов в час.
|
||||||
|
6. Нажмите **Добавить модель**.
|
||||||
|
|
||||||
|
## 3. Перейти в чат с LLM
|
||||||
|
|
||||||
|
Протестировать модели в интерфейсе можно в чате с LLM. Доступ к чату с LLM-моделями предоставляется по уникальной ссылке, которая формируется после создания тенанта.
|
||||||
|
|
||||||
|
1. В левом меню откройте раздел **Тенанты**.
|
||||||
|
2. Нажмите на имя тенанта.
|
||||||
|
3. Из поля **Url приложения** скопируйте ссылку на чат с LLM.
|
||||||
|
4. Вставьте ссылку в браузер.
|
||||||
|
|
||||||
|
## 4. Создать системный промпт
|
||||||
|
|
||||||
|
1. В чате с LLM в левом меню откройте раздел **Системные промпты**.
|
||||||
|
2. Нажмите кнопку **Создать системный промпт**.
|
||||||
|
3. Заполните параметры промпта:
|
||||||
|
- **Название**: введите название систменого промпта;
|
||||||
|
- **Содержание**: введите содержание промпта.
|
||||||
|
4. Нажмите **Создать**.
|
||||||
|
|
||||||
|
## 5. Начать диалог с моделью
|
||||||
|
|
||||||
|
1. В чате с LLM-моделями в левом меню перейдите в раздел **Чат**.
|
||||||
|
2. Выберите из списка модель.
|
||||||
|
3. Выберите из списка системный промпт.
|
||||||
|
4. Откроется чат. В текстовом поле внизу введите запрос к LLM-модели.
|
||||||
|
5. Дождитесь ответа модели.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Концепции
|
||||||
|
|
||||||
|
## База знаний (RAG)
|
||||||
|
|
||||||
|
RAG — это подход, при котором ответ LLM формируется с использованием дополнительного источника актуальных данных.
|
||||||
|
|
||||||
|
## Контекст
|
||||||
|
|
||||||
|
Контекст — это ограниченное по размеру окно, в которое должен уместиться запрос к LLM. У каждой модели контекст строго ограничен и указан в документации к ней.
|
||||||
|
|
||||||
|
## Рассуждения
|
||||||
|
|
||||||
|
Reasoning (рассуждение или логическое мышление) у LLM — это способность модели не просто воспроизводить выученные паттерны текста, а последовательно и логически выводить новую информацию из уже известных ей данных.
|
||||||
|
|
||||||
|
|
||||||
|
## Промпт
|
||||||
|
|
||||||
|
Промпт — это текстовый запрос, который вы отправляете модели, и который задает контекст и направление для ответа. LLM анализирует промпт и генерирует ответ, который является логическим продолжением текста. Чем понятнее и конкретнее сформулирован промпт, тем качественнее будет ответ.
|
||||||
|
|
||||||
|
Системные промпты — специальные инструкции, которые задают общие рамки поведения модели на протяжении всего диалога. Системный промпт устанавливается в начале общения и сообщает модели, какую роль она должна играть, какие ограничения соблюдать и какой стиль общения использовать.
|
||||||
|
|
||||||
|
В сервисе **AI-платформа** системный промпт доступен для редактирования, чтобы пользователи могли максимально настраивать поведение моделей.
|
||||||
|
|
||||||
|
## Токен
|
||||||
|
|
||||||
|
LLM представляет текст не в виде слов или букв, а в виде токенов. Токен — это несколько букв (часть слова), которые часто встречаются рядом в обучающей выборке. Текст запроса, который вы отправляете в LLM, сначала нарезается на токены, и только потом обрабатывается моделью.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Обзор сервиса
|
||||||
|
|
||||||
|
Сервис **AI платфома** предоставляет доступ к большим языковым моделям (Large Language Models, LLM). LLM-модели готовы к использованию и избавляют пользователя от необходимости самостоятельного развертывания и изучения связанных технологий.
|
||||||
|
|
||||||
|
## Возможности сервиса
|
||||||
|
|
||||||
|
- Интерфейс для взаимодействия с моделями в формате чат-бота.
|
||||||
|
- Предоставляет различные [модели](ai-chat-llm.md#доступные-модели).
|
||||||
|
- Использование баз знаний (RAG).
|
||||||
|
- Редактирование системного промпта.
|
||||||
|
- Диалог с моделью.
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
# Управление сервисом
|
||||||
|
|
||||||
|
В разделе рассмотрены компоненты сервиса **AI платформа** и приведены пошаговые инструкции по их созданию и управлению компонентами.
|
||||||
|
|
||||||
|
## Создать тенант
|
||||||
|
|
||||||
|
**Тенант** представляет собой изолированный логический контейнер ресурсов сервиса (модели, базы знаний) для работы в рамках проекта. Создается в личном кабинете Beeline Cloud.
|
||||||
|
|
||||||
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
|
2. В верхнем меню нажмите на раздел **Сервисы**.
|
||||||
|
3. Выберите **Сервис AI платформа**.
|
||||||
|
4. В левом меню откройте раздел **Тенанты**.
|
||||||
|
5. Нажмите кнопку **Создать тенант**.
|
||||||
|
6. Введите имя тенанта.
|
||||||
|
7. Нажмите **Создать тенант**.
|
||||||
|
|
||||||
|
## Добавить модель
|
||||||
|
|
||||||
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
|
2. В верхнем меню нажмите на раздел **Сервисы**.
|
||||||
|
3. Выберите **Сервис AI платформа**.
|
||||||
|
4. В левом меню откройте раздел **Модели**.
|
||||||
|
5. Нажмите кнопку **Добавить модель**.
|
||||||
|
6. Заполните параметры модели:
|
||||||
|
- **Тенант**: выберите тенант, в котором будет использоваться модель.
|
||||||
|
- **Модель**: выберите из списка подходящую LLM-модель.
|
||||||
|
- **Токены**: введите лимит использования токенов в час.
|
||||||
|
7. Нажмите кнопку **Добавить модель**.
|
||||||
|
|
||||||
|
## Добавить базу знаний
|
||||||
|
|
||||||
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
|
2. В верхнем меню нажмите на раздел **Сервисы**.
|
||||||
|
3. Выберите **Сервис AI платформа**.
|
||||||
|
4. В левом меню откройте раздел **База знаний**.
|
||||||
|
5. Нажмите кнопку **Создать базу знаний**.
|
||||||
|
6. Заполните параметры базы знаний:
|
||||||
|
- **Тенант**: выберите из списка тенант.
|
||||||
|
- **Имя**: введите имя базы знаний.
|
||||||
|
- **Описание**: введите описание базы знаний.
|
||||||
|
7. Нажмите **Создать базу знаний**.
|
||||||
|
|
||||||
|
[Наполнение базы знаний](ai-chat-llm.md#добавить-документ-в-базу-знаний) документами, на основании которых будет генерироваться ответ модели, выполняется в чате с LLM.
|
||||||
|
|
||||||
|
## Удалить тенант, модель, базу знаний
|
||||||
|
|
||||||
|
1. Войдите в [личный кабинет](https://lk.cloud.beeline.ru/).
|
||||||
|
2. В верхнем меню нажмите на раздел **Сервисы**.
|
||||||
|
3. Выберите **Сервис AI платформа**.
|
||||||
|
4. Откройте раздел c нужным компонентом сервиса:
|
||||||
|
- **Тенанты**,
|
||||||
|
- **Модели**,
|
||||||
|
- **Базы знаний**.
|
||||||
|
5. В таблице найдите строку с нужным компонентом сервиса.
|
||||||
|
6. Нажмите … и выберите **Удалить**.
|
||||||
|
7. В открывшемся окне подтвердите операцию, нажав **Удалить**.
|
||||||
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
section_links:
|
||||||
|
- title: Обзор сервиса
|
||||||
|
link: /ai/ai-overview-platform.md
|
||||||
|
description: Обзор сервиса, решаемые задачи
|
||||||
|
- title: Быстрый старт
|
||||||
|
link: /ai/ai-getting-started.md
|
||||||
|
description: Создание виртуальной машины в дата-центре
|
||||||
|
- title: Настройка сервиса
|
||||||
|
link: /ai/ai-setting.md
|
||||||
|
description: Создание тенанта, добавление моделей и базы знаний
|
||||||
|
- title: Чат с LLM
|
||||||
|
link: /ai/ai-chat-llm.md
|
||||||
|
description: Интерфейс для взаимодействия с LLM-моделями в формате чат-бота
|
||||||
|
- title: Концепции
|
||||||
|
link: /ai/ai-glossary.md
|
||||||
|
description: Основные понятия, используемые в сервисе
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# AI платформа
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/themes' as *;
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--app-navbar-height: #{$app-navbar-height};
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
html.dark-theme {
|
||||||
|
background-color: $color-background-base;
|
||||||
|
color: $color-text-active;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited {
|
||||||
|
color: $color-text-active !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
@import 'variables';
|
||||||
|
@import 'base';
|
||||||
|
@import 'form';
|
||||||
|
@import 'helpers';
|
||||||
|
@import 'components';
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// Navbar
|
||||||
|
$app-navbar-height: 3.5rem;
|
||||||
|
$app-header-height: 64px;
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/themes' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/components/fab' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/components/button' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/globals' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/mixin';
|
||||||
|
|
||||||
|
@mixin fab_button {
|
||||||
|
background-color: $button-overlay-background-color;
|
||||||
|
padding-left: $button-only-text-small-padding-horizontal;
|
||||||
|
padding-right: $button-only-text-small-padding-horizontal;
|
||||||
|
letter-spacing: $button-small-text-font-letter-spacing;
|
||||||
|
line-height: $button-small-text-font-line-height;
|
||||||
|
font-size: $button-small-text-font-size;
|
||||||
|
height: $button-small-height;
|
||||||
|
color: $button-overlay-text-color;
|
||||||
|
box-shadow: none;
|
||||||
|
border: 1px solid $button-outline-border-color;
|
||||||
|
border-radius: $button-border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: $button-overlay-background-color-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-fab {
|
||||||
|
height: $fab-standard-height;
|
||||||
|
width: $fab-standard-width;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 50;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
border: 0;
|
||||||
|
padding: $fab-standard-padding;
|
||||||
|
letter-spacing: $fab-text-font-letter-spacing;
|
||||||
|
line-height: $fab-text-font-line-height;
|
||||||
|
font-size: $fab-text-font-size;
|
||||||
|
font-weight: $fab-text-font-weight;
|
||||||
|
box-shadow: $fab-shadow;
|
||||||
|
background-color: $color-background-inverse;
|
||||||
|
color: $color-text-active-inverse;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&__icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
// background-color: $fab-hover-background-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--focused {
|
||||||
|
border-color: $fab-focused-border-color;
|
||||||
|
border-width: $fab-focused-border-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--mini {
|
||||||
|
height: $fab-mini-height;
|
||||||
|
width: $fab-mini-width;
|
||||||
|
border-radius: $fab-mini-border-radius;
|
||||||
|
padding: $fab-mini-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--extended {
|
||||||
|
height: $fab-extended-height;
|
||||||
|
border-radius: $fab-extended-border-radius;
|
||||||
|
padding-right: $fab-extended-padding-right;
|
||||||
|
padding-left: $fab-extended-padding-left;
|
||||||
|
|
||||||
|
& &__icon {
|
||||||
|
margin-right: $fab-extended-icon-spacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-fab--extended.app-fab--mini {
|
||||||
|
height: $fab-mini-height;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--disabled {
|
||||||
|
opacity: $fab-disabled-opacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-fab-dialog {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 44px;
|
||||||
|
right: 0;
|
||||||
|
// background-color: $color-background-medium;
|
||||||
|
background-color: transparent;
|
||||||
|
// border-radius: 12px;
|
||||||
|
padding: 1rem;
|
||||||
|
// border: 1px solid $color-border;
|
||||||
|
// min-width: 300px;
|
||||||
|
// box-shadow: $elevation-medium;
|
||||||
|
|
||||||
|
.icon-contained {
|
||||||
|
display: inline-flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: $color-status-neutral-background;
|
||||||
|
color: $color-status-neutral;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#feedback_button {
|
||||||
|
@include fab_button();
|
||||||
|
}
|
||||||
|
|
||||||
|
#bug_button {
|
||||||
|
@include fab_button();
|
||||||
|
line-height: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a#bug_button,
|
||||||
|
a#bug_button:visited,
|
||||||
|
a#bug_button:active {
|
||||||
|
color: $button-overlay-text-color !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@import 'fab';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/components/formfield' as formfield;
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/components/textarea' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/components/formfield';
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/themes';
|
||||||
|
|
||||||
|
.textarea-field {
|
||||||
|
$px: 16px;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
padding: $textarea-without-label-medium-text-margin-top $px $textarea-text-margin-bottom;
|
||||||
|
height: $textarea-without-label-medium-height;
|
||||||
|
background: formfield.$formfield-background-color;
|
||||||
|
border: formfield.$formfield-border-width formfield.$formfield-border-style formfield.$formfield-border-color;
|
||||||
|
border-radius: formfield.$formfield-border-radius;
|
||||||
|
|
||||||
|
& &__label {
|
||||||
|
position: absolute;
|
||||||
|
top: $textarea-with-label-text-margin-top;
|
||||||
|
left: $px;
|
||||||
|
transition: font-size 300ms ease-out;
|
||||||
|
color: formfield.$formfield-label-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
& textarea {
|
||||||
|
height: $textarea-medium-text-height;
|
||||||
|
width: 100%;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
resize: none;
|
||||||
|
background-color: transparent;
|
||||||
|
color: themes.$color-text-active;
|
||||||
|
}
|
||||||
|
|
||||||
|
& &__resizer {
|
||||||
|
position: absolute;
|
||||||
|
bottom: $textarea-resizer-margin-bottom;
|
||||||
|
right: $textarea-resizer-margin-right;
|
||||||
|
rotate: -45deg;
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: nwse-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
display: flex;
|
||||||
|
background-color: darkslategrey;
|
||||||
|
width: 10px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
right: -3px;
|
||||||
|
bottom: -2px;
|
||||||
|
background-color: darkslategrey;
|
||||||
|
width: 4px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.textarea-field--with-label {
|
||||||
|
height: $textarea-with-label-medium-height;
|
||||||
|
padding-top: $textarea-with-label-text-margin-top;
|
||||||
|
|
||||||
|
&.textarea-field--floated .textarea-field__label {
|
||||||
|
top: $textarea-medium-label-floated-margin-top;
|
||||||
|
line-height: $textarea-small-label-floated-font-line-height;
|
||||||
|
font-size: $textarea-small-label-floated-font-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.textarea-field--small {
|
||||||
|
height: $textarea-with-label-small-height;
|
||||||
|
padding-top: $textarea-small-label-margin-top;
|
||||||
|
top: $textarea-small-label-floated-margin-top;
|
||||||
|
|
||||||
|
& .textarea-field__label {
|
||||||
|
font-size: $textarea-small-label-font-size;
|
||||||
|
font-weight: $textarea-small-label-font-weight;
|
||||||
|
letter-spacing: $textarea-small-label-font-letter-spacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.textarea-field--focused {
|
||||||
|
border-color: formfield.$formfield-border-color-focus;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.textarea-field--small {
|
||||||
|
padding-top: $textarea-without-label-small-text-margin-top;
|
||||||
|
height: $textarea-without-label-small-height;
|
||||||
|
|
||||||
|
& textarea {
|
||||||
|
height: $textarea-small-text-height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/components/textfield' as *;
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/globals';
|
||||||
|
@use '@beeline/design-tokens/scss/tokens/themes' as theme;
|
||||||
|
|
||||||
|
.textfield {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: globals.$size-control-height-medium;
|
||||||
|
border: globals.$size-border-width-regular solid transparent;
|
||||||
|
padding-top: $textfield-without-label-medium-text-margin-vertical;
|
||||||
|
padding-bottom: $textfield-without-label-medium-text-margin-vertical;
|
||||||
|
background-color: theme.$color-control-background;
|
||||||
|
border-radius: 12px; // globals.$size-border-radius-x6;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: theme.$color-control-background-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
// input
|
||||||
|
input {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// label
|
||||||
|
&--with-label {
|
||||||
|
// padding-top: $textfield-with-label-medium-text-margin-top;
|
||||||
|
// padding-bottom: $textfield-with-label-medium-text-margin-bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
// padding-top: $textfield-medium-label-margin-top;
|
||||||
|
|
||||||
|
&.textfield__label--floated {
|
||||||
|
// padding-top: $textfield-medium-label-margin-top-floated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// small
|
||||||
|
&--small {
|
||||||
|
height: globals.$size-control-height-small;
|
||||||
|
}
|
||||||
|
|
||||||
|
// large
|
||||||
|
&--large {
|
||||||
|
height: globals.$size-control-height-large;
|
||||||
|
padding-top: $textfield-without-label-large-text-margin-vertical;
|
||||||
|
padding-bottom: $textfield-without-label-large-text-margin-vertical;
|
||||||
|
|
||||||
|
&.textfield--with-label {
|
||||||
|
padding-top: $textfield-with-label-large-text-margin-top;
|
||||||
|
padding-bottom: $textfield-with-label-large-text-margin-bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
.textfield__label {
|
||||||
|
padding-top: $textfield-large-label-margin-top;
|
||||||
|
|
||||||
|
&.textfield__label--floated {
|
||||||
|
padding-top: $textfield-large-label-margin-top-floated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// states
|
||||||
|
&--focused {
|
||||||
|
border-color: theme.$color-border-focus;
|
||||||
|
background-color: theme.$color-background-base;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/themes' as *;
|
||||||
|
|
||||||
|
.app-bg-status-error {
|
||||||
|
background-color: $color-status-error-background;
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.app-cursor-pointer {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@import 'text';
|
||||||
|
@import 'color';
|
||||||
|
@import 'media';
|
||||||
|
@import 'common';
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
@use "sass:map";
|
|
||||||
|
|
||||||
// @deprecated
|
// @deprecated
|
||||||
@mixin media($minWidth, $maxWidth) {
|
@mixin media($minWidth, $maxWidth) {
|
||||||
@media (min-width: $minWidth) and (max-width: $maxWidth) {
|
@media (min-width: $minWidth) and (max-width: $maxWidth) {
|
||||||
@@ -29,7 +27,7 @@ $breakpoints: (
|
|||||||
);
|
);
|
||||||
|
|
||||||
@mixin max($breakpoint) {
|
@mixin max($breakpoint) {
|
||||||
$value: map.get($breakpoints, $breakpoint);
|
$value: map-get($breakpoints, $breakpoint);
|
||||||
|
|
||||||
@if $value {
|
@if $value {
|
||||||
@media (max-width: $value) {
|
@media (max-width: $value) {
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
@use '@beeline/design-tokens/scss/tokens/themes' as theme;
|
||||||
|
@use 'src/assets/scss/app/mixins' as mixins;
|
||||||
|
|
||||||
|
@mixin truncate {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin truncate-lines($lines: 2) {
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: $lines;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-text-active {
|
||||||
|
color: theme.$color-text-active;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-text-inactive {
|
||||||
|
color: theme.$color-text-inactive;
|
||||||
|
}
|
||||||
|
|
||||||
|
// styles for hyperlinks
|
||||||
|
.app-link {
|
||||||
|
color: theme.$color-text-active;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: theme.$color-text-active;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-text-caption {
|
||||||
|
@include mixins.text-caption;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-text-truncate {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sizes
|
||||||
|
.app-text-size-subtitle-3 {
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-text-size-body-3 {
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 18px;
|
||||||
|
letter-spacing: 0.2px;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Colors
|
||||||
|
.app-text-color-caption {
|
||||||
|
color: theme.$color-text-inactive;
|
||||||
|
}
|
||||||
|
.app-text-warning {
|
||||||
|
color: theme.$color-status-warning;
|
||||||
|
}
|
||||||
|
.app-text-info {
|
||||||
|
color: theme.$color-status-info;
|
||||||
|
}
|
||||||
|
.app-text-error {
|
||||||
|
color: theme.$color-status-error;
|
||||||
|
}
|
||||||
|
.app-text-success {
|
||||||
|
color: theme.$color-status-success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Breaks
|
||||||
|
.app-break-keep-all {
|
||||||
|
word-break: keep-all;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@import 'spinner';
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
@use 'src/assets/scss/app/variables' as v;
|
||||||
|
|
||||||
|
.app-loading-screen {
|
||||||
|
display: block;
|
||||||
|
height: calc(100vh - v.$app-header-height);
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
@forward 'text';
|
||||||