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:
commit
130c5382cd
108 files changed
+7146
No files matched your search
@@ -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(() => {}),
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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 }),
|
||||
};
|
||||
@@ -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: [],
|
||||
}
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user