docs: refactor docs structure

This commit is contained in:
3252a8
2026-05-26 23:31:04 +03:00
parent c3381bdd31
commit 11048a6ed8
26 changed files with 203 additions and 192 deletions
+10 -15
View File
@@ -13,14 +13,16 @@ export default defineConfig({
plugins: [
starlightThemeNova({
nav: [
{ label: 'Главная', href: '/' },
{ label: 'Установка', href: '/getting-started/setup/' },
{ label: 'Платежи', href: '/features/payments/' },
{ label: 'GitHub', href: 'https://github.com/3252a8/remnawave-minishop' },
{ label: 'Telegram', href: 'https://t.me/remnawave_minishop' }
],
}),
],
customCss: ['./src/styles/custom.css'],
components: {
Header: './src/components/Header.astro',
},
lastUpdated: false,
locales: {
root: {
@@ -56,18 +58,16 @@ export default defineConfig({
{
label: 'Начало',
items: [
{ label: 'Главная', link: '/' },
{ label: 'Обзор', slug: 'getting-started/overview' },
{ label: 'Установка', slug: 'getting-started/setup' },
{ label: 'Архитектура', slug: 'reference/architecture' },
{ label: 'Развертывание', slug: 'reference/deployment' },
{ label: 'Развертывание', slug: 'getting-started/deployment' },
{ label: 'Настройка окружения', slug: 'getting-started/configuration' },
],
},
{
label: 'Конфигурация',
items: [
{ label: 'Переменные', slug: 'configuration/env-vars' },
{ label: 'Настройка окружения', slug: 'reference/configuration' },
{ label: 'Переменные окружения', slug: 'configuration/env-vars' },
{ label: 'Безопасность', slug: 'configuration/security' },
],
},
@@ -84,13 +84,6 @@ export default defineConfig({
{ label: 'Поддержка пользователей / тикеты', slug: 'features/support' },
],
},
{
label: 'Администрирование',
items: [
{ label: 'Пользователи', slug: 'administration/users' },
{ label: 'Обслуживание', slug: 'administration/maintenance' },
],
},
{
label: 'Миграции',
items: [
@@ -99,10 +92,12 @@ export default defineConfig({
],
},
{
label: 'Устранение неполадок',
label: 'Справка',
items: [
{ label: 'Проблемы', slug: 'troubleshooting/issues' },
{ label: 'Логи', slug: 'troubleshooting/logs' },
{ label: 'Обслуживание', slug: 'troubleshooting/maintenance' },
{ label: 'Архитектура', slug: 'reference/architecture' },
],
},
],
+7 -8
View File
@@ -11,6 +11,8 @@ const descriptions = {
'index.md': 'Документация по запуску, настройке и сопровождению Telegram Mini App для Remnawave.',
'getting-started/overview.md': 'Что входит в Remnawave Minishop и как связаны бот, Mini App, backend, worker и Remnawave Panel.',
'getting-started/setup.md': 'Минимальный путь запуска Remnawave Minishop через Docker Compose.',
'getting-started/configuration.md': 'Минимальный .env, bootstrap-секреты и настройка через Web App админку.',
'getting-started/deployment.md': 'Docker Compose, обратный прокси, TLS, образы, обновления и резервные копии.',
'configuration/security.md': 'Секреты, публичные URL, доступ администраторов и базовые меры защиты Minishop.',
'configuration/env-vars.md': 'Полный справочник переменных окружения Remnawave Minishop.',
'features/core.md': 'Пользовательские и админские сценарии Remnawave Minishop.',
@@ -23,13 +25,10 @@ const descriptions = {
'features/support.md': 'Пользовательские тикеты, список обращений в админке, уведомления и лимиты поддержки.',
'migrations/index.md': 'Готовые сценарии миграции в Remnawave Minishop с других ботов.',
'migrations/remnawave-tg-shop.md': 'Перенос данных со старого remnawave-tg-shop на split-архитектуру Minishop.',
'administration/users.md': 'Где управлять пользователями, подписками, блокировками и поддержкой.',
'administration/maintenance.md': 'Обновления, миграции, резервные копии и проверки продакшен-стека.',
'troubleshooting/issues.md': 'Короткие чеклисты для частых проблем запуска, вебхуков, Mini App и платежей.',
'troubleshooting/logs.md': 'Какие логи смотреть при диагностике backend, worker, frontend, миграций и вебхуков.',
'troubleshooting/maintenance.md': 'Обновления, миграции, резервные копии и проверки продакшен-стека.',
'architecture.md': 'Краткая архитектура backend, frontend, worker и инфраструктурных сервисов.',
'configuration.md': 'Минимальный .env, bootstrap-секреты и настройка через Web App админку.',
'deployment.md': 'Docker Compose, обратный прокси, TLS, образы, обновления и резервные копии.',
};
const imageExtensions = new Set(['.avif', '.gif', '.jpeg', '.jpg', '.png', '.svg', '.webp']);
@@ -98,11 +97,11 @@ function extraFrontmatter(sourceRelativePath) {
' image:',
' html: \'<img class="minishop-hero-screenshot" src="/remnawave-minishop.webp" alt="Интерфейс Remnawave Minishop" width="1920" height="1080" loading="eager" decoding="async" />\'',
' actions:',
' - text: "Быстрый старт"',
' link: /getting-started/setup/',
' - text: "Обзор"',
' link: /getting-started/overview/',
' icon: right-arrow',
' - text: "Развертывание"',
' link: /reference/deployment/',
' - text: "Установка"',
' link: /getting-started/setup/',
' icon: setting',
' variant: minimal',
];
+104
View File
@@ -0,0 +1,104 @@
---
import type { StarlightRouteData } from '@astrojs/starlight/route-data'
import { Icon } from '@astrojs/starlight/components'
import LanguageSelect from 'virtual:starlight/components/LanguageSelect'
import Search from 'virtual:starlight/components/Search'
import SiteTitle from 'virtual:starlight/components/SiteTitle'
import SocialIcons from 'virtual:starlight/components/SocialIcons'
import ThemeSelect from 'virtual:starlight/components/ThemeSelect'
import config from 'virtual:starlight/user-config'
import MobileMenuToggle from 'starlight-theme-nova/components/MobileMenuToggle.astro'
import options from 'virtual:starlight-theme-nova/user-config'
const { hasSidebar } = Astro.locals.starlightRoute
const nav = options.nav ?? []
const route = Astro.locals.starlightRoute
function getI18nText(
value: string | Record<string, string>,
route: StarlightRouteData,
): string {
if (typeof value === 'string') {
return value
}
const { lang, locale } = route
if (value[lang]) {
return value[lang]
}
if (config.defaultLocale.lang === lang || config.defaultLocale.locale === locale) {
if (value.root) {
return value.root
}
}
if (locale && value[locale]) {
return value[locale]
}
throw new Error(`Unable to find the translation for language "${lang}".`)
}
function navIcon(href: string) {
if (href.includes('github.com/3252a8/remnawave-minishop')) {
return 'github'
}
if (href.includes('t.me/remnawave_minishop')) {
return 'telegram'
}
return undefined
}
---
<div class="box-border flex h-full items-center gap-2">
<div
class:list={[
'-m-3 overflow-clip p-3',
'flex min-w-0',
]}
>
<SiteTitle />
</div>
<nav
class="flex flex-1 flex-row gap-4 overflow-x-auto py-3 pr-4 pl-4 text-sm font-medium max-md:**:hidden xl:gap-6 xl:pl-6"
>
{
nav.map((item) => {
const href = getI18nText(item.href, route)
const label = getI18nText(item.label, route)
const icon = navIcon(href)
return (
<a
class:list={[
'-m-1.5 rounded-md p-1.5 text-(--sl-color-gray-3) no-underline hover:text-(--sl-color-white) focus-visible:outline-offset-0',
icon && 'minishop-header-link inline-flex items-center',
]}
href={href}
>
{icon && <Icon name={icon} size="1rem" color="currentColor" />}
<span>{label}</span>
</a>
)
})
}
</nav>
<div class="flex md:max-w-60 md:flex-1 print:hidden">
<Search />
</div>
<div class="hidden items-center gap-2 md:flex print:hidden">
<SocialIcons />
<LanguageSelect />
<ThemeSelect />
</div>
{
hasSidebar && (
<div class="flex items-center gap-2 md:hidden print:hidden">
<MobileMenuToggle />
</div>
)
}
</div>
+8
View File
@@ -12,6 +12,14 @@
color: #00fe7a;
}
.minishop-header-link {
column-gap: 0.625rem;
}
.minishop-header-link svg {
flex-shrink: 0;
}
.hero {
gap: clamp(2rem, 6vw, 5rem);
padding-block: clamp(3.5rem, 10vw, 6.5rem);