# Инструкция по развертыванию и настройке

## Содержание
1. [Требования к серверу](#требования-к-серверу)
2. [Развертывание в cPanel](#развертывание-в-cpanel)
3. [Настройка базы данных](#настройка-базы-данных)
4. [Настройка переменных окружения](#настройка-переменных-окружения)
5. [Интеграция с 1С:УНФ](#интеграция-с-1сунф)
6. [Проверка работоспособности](#проверка-работоспособности)

---

## Требования к серверу

### Минимальные требования
- **Node.js**: v18.x или выше
- **npm** или **bun**: последние версии
- **SQLite** (встроен) или MySQL/PostgreSQL для продакшена
- **Память**: минимум 512 MB RAM
- **Диск**: минимум 1 GB

### Рекомендуемые требования для cPanel
- Пакет с поддержкой Node.js (Node.js Selector или Application Manager)
- SSH доступ (желательно)
- SSL сертификат (обязательно для работы с 1С)

---

## Развертывание в cPanel

### Шаг 1: Подготовка проекта

#### Вариант A: Через Git (рекомендуется)

```bash
# В cPanel откройте Terminal или используйте SSH
cd /home/youruser/

# Клонируйте репозиторий
git clone https://github.com/your-repo/krovlia-lk.git
cd krovlia-lk
```

#### Вариант B: Через загрузку файлов

1. Создайте архив проекта (без node_modules):
```bash
# На локальной машине
zip -r krovlia-lk.zip . -x "node_modules/*" -x ".next/*" -x "*.log"
```

2. Загрузите архив через **File Manager** в cPanel
3. Распакуйте в нужную директорию

### Шаг 2: Установка зависимостей

```bash
cd /home/youruser/krovlia-lk

# Установка bun (если не установлен)
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc

# Или используйте npm
npm install

# Если используете bun
bun install
```

### Шаг 3: Настройка через Node.js Selector (cPanel)

1. В cPanel найдите **Software** → **Setup Node.js App**
2. Нажмите **Create Application**
3. Заполните поля:
   - **Node.js version**: 18.x или выше
   - **Application mode**: Production
   - **Application root**: `/home/youruser/krovlia-lk`
   - **Application URL**: выберите домен/поддомен
   - **Application startup file**: `server.js` (создайте, если нет)

4. Создайте файл `server.js` в корне проекта:
```javascript
// server.js
const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');

const dev = process.env.NODE_ENV !== 'production';
const hostname = process.env.HOSTNAME || 'localhost';
const port = process.env.PORT || 3000;

const app = next({ dev, hostname, port });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  createServer(async (req, res) => {
    try {
      const parsedUrl = parse(req.url, true);
      await handle(req, res, parsedUrl);
    } catch (err) {
      console.error('Error occurred handling', req.url, err);
      res.statusCode = 500;
      res.end('internal server error');
    }
  })
    .once('error', (err) => {
      console.error(err);
      process.exit(1);
    })
    .listen(port, () => {
      console.log(`> Ready on http://${hostname}:${port}`);
    });
});
```

### Шаг 4: Сборка проекта

```bash
cd /home/youruser/krovlia-lk

# Установка переменных окружения для сборки
export NODE_ENV=production

# Сборка (Turbopack отключен для совместимости с cPanel)
npm run build
# или
bun run build
```

> **Важно для cPanel:** Если возникает ошибка `Symlink node_modules is invalid`, 
> проект уже настроен для использования Webpack вместо Turbopack.
> Если проблема сохраняется, выполните:
> ```bash
> # Удаление и переустановка node_modules без симлинков
> rm -rf node_modules
> npm install --no-bin-links
> npm run build
> ```

### Шаг 5: Инициализация базы данных

```bash
# Применение схемы базы данных
npx prisma db push
# или
bunx prisma db push

# Заполнение начальными данными (категории, товары, пользователи)
npx tsx prisma/seed.ts
# или
bunx tsx prisma/seed.ts
```

### Шаг 6: Запуск приложения

В cPanel Node.js Selector нажмите **Restart** после настройки.

Или через терминал:
```bash
npm run start
# или
bun run start
```

---

## Настройка базы данных

### SQLite (по умолчанию)

Проект использует SQLite по умолчанию. База данных создается автоматически в файле `db/custom.db`.

### MySQL (рекомендуется для продакшена)

1. В cPanel создайте базу данных и пользователя:
   - **MySQL Databases** → Create New Database
   - Создайте пользователя и назначьте права

2. Измените `prisma/schema.prisma`:
```prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}
```

3. Добавьте в `.env`:
```env
DATABASE_URL="mysql://user:password@localhost:3306/krovlia_lk"
```

4. Выполните миграцию:
```bash
npx prisma db push
npx prisma migrate dev --name init
```

---

## Настройка переменных окружения

Создайте файл `.env` в корне проекта:

```env
# ============================================
# ОСНОВНЫЕ НАСТРОЙКИ
# ============================================

# Режим работы (production для продакшена)
NODE_ENV=production

# URL вашего сайта (обязательно!)
NEXTAUTH_URL=https://lk.yoursite.by

# Секретный ключ для сессий (сгенерируйте уникальный!)
NEXTAUTH_SECRET=your-super-secret-key-change-this-in-production

# ============================================
# БАЗА ДАННЫХ
# ============================================

# SQLite (по умолчанию)
DATABASE_URL="file:./db/custom.db"

# Или MySQL
# DATABASE_URL="mysql://dbuser:dbpassword@localhost:3306/dbname"

# ============================================
# ИНТЕГРАЦИЯ С 1С
# ============================================

# Логин для обмена с 1С (укажите свой)
EXCHANGE_1C_LOGIN=exchange_user

# Пароль для обмена с 1С (укажите сложный пароль)
EXCHANGE_1C_PASSWORD=your_secure_password_here

# ============================================
# ДОПОЛНИТЕЛЬНО (ОПЦИОНАЛЬНО)
# ============================================

# Email для уведомлений
SMTP_HOST=smtp.yourmail.by
SMTP_PORT=587
SMTP_USER=noreply@yoursite.by
SMTP_PASS=your_smtp_password
```

### Генерация NEXTAUTH_SECRET

```bash
# Вариант 1: OpenSSL
openssl rand -base64 32

# Вариант 2: Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

# Вариант 3: Online
# https://generate-secret.vercel.app/32
```

---

## Интеграция с 1С:УНФ

### Обзор интеграции

Система поддерживает двусторонний обмен данными с 1С:Управление нашей фирмой (редакция для Беларуси) по протоколу CommerceML 2.0.

**Что синхронизируется:**
- ✅ Номенклатура (товары)
- ✅ Категории товаров
- ✅ Заказы (в обе стороны)
- ✅ Клиенты/Контрагенты
- ✅ Статусы заказов

### Шаг 1: Настройка в 1С:УНФ

1. Откройте 1С:УНФ в режиме предприятия
2. Перейдите в раздел **Администрирование** → **Обмен данными**
3. Выберите **Обмен с сайтами**

4. Нажмите **Создать** и заполните:
   - **Наименование**: Кровельный центр (ЛК)
   - **Хост**: `https://lk.yoursite.by`
   - **Путь к скрипту обмена**: `/api/1c/exchange`
   - **Имя пользователя**: `exchange_user` (из .env)
   - **Пароль**: `your_secure_password_here` (из .env)

5. В разделе **Настройка обмена** отметьте:
   - ✅ Выгружать номенклатуру
   - ✅ Выгружать категории
   - ✅ Выгружать клиентов
   - ✅ Получать заказы
   - ✅ Выгружать статусы заказов

6. Сохраните настройки

### Шаг 2: Настройка соответствия данных

В 1С перейдите в **Обмен с сайтами** → ваш сайт → **Настройка соответствия**:

#### Склады
- Укажите склад, с которого будет списываться товар при заказах с сайта

#### Виды цен
- Создайте вид цены "Розничная" (соответствует полю `price`)
- Создайте вид цены "Оптовая" (соответствует полю `wholesalePrice`)
- Настройте автоматическое применение оптовой цены при достижении объема

#### Статусы заказов
Настройте соответствие статусов:

| Статус в ЛК | Статус в 1С |
|-------------|-------------|
| NEW | Новый |
| PROCESSING | В обработке |
| CONFIRMED | Подтвержден |
| IN_PRODUCTION | В производстве |
| READY | Готов к отгрузке |
| SHIPPED | Отгружен |
| DELIVERED | Доставлен |
| CANCELLED | Отменен |

### Шаг 3: Тестирование подключения

1. В 1С нажмите **Проверить подключение**
2. Должно появиться сообщение: "Подключение успешно"

### Шаг 4: Первичная выгрузка

1. Нажмите **Выгрузить данные**
2. Выберите:
   - ✅ Номенклатура (все товары)
   - ✅ Категории
   - ✅ Остатки на складах
   - ✅ Цены

3. Дождитесь завершения выгрузки

### Шаг 5: Настройка автоматического обмена

В 1С настройте регламентное задание:

1. **Администрирование** → **Общие настройки** → **Регламентные задания**
2. Создайте новое задание:
   - **Имя**: Обмен с сайтом Кровельный центр
   - **Расписание**: каждые 15-30 минут
   - **Действие**: Обмен с сайтом
   - **Параметры**: выберите настроенный обмен

### API Endpoint для обмена

```
URL: https://lk.yoursite.by/api/1c/exchange

Методы:
- GET ?mode=checkauth - Аутентификация
- GET ?mode=init - Инициализация обмена
- GET ?mode=query - Запрос заказов для экспорта в 1С
- POST ?mode=file&type=catalog - Импорт номенклатуры
- POST ?mode=file&type=sale - Импорт заказов и клиентов
```

### Логирование обмена

Все операции обмена логируются в таблицу `SyncLog`. Просмотреть логи можно:
- Через базу данных (таблица SyncLog)
- Или создать административную страницу (опционально)

---

## Проверка работоспособности

### 1. Проверка работы сайта

Откройте в браузере: `https://lk.yoursite.by`

Должна открыться главная страница с формой входа.

### 2. Проверка API

```bash
# Проверка API продуктов
curl https://lk.yoursite.by/api/products

# Проверка API категорий
curl https://lk.yoursite.by/api/categories
```

### 3. Проверка авторизации

Используйте тестовые аккаунты:

| Роль | Email | Пароль |
|------|-------|--------|
| Менеджер | manager@krovlia.by | manager123 |
| Клиент | client@test.by | client123 |

⚠️ **Важно!** После первого входа измените пароли в продакшене!

### 4. Проверка обмена с 1С

```bash
# Проверка аутентификации
curl -u exchange_user:your_password "https://lk.yoursite.by/api/1c/exchange?mode=checkauth"

# Должен вернуться ответ:
# success
# exchange_session
# <timestamp>
```

### 5. Проверка базы данных

```bash
# Подключение к SQLite
sqlite3 db/custom.db

# Проверка таблиц
.tables

# Проверка количества товаров
SELECT COUNT(*) FROM Product;

# Выход
.exit
```

---

## Устранение неполадок

### Проблема: 500 Internal Server Error

1. Проверьте логи:
```bash
tail -100 /home/youruser/krovlia-lk/dev.log
```

2. Проверьте права на файлы:
```bash
chmod -R 755 /home/youruser/krovlia-lk
chmod 644 /home/youruser/krovlia-lk/.env
chmod 644 /home/youruser/krovlia-lk/db/custom.db
```

### Проблема: Ошибка базы данных

1. Пересоздайте базу:
```bash
rm db/custom.db
npx prisma db push
npx tsx prisma/seed.ts
```

### Проблема: 1С не подключается

1. Проверьте SSL сертификат (должен быть валидный)
2. Проверьте логин/пароль в .env
3. Проверьте доступность сайта извне
4. Проверьте брандмауэр (порт 443 должен быть открыт)

### Проблема: Медленная работа

1. Увеличите лимит памяти Node.js:
```bash
export NODE_OPTIONS="--max-old-space-size=1024"
```

2. Включите кэширование в cPanel (если доступно)

---

## Резервное копирование

### Автоматическое резервное копирование

Создайте скрипт `/home/youruser/backup.sh`:

```bash
#!/bin/bash
BACKUP_DIR="/home/youruser/backups"
DATE=$(date +%Y%m%d_%H%M%S)
PROJECT_DIR="/home/youruser/krovlia-lk"

mkdir -p $BACKUP_DIR

# Бэкап базы данных
cp $PROJECT_DIR/db/custom.db $BACKUP_DIR/db_$DATE.db

# Бэкап загрузок (если есть)
# cp -r $PROJECT_DIR/public/uploads $BACKUP_DIR/uploads_$DATE

# Удаление старых бэкапов (старше 30 дней)
find $BACKUP_DIR -name "*.db" -mtime +30 -delete

echo "Backup completed: $DATE"
```

Добавьте в crontab:
```bash
# Ежедневный бэкап в 3:00 ночи
0 3 * * * /home/youruser/backup.sh >> /home/youruser/backup.log 2>&1
```

---

## Обновление проекта

```bash
cd /home/youruser/krovlia-lk

# Остановка приложения (в cPanel Node.js Selector)

# Получение обновлений
git pull origin main

# Установка новых зависимостей
npm install

# Применение миграций базы данных
npx prisma db push

# Пересборка
npm run build

# Запуск приложения (в cPanel Node.js Selector)
```

---

## Контакты и поддержка

При возникновении вопросов обращайтесь к разработчику или в службу технической поддержки.

**Версия документа:** 1.0  
**Дата обновления:** Декабрь 2024
