290 lines
9.6 KiB
Markdown
290 lines
9.6 KiB
Markdown
|
|
# 🏗️ Инфраструктура 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. ✅ Тестируем всё вместе
|
|||
|
|
|
|||
|
|
**Согласен? Двигаюсь дальше?** 💪
|
|||
|
|
|