Files
crm.clientright.ru/erv_ticket/INFRASTRUCTURE.md

290 lines
9.6 KiB
Markdown
Raw Normal View History

# 🏗️ Инфраструктура ERV Ticket Platform
**Создано**: 23.10.2025
**Статус**: В разработке
---
## 📊 Обзор инфраструктуры
### **Принцип**: Используем СУЩЕСТВУЮЩИЕ сервисы, НЕ дублируем!
```
┌─────────────────────────────────────────────────────────────┐
│ ERV Ticket Application │
│ Сервер: 147.45.146.17 │
│ Папка: /var/www/.../erv_ticket/ │
└────────┬────────────────────────────────────────────────────┘
├─► 🗄️ MySQL (localhost:3306)
│ ├─ База: ci20465_erv
│ ├─ Таблица: lexrpiority (проверка полисов)
│ └─ Назначение: CRM данные
├─► 🐘 PostgreSQL (147.45.189.234:5432)
│ ├─ База: default_db
│ ├─ User: gen_user
│ └─ Назначение: Логи, метрики, аналитика, кеш
├─► 🔴 Redis (localhost:6379)
│ ├─ Password: CRM_Redis_Pass_2025_Secure!
│ ├─ Префикс: erv_ticket:
│ └─ Назначение: Кеш, Rate Limiting, Sessions
├─► 🐰 RabbitMQ (185.197.75.249:5672)
│ ├─ User: admin / tyejvtej
│ ├─ VHost: /
│ └─ Назначение: Асинхронные задачи (OCR, API, Email)
├─► 🤖 OCR Service (147.45.146.17:8001)
│ ├─ Контейнер: ocr-analyzer
│ ├─ Форматы: PDF, JPG, PNG, HEIC, DOCX
│ └─ Назначение: Распознавание документов
├─► 🧠 OpenRouter AI (openrouter.ai)
│ ├─ Model: google/gemini-2.0-flash-001
│ ├─ API Key: sk-or-v1-f237...
│ └─ Назначение: Vision AI, извлечение данных
├─► ☁️ S3 Timeweb Cloud (s3.twcstorage.ru)
│ ├─ Bucket: f9825c87-4e3558f6-...
│ └─ Назначение: Хранение файлов
└─► ✈️ FlightAware API (aeroapi.flightaware.com)
├─ API Key: Puz0cdx...
└─ Назначение: Проверка рейсов
```
---
## 🎯 База данных стратегия:
### **MySQL (CRM база)**
```sql
ci20465_erv.lexrpiority
├─ voucher (номер полиса)
├─ insured_from (дата начала)
└─ insured_to (дата окончания)
Назначение:
✅ Проверка полисов
✅ CRM интеграция
```
### **PostgreSQL (новая функциональность)**
```sql
-- Логи приложения
logs
├─ id, level, message, context (JSONB)
├─ ip, user_agent, session_id
└─ created_at
-- История OCR обработки
document_processing
├─ id, session_id, document_type
├─ file_url, s3_url
├─ ocr_text, vision_data (JSONB)
├─ processing_time_ms
└─ created_at
-- Кеш API (fallback)
api_cache
├─ cache_key, cache_value (JSONB)
├─ expires_at
└─ created_at
-- Метрики реального времени
metrics
├─ metric_name, metric_value
├─ tags (JSONB)
└─ created_at
-- Обращения (дубликат для аналитики)
claims
├─ id, session_id, insurance_type
├─ client_data (JSONB)
├─ flight_data (JSONB)
├─ status, crm_ticket_id
└─ created_at
```
**Преимущества PostgreSQL**:
- ✅ JSONB → быстрый поиск по вложенным структурам
- ✅ Полнотекстовый поиск по логам
- ✅ Аналитика SQL без костылей
- ✅ Партиционирование по датам (логи по месяцам)
---
## 🔧 Конфигурация сервисов:
### **config.php обновление:**
```php
// PostgreSQL
define('POSTGRES_HOST', env('POSTGRES_HOST'));
define('POSTGRES_PORT', env('POSTGRES_PORT', 5432));
define('POSTGRES_DB', env('POSTGRES_DB'));
define('POSTGRES_USER', env('POSTGRES_USER'));
define('POSTGRES_PASSWORD', env('POSTGRES_PASSWORD'));
// Создаём PDO подключение
function getPostgresConnection() {
static $pdo = null;
if ($pdo === null) {
$dsn = sprintf(
'pgsql:host=%s;port=%d;dbname=%s',
POSTGRES_HOST,
POSTGRES_PORT,
POSTGRES_DB
);
$pdo = new PDO($dsn, POSTGRES_USER, POSTGRES_PASSWORD, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]);
}
return $pdo;
}
```
---
## 🚀 Процесс разработки и переноса:
### **Сейчас (DEV):**
```bash
Папка: /var/www/.../erv_ticket/
Доступ:
- http://crm.clientright.ru/erv_ticket/ ← Форма
- http://147.45.146.17:3002 ← Gitea
Сервисы (существующие):
✅ Redis (localhost:6379)
✅ RabbitMQ (185.197.75.249:5672)
✅ PostgreSQL (147.45.189.234:5432)
✅ MySQL (localhost:3306)
✅ OCR (147.45.146.17:8001)
Git:
git init
git add .
git commit
git remote add origin http://147.45.146.17:3002/fedya/erv-ticket.git
git push origin main
```
### **Потом (PROD на этом же сервере):**
```bash
# Вариант 1: Другой домен, та же машина
/var/www/erv-claims.clientright.ru/
├─ git clone http://147.45.146.17:3002/fedya/erv-ticket.git .
├─ cp .env.example .env.production
├─ nano .env.production # Меняем настройки на PROD
└─ composer install --no-dev
# Nginx/Apache виртуальный хост:
erv-claims.clientright.ru → /var/www/erv-claims.clientright.ru/public/
Сервисы (ТЕ ЖЕ!):
✅ Redis (localhost:6379) ← Те же!
✅ RabbitMQ (185.197.75.249:5672) ← Те же!
✅ PostgreSQL (147.45.189.234:5432) ← Те же!
✅ MySQL (localhost:3306) ← Те же!
✅ OCR (147.45.146.17:8001) ← Те же!
Различие только в .env:
DEBUG_MODE=false
APP_ENV=production
S3_PATH_PREFIX=prod/erv_ticket/ ← Другая папка в S3
```
### **Или (PROD на другом VPS):**
```bash
# На новом сервере
git clone http://147.45.146.17:3002/fedya/erv-ticket.git
cp .env.example .env.production
# .env.production
REDIS_HOST=147.45.146.17 ← Подключаемся к вашему Redis
RABBITMQ_HOST=185.197.75.249 ← Подключаемся к вашему RabbitMQ
POSTGRES_HOST=147.45.189.234 ← Подключаемся к вашему PostgreSQL
OCR_API_URL=http://147.45.146.17:8001 ← Используем ваш OCR
# Или поднимаем локальные (если нужна независимость):
docker-compose up redis mysql # Локальные копии
```
---
## 🎯 Что делаю СЕЙЧАС:
**1. Создаю SQL миграции для PostgreSQL (10 мин)**
```sql
migrations/
└─ 001_create_logs_tables.sql
└─ 002_create_metrics_tables.sql
└─ 003_create_cache_tables.sql
```
**2. Создаю сервисы с подключением к ВАШИМ инстансам (1 час)**
```php
includes/services/
├─ PostgresLogger.php ← Логи в ваш PostgreSQL
├─ RedisCache.php ← Кеш в ваш Redis
├─ RabbitMQService.php ← Очереди в ваш RabbitMQ
├─ AIService.php ← OpenRouter
├─ OCRService.php ← Ваш OCR
├─ FlightService.php ← FlightAware
└─ S3Service.php ← Ваш S3
```
**3. Тестирую подключения (10 мин)**
```php
test-connections.php
✅ PostgreSQL → OK
✅ Redis → OK
✅ RabbitMQ → OK
✅ MySQL → OK
```
**4. Обновляю форму и API (2 часа)**
---
## 📦 Сводка:
| Сервис | Где находится | Что делаю |
|--------|---------------|-----------|
| **Redis** | localhost:6379 | ✅ Подключаюсь к существующему |
| **RabbitMQ** | 185.197.75.249 | ✅ Подключаюсь к существующему |
| **PostgreSQL** | 147.45.189.234 | ✅ Подключаюсь к существующему |
| **MySQL** | localhost | ✅ Подключаюсь к существующему |
| **OCR** | 147.45.146.17:8001 | ✅ Использую существующий |
| **S3** | Timeweb Cloud | ✅ Использую существующий |
| **Gitea** | 147.45.146.17:3002 | ✅ Создал для Git |
**НЕ создаю новых инстансов! Только PHP обёртки!**
---
## 🚀 Начинаю?
**Шаги:**
1. ✅ Gitea настроен → ты заходишь и создаёшь юзера
2. ✅ Создаю SQL миграции для PostgreSQL
3. ✅ Создаю все сервисы (подключение к вашим инстансам)
4. ✅ Обновляю форму
5. ✅ Тестируем всё вместе
**Согласен? Двигаюсь дальше?** 💪