first commit

This commit is contained in:
grigorij
2026-08-03 21:02:34 +04:00
commit b0bafe740f
39 changed files with 2326 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# 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 во время выполнения.