Initial commit: TopSysOps site + admin panel

Multi-page public site (Next.js), Node/Express backend with Postgres,
and Vite admin/account app, restructured from a single-page layout
into dedicated service, promotions, cases, about, FAQ, and blog pages
for SEO.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013otXCiTZsxdZ4SJKZ9wUky
This commit is contained in:
ogrechkoandClaude Sonnet 5 committed 2026-08-25 23:12:16 +03:00
commit 130c5382cd
108 files changed
+7146

No files matched your search

+26
View File
@@ -0,0 +1,26 @@
// Используется в клиентских компонентах ('use client'). Идёт через относительный
// /api - в браузере это резолвится через Caddy, который проксирует на бэкенд.
async function request(path, options = {}) {
const res = await fetch(`/api${path}`, {
credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
...options,
});
if (!res.ok) {
let message = 'Request failed';
try {
const data = await res.json();
message = data.error || message;
} catch (e) {
// no JSON body
}
throw new Error(message);
}
if (res.status === 204) return null;
return res.json();
}
export const clientApi = {
submitReview: (data) => request('/reviews', { method: 'POST', body: JSON.stringify(data) }),
trackVisit: () => request('/stats/visit', { method: 'POST' }).catch(() => {}),
};
+7
View File
@@ -0,0 +1,7 @@
import { Bot, Headphones, ShieldCheck, Database, Network, Cloud, Globe, Server, Rocket, Handshake } from 'lucide-react';
export const ICONS = { Bot, Headphones, ShieldCheck, Database, Network, Cloud, Globe, Server, Rocket, Handshake };
export function getIcon(name) {
return ICONS[name] || Server;
}
+26
View File
@@ -0,0 +1,26 @@
// Используется только внутри Server Component'ов (во время SSR/сборки).
// Обращается к бэкенду напрямую по внутреннему docker-адресу, минуя Caddy -
// это работает только на сервере Next.js, у браузера такого адреса нет.
const BASE = process.env.BACKEND_INTERNAL_URL || 'http://backend:4000';
async function get(path, { revalidate = 60 } = {}) {
try {
const res = await fetch(`${BASE}/api${path}`, { next: { revalidate } });
if (!res.ok) return null;
return res.json();
} catch (err) {
console.error(`[serverApi] failed to fetch ${path}`, err.message);
return null;
}
}
export const serverApi = {
getServices: () => get('/services').then((v) => v || []),
getPromotions: () => get('/promotions').then((v) => v || []),
getReviews: () => get('/reviews').then((v) => v || []),
getCases: () => get('/cases').then((v) => v || []),
getFaqs: () => get('/faqs').then((v) => v || []),
getContact: () => get('/contact'),
getBlogPosts: () => get('/blog').then((v) => v || []),
getBlogPost: (slug) => get(`/blog/${slug}`, { revalidate: 60 }),
};
+112
View File
@@ -0,0 +1,112 @@
export const SERVICE_LANDING_COPY = {
support: {
metaTitle: 'IT-аутсорсинг и техническая поддержка серверов',
metaDescription:
'Удалённая и выездная техподдержка IT-инфраструктуры: мониторинг, устранение инцидентов, администрирование серверов. Тарифы от 3/4 до 24/7, отклик от 15 минут.',
h1: 'IT-аутсорсинг и техническая поддержка для бизнеса',
intro:
'Берём на абонентское обслуживание вашу IT-инфраструктуру: серверы, рабочие места, сеть. Удалённый мониторинг и устранение инцидентов, при необходимости — выезд специалиста по Санкт-Петербургу.',
bullets: [
'Три уровня тарифов — от базовой удалённой поддержки 3/4 до полного сопровождения 24/7',
'Среднее время реакции на заявку от 15 минут на тарифе «Премиум»',
'Работаем удалённо с клиентами по всей России, выезд специалиста — по Санкт-Петербургу',
'NDA перед началом работ и защищённые каналы доступа к инфраструктуре',
],
},
security: {
metaTitle: 'Кибербезопасность и защита IT-инфраструктуры',
metaDescription:
'Аудит информационной безопасности, внедрение IDS/IPS, мониторинг угроз. Комплексная защита данных и инфраструктуры бизнеса от кибератак.',
h1: 'Кибербезопасность и защита IT-инфраструктуры бизнеса',
intro:
'Проводим аудит защищённости, внедряем системы обнаружения и предотвращения вторжений, настраиваем постоянный мониторинг угроз — чтобы инцидент не стал неожиданностью.',
bullets: [
'Комплексный аудит и мониторинг инфраструктуры на регулярной основе',
'Внедрение IDS/IPS для обнаружения и предотвращения вторжений',
'Подходит для инфраструктуры любого масштаба, включая финтех и e-commerce',
'Отчёты и рекомендации по итогам аудита на понятном языке, без лишнего технического жаргона',
],
},
db: {
metaTitle: 'Администрирование баз данных: настройка и резервное копирование',
metaDescription:
'Настройка и оптимизация PostgreSQL, MySQL и других СУБД, регулярное резервное копирование и восстановление данных.',
h1: 'Администрирование баз данных: настройка, оптимизация, резервное копирование',
intro:
'Настраиваем и оптимизируем работу СУБД, выстраиваем регулярное резервное копирование и проверяем восстановление данных, чтобы сбой сервера не означал потерю бизнес-информации.',
bullets: [
'Работаем с PostgreSQL, MySQL и другими популярными СУБД',
'Оптимизация запросов и настройка под реальную нагрузку вашего проекта',
'Регулярные бэкапы с проверкой восстановления, а не просто «файл на диске»',
'Почасовая и абонентская модель — под разовую задачу или на постоянной основе',
],
},
network: {
metaTitle: 'Сетевая инфраструктура и почтовые серверы под ключ',
metaDescription:
'Проектирование корпоративных сетей, настройка серверов, развёртывание и администрирование почтовых серверов, управление сетевым оборудованием.',
h1: 'Сетевая инфраструктура и почтовые серверы под ключ',
intro:
'Проектируем и поддерживаем корпоративные сети: от подбора и настройки оборудования до развёртывания почтовых серверов с защитой от спама и подделки писем.',
bullets: [
'Проектирование, монтаж и настройка сети под ваш офис или сеть филиалов',
'Почтовый сервер на вашем оборудовании или в аренду с администрированием',
'Отдельная акция на полный пакет: SPF/DKIM/DMARC, антиспам, веб-почта — смотрите раздел «Акции»',
'Управление роутерами и коммутаторами на абонентской основе',
],
},
cloud: {
metaTitle: 'Облачные решения и миграция инфраструктуры в облако',
metaDescription:
'Перенос IT-инфраструктуры и сервисов в облако, настройка и сопровождение облачных сервисов, оптимизация облачных затрат.',
h1: 'Облачные решения и миграция инфраструктуры в облако',
intro:
'Переносим серверы и сервисы в облако с минимальным простоем, настраиваем инфраструктуру под нагрузку и следим, чтобы счета за облако не росли быстрее бизнеса.',
bullets: [
'Миграция серверов и сервисов в облако без остановки продаж',
'Подбор конфигурации под реальную нагрузку — без переплаты за лишние мощности',
'Настройка резервного копирования и мониторинга облачной инфраструктуры',
'Сопровождение после миграции на абонентской основе',
],
},
ai: {
metaTitle: 'ИИ-ассистенты и автоматизация бизнес-процессов',
metaDescription:
'Разработка ботов и ИИ-ассистентов с RAG, интеграция с CRM и мессенджерами, автоматизация рутинных бизнес-процессов.',
h1: 'Внедрение ИИ-ассистентов и автоматизация бизнес-процессов',
intro:
'Разрабатываем ботов и ИИ-ассистентов, обученных на базе знаний вашей компании (RAG), и интегрируем их с CRM, мессенджерами и внутренними сервисами — чтобы снять рутину с сотрудников.',
bullets: [
'Telegram-боты и ИИ-ассистенты с обучением на ваших данных (RAG)',
'Интеграция с CRM, мессенджерами и внешними API',
'Снижение нагрузки на операторов поддержки за счёт автоматизации типовых вопросов',
'Помесячное сопровождение и дообучение ассистента после запуска',
],
},
development: {
metaTitle: 'Разработка сайтов и веб-сервисов под ключ',
metaDescription:
'От лендинга и MVP до продакшн-разработки: сайты, личные кабинеты, интеграции. Сроки от 1 недели, сопровождение после запуска.',
h1: 'Разработка сайтов и веб-сервисов под ключ',
intro:
'Делаем веб-проекты любого масштаба: от простой посадочной страницы за неделю до продакшн-разработки с архитектурой, тестами и DevOps под масштабирование.',
bullets: [
'Лендинг — от 1 недели, MVP «Быстрый старт» — 2-3 недели, MVP Pro — 4-6 недель',
'Discovery-воркшоп перед стартом — фиксируем ТЗ и оценку за 1-2 дня',
'Продакшн-разработка с архитектурой, тестами и DevOps для проектов, которым нужно масштабирование',
'Ежемесячное сопровождение и доработки уже запущенных продуктов',
],
},
};
export function getServiceLandingCopy(category) {
return (
SERVICE_LANDING_COPY[category.slug] || {
metaTitle: category.title,
metaDescription: category.description,
h1: category.title,
intro: category.description,
bullets: [],
}
);
}