Files
crm.clientright.ru/erv_ticket/INFRASTRUCTURE.md
Fedor 9245768987 🚀 CRM Files Migration & Real-time Features
 Features:
- Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.)
- Added Nextcloud folder buttons to ALL modules
- Fixed Nextcloud editor integration
- WebSocket server for real-time updates
- Redis Pub/Sub integration
- File path manager for organized storage
- Redis caching for performance (Functions.php)

📁 New Structure:
Documents/Project/ProjectName_ID/file_docID.ext
Documents/Contacts/FirstName_LastName_ID/file_docID.ext
Documents/Accounts/AccountName_ID/file_docID.ext

🔧 Technical:
- FilePathManager for standardized paths
- S3StorageService integration
- WebSocket server (Node.js + Docker)
- Redis cache for getBasicModuleInfo()
- Predis library for Redis connectivity

📝 Scripts:
- Migration scripts for all modules
- Test pages for WebSocket/SSE/Polling
- Documentation (MIGRATION_*.md, REDIS_*.md)

🎯 Result: 15,000+ files migrated successfully!
2025-10-24 19:59:28 +03:00

9.6 KiB
Raw Permalink Blame 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 база)

ci20465_erv.lexrpiority
├─ voucher (номер полиса)
├─ insured_from (дата начала)
└─ insured_to (дата окончания)

Назначение: 
 Проверка полисов
 CRM интеграция

PostgreSQL (новая функциональность)

-- Логи приложения
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 обновление:

// 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):

Папка: /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 на этом же сервере):

# Вариант 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):

# На новом сервере
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 мин)

migrations/
└─ 001_create_logs_tables.sql
└─ 002_create_metrics_tables.sql
└─ 003_create_cache_tables.sql

2. Создаю сервисы с подключением к ВАШИМ инстансам (1 час)

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 мин)

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. Тестируем всё вместе

Согласен? Двигаюсь дальше? 💪