From 173708addb75ac8f23e636b4eb2b159941a95302 Mon Sep 17 00:00:00 2001 From: Zotov Ivan Yuryevich Date: Thu, 16 Apr 2026 22:01:47 +0300 Subject: [PATCH] feat: vendors seeding script --- package.json | 3 +- scripts/seed-strapi-categories.mjs | 23 +- scripts/seed-strapi-vendors.mjs | 269 ++++++++++++++++++ src/content.config.ts | 2 + src/content/categories/ai-solutions.json | 9 + src/content/categories/business.json | 9 + src/content/categories/cad-gis.json | 9 + src/content/categories/cloud.json | 6 + src/content/categories/consulting.json | 6 + src/content/categories/cybersecurity.json | 9 + src/content/categories/government.json | 9 + .../categories/hardware-solutions.json | 9 + src/content/categories/implementation.json | 6 + .../categories/industrial-solutions.json | 9 + src/content/categories/integration.json | 6 + src/content/categories/managed-services.json | 6 + src/content/categories/russian-hardware.json | 9 + src/content/categories/russian-software.json | 9 + .../categories/specialized-services.json | 6 + src/content/categories/subscription.json | 6 + src/content/categories/support.json | 6 + 21 files changed, 413 insertions(+), 13 deletions(-) create mode 100644 scripts/seed-strapi-vendors.mjs diff --git a/package.json b/package.json index dbbc0ef..c873d24 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "graphql:generate": "graphql-codegen", "graphql:schema": "graphql-codegen -p introspect", "endpoint:generate": "node scripts/endpoint-generate.mjs", - "seed:categories": "node scripts/seed-strapi-categories.mjs" + "seed:categories": "node scripts/seed-strapi-categories.mjs", + "seed:vendors": "node scripts/seed-strapi-vendors.mjs" }, "dependencies": { "@astrojs/react": "^4.4.2", diff --git a/scripts/seed-strapi-categories.mjs b/scripts/seed-strapi-categories.mjs index b311fee..e114724 100644 --- a/scripts/seed-strapi-categories.mjs +++ b/scripts/seed-strapi-categories.mjs @@ -18,6 +18,7 @@ const token = process.env.STRAPI_TOKEN ?? process.env.STRAPI_API_TOKEN ?? process.env.AUTH_TOKEN; +const isDryRun = process.argv.includes("--dry-run"); function readCategorySource(slug) { const filePath = path.join(categoriesDir, `${slug}.json`); @@ -113,7 +114,7 @@ async function createCategory(input) { return data?.createCategory; } -async function seedCategories(slugs) { +async function seedCategories(slugs, dryRun = false) { let createdCount = 0; let skippedCount = 0; @@ -133,24 +134,22 @@ async function seedCategories(slugs) { continue; } - const created = await createCategory({ - slug, - title, - description, - group, - }); + if (dryRun) { + createdCount += 1; + console.log(`DRY-RUN CREATE ${slug} -> ${title} [group=${group}]`); + continue; + } + const created = await createCategory({ slug, title, description, group }); createdCount += 1; - console.log( - `CREATE ${created.slug} -> ${created.title} [group=${created.group}]` - ); + console.log(`CREATE ${created.slug} -> ${created.title} [group=${created.group}]`); } return { createdCount, skippedCount }; } async function main() { - console.log(`Seeding categories to ${endpoint}`); + console.log(`Seeding categories to ${endpoint}${isDryRun ? " (dry-run)" : ""}`); if (!token) { console.warn( "No STRAPI token provided. If endpoint is protected, set STRAPI_TOKEN." @@ -158,7 +157,7 @@ async function main() { } const slugs = discoverCategorySlugs(); - const { createdCount, skippedCount } = await seedCategories(slugs); + const { createdCount, skippedCount } = await seedCategories(slugs, isDryRun); console.log( `Done. created=${createdCount}, skipped=${skippedCount}, total=${createdCount + skippedCount}` diff --git a/scripts/seed-strapi-vendors.mjs b/scripts/seed-strapi-vendors.mjs new file mode 100644 index 0000000..0148676 --- /dev/null +++ b/scripts/seed-strapi-vendors.mjs @@ -0,0 +1,269 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const root = path.resolve(__dirname, ".."); +const categoriesDir = path.join(root, "src", "content", "categories"); + +const defaultEndpoint = "http://localhost:1337/graphql"; +const endpoint = + process.env.STRAPI_GRAPHQL_URL ?? + process.env.PUBLIC_GRAPHQL_URL ?? + defaultEndpoint; + +const token = + process.env.STRAPI_TOKEN ?? + process.env.STRAPI_API_TOKEN ?? + process.env.AUTH_TOKEN; +const isDryRun = process.argv.includes("--dry-run"); + +function readCategorySource(slug) { + const filePath = path.join(categoriesDir, `${slug}.json`); + if (!fs.existsSync(filePath)) { + throw new Error(`Missing source file: ${path.relative(root, filePath)}`); + } + return JSON.parse(fs.readFileSync(filePath, "utf8")); +} + +function discoverCategorySlugs() { + if (!fs.existsSync(categoriesDir)) { + throw new Error(`Categories directory missing: ${path.relative(root, categoriesDir)}`); + } + + const slugs = []; + for (const dirent of fs.readdirSync(categoriesDir, { withFileTypes: true })) { + if (!dirent.isFile() || !dirent.name.endsWith(".json")) continue; + slugs.push(path.basename(dirent.name, ".json")); + } + + if (slugs.length === 0) { + throw new Error(`No *.json categories in ${path.relative(root, categoriesDir)}`); + } + + return slugs; +} + +function normalizeProducts(products) { + if (!Array.isArray(products)) return []; + const unique = new Set(); + for (const product of products) { + if (typeof product !== "string") continue; + const trimmed = product.trim(); + if (!trimmed) continue; + unique.add(trimmed); + } + return [...unique].map((value) => ({ value })); +} + +function collectVendorsBySlug(categorySlugs) { + const vendors = new Map(); + + for (const categorySlug of categorySlugs) { + const source = readCategorySource(categorySlug); + const categoryVendors = Array.isArray(source.vendors) ? source.vendors : []; + + for (const rawVendor of categoryVendors) { + const name = typeof rawVendor?.name === "string" ? rawVendor.name.trim() : ""; + if (!name) continue; + + const vendorSlug = typeof rawVendor?.slug === "string" ? rawVendor.slug.trim() : ""; + if (!vendorSlug) { + throw new Error(`Missing vendor slug for "${name}" in ${categorySlug}.json`); + } + + const description = + typeof rawVendor?.description === "string" ? rawVendor.description.trim() : ""; + const products = normalizeProducts(rawVendor?.products); + + if (!vendors.has(vendorSlug)) { + vendors.set(vendorSlug, { + slug: vendorSlug, + title: name, + description, + products: new Map(products.map((item) => [item.value, item])), + categories: new Set([categorySlug]), + }); + continue; + } + + const existing = vendors.get(vendorSlug); + existing.categories.add(categorySlug); + for (const product of products) { + existing.products.set(product.value, product); + } + if (!existing.description && description) { + existing.description = description; + } + } + } + + return [...vendors.values()].map((vendor) => ({ + slug: vendor.slug, + title: vendor.title, + description: vendor.description, + products: [...vendor.products.values()], + categorySlugs: [...vendor.categories], + })); +} + +async function gql(query, variables = {}) { + const headers = { + "Content-Type": "application/json", + Accept: "application/graphql-response+json, application/json", + }; + if (token) headers.Authorization = `Bearer ${token}`; + + const response = await fetch(endpoint, { + method: "POST", + headers, + body: JSON.stringify({ query, variables }), + }); + + if (!response.ok) { + throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`); + } + + const payload = await response.json(); + if (payload.errors?.length) { + const messages = payload.errors.map((err) => err.message).join("; "); + throw new Error(`GraphQL error: ${messages}`); + } + + return payload.data; +} + +async function fetchCategoryDocumentIds() { + const query = ` + query CategoryIds { + categories(pagination: { limit: 500 }) { + documentId + slug + } + } + `; + + const data = await gql(query); + const map = new Map(); + for (const category of data?.categories ?? []) { + if (!category?.slug || !category?.documentId) continue; + map.set(category.slug, category.documentId); + } + return map; +} + +async function findVendorBySlug(slug) { + const query = ` + query VendorBySlug($slug: String!) { + vendors(filters: { slug: { eq: $slug } }, pagination: { limit: 1 }) { + documentId + slug + } + } + `; + + const data = await gql(query, { slug }); + return data?.vendors?.[0] ?? null; +} + +async function createVendor(input) { + const mutation = ` + mutation CreateVendor($data: VendorInput!) { + createVendor(data: $data) { + documentId + slug + title + } + } + `; + + const data = await gql(mutation, { data: input }); + return data?.createVendor; +} + +async function updateVendor(documentId, input) { + const mutation = ` + mutation UpdateVendor($documentId: ID!, $data: VendorInput!) { + updateVendor(documentId: $documentId, data: $data) { + documentId + slug + title + } + } + `; + + const data = await gql(mutation, { documentId, data: input }); + return data?.updateVendor; +} + +async function seedVendors(vendors, categoryIdBySlug, dryRun = false) { + let createdCount = 0; + let updatedCount = 0; + + for (const vendor of vendors) { + const categoryDocumentIds = vendor.categorySlugs.map((slug) => { + const docId = categoryIdBySlug.get(slug); + if (!docId) { + throw new Error( + `Category "${slug}" is missing in Strapi. Seed categories before seeding vendors.` + ); + } + return docId; + }); + + const input = { + slug: vendor.slug, + title: vendor.title, + description: vendor.description, + products: vendor.products, + categories: categoryDocumentIds, + }; + + const existing = await findVendorBySlug(vendor.slug); + if (existing?.documentId) { + if (dryRun) { + updatedCount += 1; + console.log(`DRY-RUN UPDATE ${vendor.slug} -> ${vendor.title}`); + continue; + } + + const updated = await updateVendor(existing.documentId, input); + updatedCount += 1; + console.log(`UPDATE ${updated.slug} -> ${updated.title}`); + continue; + } + + if (dryRun) { + createdCount += 1; + console.log(`DRY-RUN CREATE ${vendor.slug} -> ${vendor.title}`); + continue; + } + + const created = await createVendor(input); + createdCount += 1; + console.log(`CREATE ${created.slug} -> ${created.title}`); + } + + return { createdCount, updatedCount }; +} + +async function main() { + console.log(`Seeding vendors to ${endpoint}${isDryRun ? " (dry-run)" : ""}`); + if (!token) { + console.warn("No STRAPI token provided. If endpoint is protected, set STRAPI_TOKEN."); + } + + const categorySlugs = discoverCategorySlugs(); + const vendors = collectVendorsBySlug(categorySlugs); + const categoryIdBySlug = await fetchCategoryDocumentIds(); + const { createdCount, updatedCount } = await seedVendors(vendors, categoryIdBySlug, isDryRun); + + console.log(`Done. created=${createdCount}, updated=${updatedCount}, total=${vendors.length}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/src/content.config.ts b/src/content.config.ts index 70d375c..b4e8811 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -3,6 +3,7 @@ import { glob } from 'astro/loaders' const vendorSchema = z.object({ name: z.string(), + slug: z.string(), description: z.string(), products: z.array(z.string()).optional(), }) @@ -10,6 +11,7 @@ const vendorSchema = z.object({ const categories = defineCollection({ loader: glob({ pattern: '**/*.json', base: './src/content/categories' }), schema: z.object({ + group: z.enum(['solution', 'service']), title: z.string(), description: z.string(), vendors: z.array(vendorSchema), diff --git a/src/content/categories/ai-solutions.json b/src/content/categories/ai-solutions.json index adfc238..a5d3993 100644 --- a/src/content/categories/ai-solutions.json +++ b/src/content/categories/ai-solutions.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Яндекс AI", + "slug": "yandex-ai", "description": "Платформа машинного обучения и искусственного интеллекта от Яндекса.", "products": [ "YandexGPT", @@ -15,6 +16,7 @@ }, { "name": "Сбер AI", + "slug": "sber-ai", "description": "Экосистема AI-решений Сбера для бизнеса и разработчиков.", "products": [ "GigaChat", @@ -25,6 +27,7 @@ }, { "name": "VK AI", + "slug": "vk-ai", "description": "AI-платформа VK с решениями для распознавания, синтеза и анализа.", "products": [ "Маруся", @@ -35,6 +38,7 @@ }, { "name": "АйТеко AI", + "slug": "iteco-ai", "description": "Российские решения на базе искусственного интеллекта для промышленности.", "products": [ "Компьютерное зрение", @@ -44,6 +48,7 @@ }, { "name": "Cognitive Technologies", + "slug": "cognitive-technologies", "description": "Разработчик систем компьютерного зрения и автономного транспорта.", "products": [ "C-Pilot", @@ -53,6 +58,7 @@ }, { "name": "NTechLab", + "slug": "ntechlab", "description": "Технологии распознавания лиц и видеоаналитики на базе AI.", "products": [ "FindFace", @@ -62,6 +68,7 @@ }, { "name": "Neuro.net", + "slug": "neuro-net", "description": "Платформа для создания и внедрения AI-решений в бизнес-процессы.", "products": [ "ML Studio", @@ -71,6 +78,7 @@ }, { "name": "Just AI", + "slug": "just-ai", "description": "Платформа для создания голосовых ассистентов и чат-ботов.", "products": [ "JAICP", @@ -80,6 +88,7 @@ }, { "name": "ЦРТ", + "slug": "speech-technology-center", "description": "Центр речевых технологий - решения для распознавания и синтеза речи.", "products": [ "ASR", diff --git a/src/content/categories/business.json b/src/content/categories/business.json index 704c608..d0888d9 100644 --- a/src/content/categories/business.json +++ b/src/content/categories/business.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "SAP", + "slug": "sap", "description": "Мировой лидер в области корпоративных приложений для управления бизнесом.", "products": [ "SAP S/4HANA", @@ -14,6 +15,7 @@ }, { "name": "1С", + "slug": "1c", "description": "Комплексные решения для автоматизации бизнес-процессов российских компаний.", "products": [ "1С:ERP", @@ -24,6 +26,7 @@ }, { "name": "Битрикс24", + "slug": "bitrix24", "description": "Единая платформа для управления бизнесом, CRM и коммуникаций.", "products": [ "CRM", @@ -34,6 +37,7 @@ }, { "name": "ELMA365", + "slug": "elma365", "description": "Low-code платформа для цифровой трансформации бизнеса.", "products": [ "BPM", @@ -44,6 +48,7 @@ }, { "name": "Мегаплан", + "slug": "megaplan", "description": "Система управления проектами и CRM для малого и среднего бизнеса.", "products": [ "CRM", @@ -53,6 +58,7 @@ }, { "name": "amoCRM", + "slug": "amocrm", "description": "CRM-система для автоматизации продаж и работы с клиентами.", "products": [ "Воронка продаж", @@ -62,6 +68,7 @@ }, { "name": "Terrsoft", + "slug": "terrsoft", "description": "Low-code платформа Creatio для автоматизации бизнес-процессов.", "products": [ "Creatio CRM", @@ -71,6 +78,7 @@ }, { "name": "Мой Склад", + "slug": "my-warehouse", "description": "Облачный сервис для управления торговлей и складом.", "products": [ "Складской учет", @@ -80,6 +88,7 @@ }, { "name": "Контур", + "slug": "kontur", "description": "Экосистема сервисов для автоматизации бухгалтерии и бизнес-процессов.", "products": [ "Контур.Бухгалтерия", diff --git a/src/content/categories/cad-gis.json b/src/content/categories/cad-gis.json index cc4d785..b8dbe1f 100644 --- a/src/content/categories/cad-gis.json +++ b/src/content/categories/cad-gis.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "АСКОН", + "slug": "ascon", "description": "Крупнейший российский разработчик инженерного ПО и САПР систем.", "products": [ "КОМПАС-3D", @@ -15,6 +16,7 @@ }, { "name": "Nanosoft", + "slug": "nanosoft", "description": "Разработка САПР и ГИС решений для проектирования и строительства.", "products": [ "nanoCAD", @@ -24,6 +26,7 @@ }, { "name": "ГИС Панорама", + "slug": "gis-panorama", "description": "Российская ГИС платформа для работы с пространственными данными.", "products": [ "ГИС Карта 2011", @@ -33,6 +36,7 @@ }, { "name": "NextGIS", + "slug": "nextgis", "description": "Облачная ГИС платформа и геопространственные решения.", "products": [ "NextGIS Web", @@ -42,6 +46,7 @@ }, { "name": "ZWSOFT", + "slug": "zwsoft", "description": "Универсальная САПР платформа для 2D и 3D проектирования.", "products": [ "ZWCAD", @@ -50,6 +55,7 @@ }, { "name": "ЛОЦМАН", + "slug": "lotsman", "description": "PLM и САПР решения для управления жизненным циклом изделий.", "products": [ "ЛОЦМАН:PLM", @@ -58,6 +64,7 @@ }, { "name": "CGS Labs", + "slug": "cgs-labs", "description": "Разработка систем инженерного анализа и моделирования.", "products": [ "CGS Модельер", @@ -66,6 +73,7 @@ }, { "name": "CADLib", + "slug": "cadlib", "description": "Библиотеки и компоненты для разработки САПР приложений.", "products": [ "Библиотеки DWG", @@ -74,6 +82,7 @@ }, { "name": "IndorSoft", + "slug": "indorsoft", "description": "САПР для проектирования автомобильных дорог и инфраструктуры.", "products": [ "IndorCAD", diff --git a/src/content/categories/cloud.json b/src/content/categories/cloud.json index 24b9af9..8e9f02a 100644 --- a/src/content/categories/cloud.json +++ b/src/content/categories/cloud.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Яндекс.Облако", + "slug": "yandex-cloud", "description": "Полный спектр облачных сервисов: вычисления, хранение данных, машинное обучение, базы данных.", "products": [ "Compute Cloud", @@ -15,6 +16,7 @@ }, { "name": "VK Cloud", + "slug": "vk-cloud", "description": "Облачная платформа VK с IaaS, PaaS и SaaS решениями для бизнеса любого масштаба.", "products": [ "Облачные серверы", @@ -25,6 +27,7 @@ }, { "name": "Cloud.ru", + "slug": "cloud-ru", "description": "Российская мультиоблачная платформа от Ростелекома с высоким уровнем безопасности.", "products": [ "IaaS", @@ -35,6 +38,7 @@ }, { "name": "SberCloud", + "slug": "sbercloud", "description": "Облачные решения от Сбера для корпоративных клиентов с интеграцией AI и ML.", "products": [ "Виртуальные машины", @@ -45,6 +49,7 @@ }, { "name": "МТС Cloud", + "slug": "mts-cloud", "description": "Облачная инфраструктура МТС с широким спектром сервисов и российской локализацией.", "products": [ "Cloud Server", @@ -55,6 +60,7 @@ }, { "name": "Selectel", + "slug": "selectel", "description": "Один из крупнейших провайдеров облачных услуг в России с собственными ЦОД.", "products": [ "Облачная платформа", diff --git a/src/content/categories/consulting.json b/src/content/categories/consulting.json index 8b5ae19..b480ea8 100644 --- a/src/content/categories/consulting.json +++ b/src/content/categories/consulting.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "IT-стратегия и архитектура", + "slug": "it-strategy-and-architecture", "description": "Разработка IT-стратегии, целевой архитектуры и дорожной карты цифровой трансформации с учетом специфики российского рынка.", "products": [ "IT-аудит", @@ -14,6 +15,7 @@ }, { "name": "Миграция на российское ПО", + "slug": "migration-to-russian-software", "description": "Комплексный анализ текущей инфраструктуры и разработка плана перехода на отечественные решения с минимальными рисками.", "products": [ "Аудит", @@ -23,6 +25,7 @@ }, { "name": "Оптимизация IT-инфраструктуры", + "slug": "it-infrastructure-optimization", "description": "Анализ и оптимизация существующей инфраструктуры для повышения эффективности и снижения затрат.", "products": [ "Аудит инфраструктуры", @@ -32,6 +35,7 @@ }, { "name": "Проектирование ЦОД", + "slug": "data-center-design", "description": "Разработка концепции и детальное проектирование центров обработки данных на базе российского оборудования.", "products": [ "Концепция ЦОД", @@ -41,6 +45,7 @@ }, { "name": "Импортозамещение", + "slug": "import-substitution", "description": "Разработка стратегии замены зарубежных решений на российские аналоги с сохранением функциональности.", "products": [ "Анализ решений", @@ -50,6 +55,7 @@ }, { "name": "Бизнес-анализ и процессы", + "slug": "business-analysis-and-processes", "description": "Анализ бизнес-процессов и разработка требований к информационным системам для их автоматизации.", "products": [ "Анализ процессов", diff --git a/src/content/categories/cybersecurity.json b/src/content/categories/cybersecurity.json index a3bd49d..4e2e0e9 100644 --- a/src/content/categories/cybersecurity.json +++ b/src/content/categories/cybersecurity.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Лаборатория Касперского", + "slug": "kaspersky-lab", "description": "Мировой лидер в области кибербезопасности с комплексными решениями защиты.", "products": [ "Kaspersky Endpoint Security", @@ -14,6 +15,7 @@ }, { "name": "Positive Technologies", + "slug": "positive-technologies", "description": "Разработчик решений по информационной безопасности и защите от киберугроз.", "products": [ "MaxPatrol", @@ -23,6 +25,7 @@ }, { "name": "InfoWatch", + "slug": "infowatch", "description": "Российский разработчик систем защиты от утечек конфиденциальной информации.", "products": [ "InfoWatch Traffic Monitor", @@ -32,6 +35,7 @@ }, { "name": "SearchInform", + "slug": "searchinform", "description": "Системы информационной безопасности и предотвращения утечек данных.", "products": [ "SearchInform DLP", @@ -41,6 +45,7 @@ }, { "name": "Гарда", + "slug": "garda", "description": "Решения для защиты периметра, веб-приложений и управления доступом.", "products": [ "Гарда WAF", @@ -51,6 +56,7 @@ }, { "name": "DeviceLock", + "slug": "devicelock", "description": "Контроль внешних устройств и каналов передачи данных для защиты от утечек.", "products": [ "DeviceLock DLP", @@ -60,6 +66,7 @@ }, { "name": "КриптоПро", + "slug": "cryptopro", "description": "Средства криптографической защиты информации и электронной подписи.", "products": [ "КриптоПро CSP", @@ -69,6 +76,7 @@ }, { "name": "Код Безопасности", + "slug": "security-code", "description": "Российский вендор решений по информационной безопасности.", "products": [ "Secret Net Studio", @@ -78,6 +86,7 @@ }, { "name": "Аладдин Р.Д.", + "slug": "aladdin-rd", "description": "Разработчик средств аутентификации и защиты информации.", "products": [ "JaCarta", diff --git a/src/content/categories/government.json b/src/content/categories/government.json index 82031f9..533b9bf 100644 --- a/src/content/categories/government.json +++ b/src/content/categories/government.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Astra Linux", + "slug": "astra-linux", "description": "Защищенная операционная система для государственных организаций.", "products": [ "Astra Linux Special Edition", @@ -14,6 +15,7 @@ }, { "name": "ИнфоТеКС", + "slug": "infotecs", "description": "Защищенные системы связи и криптографическая защита для госсектора.", "products": [ "ViPNet", @@ -24,6 +26,7 @@ }, { "name": "НПО Эшелон", + "slug": "npo-echelon", "description": "Системы защиты информации для критической инфраструктуры.", "products": [ "Сертифицированные решения", @@ -33,6 +36,7 @@ }, { "name": "Код Безопасности", + "slug": "security-code", "description": "Средства защиты информации для государственных информационных систем.", "products": [ "Secret Net Studio", @@ -42,6 +46,7 @@ }, { "name": "Газинформсервис", + "slug": "gazinformservice", "description": "Автоматизированные системы для государственного управления.", "products": [ "ГИС", @@ -51,6 +56,7 @@ }, { "name": "Крок", + "slug": "croc", "description": "Интеграционные решения для цифровизации государственных услуг.", "products": [ "Цифровые платформы", @@ -60,6 +66,7 @@ }, { "name": "Ростелеком-Солар", + "slug": "rostelecom-solar", "description": "Кибербезопасность для государственных и критически важных объектов.", "products": [ "Solar JSOC", @@ -69,6 +76,7 @@ }, { "name": "ФГУП НТЦ «Атлас»", + "slug": "fsue-stc-atlas", "description": "Разработка защищенных АС для органов государственной власти.", "products": [ "Защищенные АС", @@ -78,6 +86,7 @@ }, { "name": "Электронное Правительство", + "slug": "electronic-government", "description": "Платформы для предоставления государственных услуг в электронном виде.", "products": [ "Госуслуги", diff --git a/src/content/categories/hardware-solutions.json b/src/content/categories/hardware-solutions.json index 3c1e8e5..7c7357c 100644 --- a/src/content/categories/hardware-solutions.json +++ b/src/content/categories/hardware-solutions.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "YADRO", + "slug": "yadro", "description": "Российские системы хранения данных и серверные платформы корпоративного уровня.", "products": [ "СХД TATLIN", @@ -15,6 +16,7 @@ }, { "name": "Kraftway Storage", + "slug": "kraftway-storage", "description": "Системы хранения и резервного копирования данных.", "products": [ "СХД", @@ -24,6 +26,7 @@ }, { "name": "Eltex", + "slug": "eltex", "description": "Российский производитель телекоммуникационного оборудования.", "products": [ "Маршрутизаторы", @@ -34,6 +37,7 @@ }, { "name": "Таврида Электрик", + "slug": "tavrida-electric", "description": "Российские процессоры и микроэлектронные компоненты.", "products": [ "Процессоры Baikal", @@ -42,6 +46,7 @@ }, { "name": "ЭЛВИС-НеоТек", + "slug": "elvis-neotech", "description": "Разработка и производство микроэлектронных компонентов.", "products": [ "Микроконтроллеры", @@ -51,6 +56,7 @@ }, { "name": "Kraftway Network", + "slug": "kraftway-network", "description": "Сетевое оборудование и решения для построения ЦОД.", "products": [ "Коммутаторы", @@ -60,6 +66,7 @@ }, { "name": "ЗАО НТЦ ЭЛИНС", + "slug": "zao-stc-elins", "description": "Производство систем бесперебойного питания.", "products": [ "ИБП", @@ -69,6 +76,7 @@ }, { "name": "Аквариус СХД", + "slug": "aquarius-storage", "description": "Системы хранения данных для корпоративного сектора.", "products": [ "СХД", @@ -78,6 +86,7 @@ }, { "name": "РЗЭП", + "slug": "rzep", "description": "Рязанский завод электронных приборов - производство электронных компонентов.", "products": [ "Электронные компоненты", diff --git a/src/content/categories/implementation.json b/src/content/categories/implementation.json index 452b10a..239a58f 100644 --- a/src/content/categories/implementation.json +++ b/src/content/categories/implementation.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Внедрение облачных платформ", + "slug": "cloud-platform-implementation", "description": "Комплексное внедрение облачных решений на базе Яндекс.Облако, VK Cloud и других российских провайдеров.", "products": [ "IaaS", @@ -15,6 +16,7 @@ }, { "name": "Развертывание ОС и базового ПО", + "slug": "os-and-core-software-deployment", "description": "Установка и настройка операционных систем Astra Linux, РЕД ОС и базового программного обеспечения.", "products": [ "Astra Linux", @@ -25,6 +27,7 @@ }, { "name": "Внедрение систем безопасности", + "slug": "security-systems-implementation", "description": "Поставка и внедрение комплексных решений по кибербезопасности от ведущих российских вендоров.", "products": [ "Kaspersky", @@ -35,6 +38,7 @@ }, { "name": "Внедрение ERP и CRM систем", + "slug": "erp-and-crm-implementation", "description": "Развертывание и настройка корпоративных систем управления: 1С, Галактика, Мой Офис.", "products": [ "1С", @@ -45,6 +49,7 @@ }, { "name": "Поставка серверного оборудования", + "slug": "server-hardware-supply", "description": "Подбор, поставка и ввод в эксплуатацию серверов и СХД российского производства.", "products": [ "Kraftway", @@ -55,6 +60,7 @@ }, { "name": "Системы хранения данных", + "slug": "data-storage-systems", "description": "Внедрение российских систем хранения данных с настройкой репликации и резервного копирования.", "products": [ "RAIDIX", diff --git a/src/content/categories/industrial-solutions.json b/src/content/categories/industrial-solutions.json index d5fcbbe..50eb2e3 100644 --- a/src/content/categories/industrial-solutions.json +++ b/src/content/categories/industrial-solutions.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "ОВЕН", + "slug": "owen", "description": "Разработка и производство средств промышленной автоматизации.", "products": [ "ПЛК", @@ -15,6 +16,7 @@ }, { "name": "ИнСАТ", + "slug": "insat", "description": "Автоматизированные системы управления технологическими процессами.", "products": [ "SCADA InTouch", @@ -24,6 +26,7 @@ }, { "name": "ТЕСИС", + "slug": "thesis", "description": "Системы автоматизации для энергетики и промышленности.", "products": [ "АСУТП", @@ -33,6 +36,7 @@ }, { "name": "Danfoss", + "slug": "danfoss", "description": "Решения для промышленной автоматизации и энергоэффективности.", "products": [ "Частотные преобразователи", @@ -42,6 +46,7 @@ }, { "name": "МЗТА", + "slug": "mzta", "description": "Московский завод тепловой автоматики - промышленные контроллеры.", "products": [ "ПЛК", @@ -51,6 +56,7 @@ }, { "name": "Текон", + "slug": "tekon", "description": "Автоматизация технологических процессов в промышленности.", "products": [ "SCADA", @@ -60,6 +66,7 @@ }, { "name": "АйТи Энерджи", + "slug": "it-energy", "description": "Системы мониторинга и управления для энергетики.", "products": [ "АСКУЭ", @@ -69,6 +76,7 @@ }, { "name": "Schneider Electric", + "slug": "schneider-electric", "description": "Индустриальная автоматизация и управление энергией.", "products": [ "ПЛК", @@ -79,6 +87,7 @@ }, { "name": "АСУ ТП Проект", + "slug": "industrial-automation-project", "description": "Проектирование и внедрение автоматизированных систем управления.", "products": [ "АСУТП", diff --git a/src/content/categories/integration.json b/src/content/categories/integration.json index 9097744..dca0248 100644 --- a/src/content/categories/integration.json +++ b/src/content/categories/integration.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Интеграция корпоративных систем", + "slug": "enterprise-systems-integration", "description": "Интеграция ERP, CRM, HRM и других корпоративных систем для обеспечения единого информационного пространства.", "products": [ "ESB", @@ -15,6 +16,7 @@ }, { "name": "Разработка на заказ", + "slug": "custom-development", "description": "Создание индивидуальных программных решений под специфические задачи бизнеса.", "products": [ "Backend", @@ -25,6 +27,7 @@ }, { "name": "Автоматизация бизнес-процессов", + "slug": "business-process-automation", "description": "Разработка и внедрение систем автоматизации с использованием BPM-платформ и RPA.", "products": [ "BPM", @@ -35,6 +38,7 @@ }, { "name": "Разработка микросервисов", + "slug": "microservices-development", "description": "Проектирование и разработка микросервисной архитектуры для масштабируемых решений.", "products": [ "Kubernetes", @@ -45,6 +49,7 @@ }, { "name": "DevOps и CI/CD", + "slug": "devops-and-ci-cd", "description": "Построение процессов непрерывной интеграции и доставки на базе российских и opensource инструментов.", "products": [ "GitLab", @@ -55,6 +60,7 @@ }, { "name": "Интеграция с государственными системами", + "slug": "government-systems-integration", "description": "Подключение к СМЭВ, ГИС, ЕГИС и другим государственным информационным системам.", "products": [ "СМЭВ", diff --git a/src/content/categories/managed-services.json b/src/content/categories/managed-services.json index 8552d61..fa02b43 100644 --- a/src/content/categories/managed-services.json +++ b/src/content/categories/managed-services.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Управление инфраструктурой", + "slug": "infrastructure-management", "description": "Полное управление IT-инфраструктурой 24/7: мониторинг, обслуживание, оптимизация и развитие.", "products": [ "Мониторинг 24/7", @@ -15,6 +16,7 @@ }, { "name": "Управление облачными ресурсами", + "slug": "cloud-resource-management", "description": "Администрирование и оптимизация облачной инфраструктуры на российских платформах.", "products": [ "Cloud Management", @@ -24,6 +26,7 @@ }, { "name": "Управление безопасностью", + "slug": "security-management", "description": "Комплексное управление информационной безопасностью: SOC, мониторинг угроз, реагирование на инциденты.", "products": [ "SOC", @@ -34,6 +37,7 @@ }, { "name": "Backup as a Service", + "slug": "backup-as-a-service", "description": "Управляемое резервное копирование с гарантией сохранности данных и быстрого восстановления.", "products": [ "Резервное копирование", @@ -43,6 +47,7 @@ }, { "name": "DRaaS (Disaster Recovery)", + "slug": "draas-disaster-recovery", "description": "Услуга аварийного восстановления IT-систем с гарантированным RTO и RPO.", "products": [ "Аварийное восстановление", @@ -52,6 +57,7 @@ }, { "name": "Helpdesk и Service Desk", + "slug": "helpdesk-and-service-desk", "description": "Профессиональная техническая поддержка пользователей и администрирование IT-систем.", "products": [ "1-3 линии поддержки", diff --git a/src/content/categories/russian-hardware.json b/src/content/categories/russian-hardware.json index e3287e4..545850d 100644 --- a/src/content/categories/russian-hardware.json +++ b/src/content/categories/russian-hardware.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Kraftway", + "slug": "kraftway", "description": "Ведущий российский производитель серверов, рабочих станций и систем хранения.", "products": [ "Серверы Express", @@ -15,6 +16,7 @@ }, { "name": "Aquarius", + "slug": "aquarius", "description": "Российский производитель компьютеров и серверного оборудования.", "products": [ "Серверы", @@ -25,6 +27,7 @@ }, { "name": "iRU", + "slug": "iru", "description": "Производство компьютеров, серверов и комплектующих под российским брендом.", "products": [ "Серверы iRU Rock", @@ -35,6 +38,7 @@ }, { "name": "Аквариус", + "slug": "aquarius", "description": "Российская компания по производству вычислительной техники.", "products": [ "Компьютеры", @@ -44,6 +48,7 @@ }, { "name": "Depo", + "slug": "depo", "description": "Разработка и производство серверного и сетевого оборудования.", "products": [ "Серверы Depo Storm", @@ -53,6 +58,7 @@ }, { "name": "YADRO", + "slug": "yadro", "description": "Российский разработчик серверных платформ и систем хранения данных.", "products": [ "Серверы Vegman", @@ -62,6 +68,7 @@ }, { "name": "РСК Технологии", + "slug": "rsk-technologies", "description": "Производство высокопроизводительных вычислительных систем.", "products": [ "Суперкомпьютеры", @@ -71,6 +78,7 @@ }, { "name": "GS Group", + "slug": "gs-group", "description": "Производство электроники и вычислительной техники.", "products": [ "Планшеты", @@ -80,6 +88,7 @@ }, { "name": "Kraftway Graviton", + "slug": "kraftway-graviton", "description": "Серверные решения на базе российских процессоров.", "products": [ "Серверы Graviton", diff --git a/src/content/categories/russian-software.json b/src/content/categories/russian-software.json index e910e3b..e9ea0f9 100644 --- a/src/content/categories/russian-software.json +++ b/src/content/categories/russian-software.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "МойОфис", + "slug": "myoffice", "description": "Российский офисный пакет для работы с документами, таблицами и презентациями.", "products": [ "Текст", @@ -15,6 +16,7 @@ }, { "name": "1С", + "slug": "1c", "description": "Ведущий российский разработчик программного обеспечения для автоматизации бизнеса.", "products": [ "1С:Бухгалтерия", @@ -25,6 +27,7 @@ }, { "name": "Галактика", + "slug": "galaktika", "description": "ERP-система для управления предприятием и бизнес-процессами.", "products": [ "Галактика ERP", @@ -35,6 +38,7 @@ }, { "name": "Р7-Офис", + "slug": "r7-office", "description": "Офисный пакет и платформа для совместной работы с документами.", "products": [ "Редакторы документов", @@ -44,6 +48,7 @@ }, { "name": "Postgres Pro", + "slug": "postgres-pro", "description": "Российская СУБД на базе PostgreSQL с расширенной функциональностью.", "products": [ "Postgres Pro Standard", @@ -53,6 +58,7 @@ }, { "name": "Astra Linux", + "slug": "astra-linux", "description": "Защищенная операционная система для госструктур и коммерческих организаций.", "products": [ "Astra Linux Special Edition", @@ -61,6 +67,7 @@ }, { "name": "РедСофт", + "slug": "red-soft", "description": "Разработчик ОС РЕД и решений для цифровой трансформации.", "products": [ "РЕД ОС", @@ -70,6 +77,7 @@ }, { "name": "BaseAlt", + "slug": "basealt", "description": "Разработчик дистрибутивов ALT Linux для различных сегментов рынка.", "products": [ "ALT Education", @@ -79,6 +87,7 @@ }, { "name": "ELMA", + "slug": "elma", "description": "Low-code платформа для автоматизации и управления бизнес-процессами.", "products": [ "ELMA365", diff --git a/src/content/categories/specialized-services.json b/src/content/categories/specialized-services.json index d3da97e..d09d794 100644 --- a/src/content/categories/specialized-services.json +++ b/src/content/categories/specialized-services.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Решения для финансового сектора", + "slug": "solutions-for-financial-sector", "description": "Специализированные IT-решения для банков, страховых компаний и финансовых организаций с учетом требований регуляторов.", "products": [ "АБС", @@ -15,6 +16,7 @@ }, { "name": "Промышленные решения", + "slug": "industrial-solutions", "description": "Автоматизация производства, АСУТП, MES-системы и промышленный IoT на базе российских технологий.", "products": [ "MES", @@ -25,6 +27,7 @@ }, { "name": "Здравоохранение", + "slug": "healthcare", "description": "МИС, ПАКС, лабораторные системы и телемедицина с интеграцией в ЕГИСЗ.", "products": [ "МИС", @@ -35,6 +38,7 @@ }, { "name": "Образование", + "slug": "education", "description": "Цифровизация образовательного процесса: LMS, электронные библиотеки, системы тестирования.", "products": [ "LMS", @@ -44,6 +48,7 @@ }, { "name": "Ритейл и e-commerce", + "slug": "retail-and-e-commerce", "description": "Решения для розничной торговли: кассовые системы, управление складом, интернет-магазины.", "products": [ "E-commerce", @@ -54,6 +59,7 @@ }, { "name": "Телеком и медиа", + "slug": "telecom-and-media", "description": "Биллинговые системы, OSS/BSS, потоковое видео и CDN на российских платформах.", "products": [ "Биллинг", diff --git a/src/content/categories/subscription.json b/src/content/categories/subscription.json index 08adea5..2257b95 100644 --- a/src/content/categories/subscription.json +++ b/src/content/categories/subscription.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Облачная инфраструктура по подписке", + "slug": "cloud-infrastructure-subscription", "description": "Аренда виртуальных серверов, хранилищ и сетевых ресурсов на российских облачных платформах.", "products": [ "Виртуальные серверы", @@ -15,6 +16,7 @@ }, { "name": "Лицензии на российское ПО", + "slug": "russian-software-licenses", "description": "Предоставление лицензий на отечественное программное обеспечение по модели подписки.", "products": [ "ОС", @@ -25,6 +27,7 @@ }, { "name": "SaaS решения", + "slug": "saas-solutions", "description": "Доступ к корпоративным приложениям в облаке: CRM, ERP, документооборот, коммуникации.", "products": [ "CRM", @@ -35,6 +38,7 @@ }, { "name": "Безопасность как сервис", + "slug": "security-as-a-service", "description": "Подписка на облачные сервисы безопасности: антивирус, DLP, email-защита, веб-фильтрация.", "products": [ "Cloud Антивирус", @@ -45,6 +49,7 @@ }, { "name": "Мониторинг и аналитика", + "slug": "monitoring-and-analytics", "description": "Платформы мониторинга инфраструктуры, сбор метрик и бизнес-аналитика по подписке.", "products": [ "APM", @@ -55,6 +60,7 @@ }, { "name": "Рабочие места как сервис", + "slug": "workplace-as-a-service", "description": "Виртуальные рабочие столы (VDI) с предустановленным ПО и поддержкой.", "products": [ "VDI", diff --git a/src/content/categories/support.json b/src/content/categories/support.json index 686edaf..a08db40 100644 --- a/src/content/categories/support.json +++ b/src/content/categories/support.json @@ -5,6 +5,7 @@ "vendors": [ { "name": "Техническая поддержка 24/7", + "slug": "technical-support-24-7", "description": "Круглосуточная поддержка IT-инфраструктуры с гарантированным временем реакции и решения проблем.", "products": [ "L1-L3 поддержка", @@ -14,6 +15,7 @@ }, { "name": "Сопровождение ПО", + "slug": "software-support", "description": "Обслуживание и поддержка корпоративных информационных систем, обновления и доработки.", "products": [ "Обновления", @@ -24,6 +26,7 @@ }, { "name": "Обслуживание серверов и СХД", + "slug": "servers-and-storage-maintenance", "description": "Регулярное обслуживание, мониторинг и замена оборудования по договору.", "products": [ "Профилактика", @@ -34,6 +37,7 @@ }, { "name": "Обслуживание сетевой инфраструктуры", + "slug": "network-infrastructure-maintenance", "description": "Поддержка сетевого оборудования, настройка, мониторинг и устранение неисправностей.", "products": [ "Сети", @@ -44,6 +48,7 @@ }, { "name": "Обслуживание систем безопасности", + "slug": "security-systems-maintenance", "description": "Сопровождение средств защиты информации: обновление баз, настройка правил, анализ инцидентов.", "products": [ "Антивирус", @@ -54,6 +59,7 @@ }, { "name": "Абонентское обслуживание", + "slug": "subscription-support", "description": "Комплексная IT-поддержка по модели абонентского обслуживания с фиксированной стоимостью.", "products": [ "Фиксированная цена",