Files
2026-08-03 21:02:34 +04:00

102 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LabNetHub — сайт компании
Сайт на Next.js 14 (App Router) + TypeScript + Tailwind CSS для компании
LabNetHub: разработка сайтов, ботов для соцсетей, настройка CRM, хостинг
и IT-поддержка.
## Быстрый старт
```bash
npm install
cp .env.local.example .env.local # заполните реальными значениями
npm run dev
```
Сайт откроется на http://localhost:3000
Сборка для продакшена:
```bash
npm run build
npm run start
```
## Структура проекта
```
app/ — страницы (App Router)
page.tsx — Главная
websites/ — Сайты
bots/ — Боты
crm/ — CRM
hosting/ — Хостинг и серверы
support/ — IT-поддержка
contacts/ — Контакты
api/contact/ — API-роут формы обратной связи (→ Telegram)
components/ — переиспользуемые компоненты (Header, Footer, карточки и т.д.)
config/
contacts.ts — все контакты и ссылки на соцсети в одном месте
services.ts — данные для карточек услуг и навигации
```
## Что нужно заполнить перед публикацией
1. **Контакты** — откройте `config/contacts.ts` и замените placeholder-ссылки
на реальные: Telegram, VK, WhatsApp, email, город.
2. **Telegram-уведомления формы** — в `.env.local` укажите:
- `TELEGRAM_BOT_TOKEN` — токен бота, полученный у [@BotFather](https://t.me/BotFather)
- `TELEGRAM_CHAT_ID` — ID чата/канала для приёма заявок.
Узнать свой ID можно, написав боту [@userinfobot](https://t.me/userinfobot),
либо через метод `getUpdates` вашего бота.
3. **Домен** — в `app/layout.tsx` поле `metadataBase` укажите на ваш реальный домен.
## Форма обратной связи
Форма на странице `/contacts` отправляет данные на `POST /api/contact`.
Роут проверяет обязательные поля, убирает HTML-теги (защита от инъекций),
экранирует спецсимволы Markdown и пересылает сообщение в Telegram через
Bot API. В форме также есть скрытое honeypot-поле для защиты от простых ботов.
## Безопасность
В `next.config.mjs` включены базовые защитные HTTP-заголовки:
`Strict-Transport-Security`, `X-Frame-Options`, `X-Content-Type-Options`,
`Referrer-Policy`, `Permissions-Policy`.
Рекомендации для сервера при деплое:
- Раздавайте сайт только по HTTPS (например, сертификат Let's Encrypt через certbot).
- На уровне nginx настройте `limit_req` для `/api/contact`, чтобы ограничить
количество запросов от одного адреса в минуту.
- Храните `.env.local` вне репозитория — файл уже добавлен в `.gitignore`.
- Регулярно обновляйте зависимости (`npm outdated` / `npm audit`).
## Деплой на свой сервер (LabNetHub VDS/VPS)
Пример запуска через PM2 за nginx как обратным прокси:
```bash
npm run build
pm2 start npm --name labnethub -- start
```
В конфиге nginx проксируйте запросы на `http://127.0.0.1:3000` и подключите
SSL-сертификат. При желании сайт также можно собрать в статику
(`output: "export"` в `next.config.mjs`) — тогда `/api/contact` работать не будет,
и форму нужно будет переключить на внешний сервис отправки писем.
## Цветовая тема
Токены дизайна заданы в `tailwind.config.ts`:
- `base` — тёмно-синий фон (`base.950` — основной фон страницы)
- `blue` — основной акцент бренда
- `green` — акцент раздела «Хостинг и серверы»
- `ink` — оттенки текста
Шрифты (`Unbounded`, `Manrope`, `JetBrains Mono`) подключены через
`next/font/google` в `app/layout.tsx` — при сборке скачиваются один раз
и дальше работают без обращений к Google Fonts во время выполнения.