From a6593e6f33f48b21723b95472fb77d363a1926c2 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 30 Oct 2025 20:40:37 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app.js | 21 +- backend/routes/ollama.js | 16 + backend/routes/settings.js | 16 + backend/services/ollamaConfig.js | 31 +- docs/FAQ.md | 195 ++++++++ frontend/src/components/Sidebar.vue | 6 - .../settings/AI/DatabaseSettingsView.vue | 30 +- .../src/views/settings/AIProviderSettings.vue | 18 + legal/AGREEMENT_DISTRIBUTION_RU.md | 192 ++++++++ legal/ПРАВОВЫЕ_ДОКУМЕНТЫ_ЗАДАЧА.md | 430 ++++++++++++++++++ scripts/internal/db/db_init_helper.sh | 8 +- 11 files changed, 935 insertions(+), 28 deletions(-) create mode 100644 legal/AGREEMENT_DISTRIBUTION_RU.md create mode 100644 legal/ПРАВОВЫЕ_ДОКУМЕНТЫ_ЗАДАЧА.md diff --git a/backend/app.js b/backend/app.js index f2b10f6..29c8594 100644 --- a/backend/app.js +++ b/backend/app.js @@ -185,7 +185,7 @@ const isProduction = process.env.NODE_ENV === 'production'; // Rate limiting const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 минут - max: isProduction ? 100 : 2000, // 100 запросов в продакшне, 2000 в dev + max: isProduction ? 1000 : 10000, // 1000 запросов в продакшне, 10000 в dev message: { error: 'Слишком много запросов, попробуйте позже', retryAfter: '15 минут' @@ -201,7 +201,7 @@ const limiter = rateLimit({ // Строгий rate limiting для чувствительных эндпоинтов const strictLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 минут - max: isProduction ? 10 : 100, // 10 попыток в продакшне, 100 в разработке + max: isProduction ? 100 : 400, // 100 попыток в продакшне, 400 в разработке message: { error: 'Превышен лимит попыток, попробуйте позже', retryAfter: '15 минут' @@ -211,6 +211,19 @@ const strictLimiter = rateLimit({ trustProxy: true, // Доверяем nginx proxy }); +// Мягкий rate limiting для RPC настроек (часто запрашиваемых данных) +const rpcSettingsLimiter = rateLimit({ + windowMs: 1 * 60 * 1000, // 1 минута + max: isProduction ? 200 : 1000, // 200 запросов в продакшне, 1000 в разработке за минуту + message: { + error: 'Слишком много запросов к RPC настройкам, попробуйте позже', + retryAfter: '1 минута' + }, + standardHeaders: true, + legacyHeaders: false, + trustProxy: true, +}); + // Статическая раздача загруженных файлов (для dev и prod) app.use('/uploads', express.static(path.join(__dirname, 'uploads'))); app.use('/api/uploads', express.static(path.join(__dirname, 'uploads'))); @@ -247,7 +260,9 @@ app.use('/api/kpp', kppRoutes); // Добавленное использован app.use('/api/geocoding', geocodingRoutes); // Добавленное использование роута app.use('/api/dle-v2', dleV2Routes); // Добавляем маршрут DLE v2 -app.use('/api/settings', strictLimiter, settingsRoutes); // Строгий rate limiting для настроек +// Применяем разные rate limiters к разным частям настроек +app.use('/api/settings/rpc', rpcSettingsLimiter, settingsRoutes); // Мягкий rate limiting для RPC +app.use('/api/settings', strictLimiter, settingsRoutes); // Строгий rate limiting для остальных настроек app.use('/api/countries', countriesRoutes); // Добавляем маршрут стран app.use('/api/russian-classifiers', russianClassifiersRoutes); // Добавляем маршрут российских классификаторов app.use('/api/ollama', strictLimiter, ollamaRoutes); // Строгий rate limiting для Ollama diff --git a/backend/routes/ollama.js b/backend/routes/ollama.js index ad73ce0..fccf404 100644 --- a/backend/routes/ollama.js +++ b/backend/routes/ollama.js @@ -23,6 +23,22 @@ const ollamaConfig = require('../services/ollamaConfig'); // Инициализируем один раз const TIMEOUTS = ollamaConfig.getTimeouts(); +// Получение дефолтного base URL для Ollama (для настроек UI) +router.get('/default-base-url', requireAuth, async (req, res) => { + try { + const defaultBaseUrl = ollamaConfig.getBaseUrl(); + const fromEnv = !!process.env.OLLAMA_BASE_URL; + res.json({ + baseUrl: defaultBaseUrl, + fromEnv, // флаг, что URL из переменной окружения + priority: fromEnv ? 'environment' : 'default' + }); + } catch (error) { + logger.error('Error getting default base URL:', error); + res.status(500).json({ error: 'Failed to get default base URL' }); + } +}); + // Проверка статуса подключения к Ollama router.get('/status', requireAuth, async (req, res) => { try { diff --git a/backend/routes/settings.js b/backend/routes/settings.js index fc0ef49..46c9ccb 100644 --- a/backend/routes/settings.js +++ b/backend/routes/settings.js @@ -812,6 +812,22 @@ router.get('/encryption-key/status', requireAdmin, async (req, res) => { } }); +// Получить содержимое ключа шифрования +router.get('/encryption-key', requireAdmin, async (req, res) => { + try { + const encryptionUtils = require('../utils/encryptionUtils'); + const encryptionKey = encryptionUtils.getEncryptionKey(); + + if (encryptionKey) { + res.json({ success: true, key: encryptionKey }); + } else { + res.status(404).json({ success: false, message: 'Encryption key not found' }); + } + } catch (error) { + logger.error('Ошибка получения ключа шифрования:', error); + res.status(500).json({ success: false, error: error.message }); + } +}); // Безопасная смена ключа шифрования с перешифровкой данных router.post('/encryption-key/rotate', requireAdmin, async (req, res) => { diff --git a/backend/services/ollamaConfig.js b/backend/services/ollamaConfig.js index f283f22..096d24d 100644 --- a/backend/services/ollamaConfig.js +++ b/backend/services/ollamaConfig.js @@ -47,17 +47,30 @@ async function loadSettingsFromDb() { } } +/** + * Внутренняя функция: определяет base URL из доступных источников + * Приоритет: кэш из БД > переменная окружения > Docker дефолт + * @returns {string} Базовый URL Ollama + */ +function _getBaseUrlFromSources() { + // Приоритет 1: кэш из БД + if (settingsCache && settingsCache.base_url) { + return settingsCache.base_url; + } + // Приоритет 2: переменная окружения + if (process.env.OLLAMA_BASE_URL) { + return process.env.OLLAMA_BASE_URL; + } + // Приоритет 3: Docker дефолт + return 'http://ollama:11434'; +} + /** * Получает базовый URL для Ollama (синхронная версия) * @returns {string} Базовый URL Ollama */ function getBaseUrl() { - // Приоритет: кэш из БД > Docker дефолт - if (settingsCache && settingsCache.base_url) { - return settingsCache.base_url; - } - // URL по умолчанию для Docker - return 'http://ollama:11434'; + return _getBaseUrlFromSources(); } /** @@ -69,15 +82,11 @@ async function getBaseUrlAsync() { if (!settingsCache) { await loadSettingsFromDb(); } - - if (settingsCache && settingsCache.base_url) { - return settingsCache.base_url; - } } catch (error) { logger.warn('[ollamaConfig] Failed to load base_url from DB, using default'); } - return 'http://ollama:11434'; + return _getBaseUrlFromSources(); } /** diff --git a/docs/FAQ.md b/docs/FAQ.md index f0331aa..06da924 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -975,6 +975,201 @@ curl -fsSL https://raw.githubusercontent.com/VC-HB3-Accelerator/DLE/main/setup-t --- +## Вопросы по экономике и ROI + +### Сколько денег сэкономит DLE моему бизнесу? + +**Для бизнеса с оборотом $1M/год**: +- **Банковские комиссии**: экономия $25,750/год (96%) +- **Корпоративное управление**: экономия $42,000/год (78%) +- **Привлечение инвестиций**: экономия $49,400 на сделку (99%) +- **AI без лимитов**: экономия $36,000/год (локальный vs облачный) +- **ИТОГО**: $117,150/год + дополнительная прибыль ~$1,000,000 + +**ROI**: 1,117% на инвестиции в DLE +**Окупаемость**: < 1 месяца + +### Какие скрытые расходы есть у DLE? + +**Единоразовые расходы**: +- Лицензия: $1,000-10,000 USDT +- Деплой смарт-контракта: $100-500 (gas fees) +- Настройка: $0 (самостоятельно) + +**Ежемесячные расходы**: +- Хостинг: $50-200/месяц +- RPC провайдер: $0-100/месяц (можно бесплатно) +- Gas fees: $10-100/месяц (зависит от активности) + +**Сравнение с традиционными решениями**: +- Традиционный бизнес: $54,000+/год +- SaaS решения: $12,000-60,000/год +- DLE: $1,200-3,000/год + +### Как рассчитать экономию для моего бизнеса? + +**Формула расчета**: +``` +Экономия = (Оборот × 0.03) + (Сотрудники × 2000) + (Инвестиции × 0.1) + +Где: +- 0.03 = 3% банковских комиссий +- 2000 = $2,000/год на сотрудника (управление) +- 0.1 = 10% от суммы привлеченных инвестиций +``` + +**Пример для малого бизнеса** (оборот $100,000, 3 сотрудника): +- Банковские комиссии: $3,000 +- Управление: $6,000 +- **ИТОГО**: $9,000/год экономии +- **ROI**: 900% на лицензию $1,000 + +--- + +## Вопросы по практическому применению + +### С чего начать внедрение DLE? + +**Первый месяц**: +1. **Неделя 1**: Установка и настройка +2. **Неделя 2**: Создание базы знаний для AI +3. **Неделя 3**: Настройка электронных таблиц +4. **Неделя 4**: Тестирование и обучение команды + +**Приоритетные задачи**: +1. Настроить CRM для клиентов +2. Создать базу знаний для поддержки +3. Настроить автоматизацию закупок +4. Подключить омниканальные коммуникации + +### Как DLE поможет с клиентами? + +**Автоматизация поддержки**: +- AI отвечает на 80% вопросов клиентов +- Работает 24/7 без выходных +- Анализирует настроение клиентов +- Создает тикеты автоматически + +**Управление клиентской базой**: +- Полная история взаимодействий +- Автоматические напоминания +- Сегментация клиентов +- Прогнозирование потребностей + +**Каналы коммуникации**: +- Telegram бот +- Email поддержка +- Web чат на сайте + +### Как DLE поможет с поставщиками? + +**База поставщиков**: +- Каталог всех поставщиков +- Сравнение цен и условий +- Рейтинг и отзывы +- История сотрудничества + +**AI закупщик**: +- Поиск лучших предложений +- Анализ условий договоров +- Контроль сроков поставок +- Автоматические уведомления + +**Экономия**: +- Снижение закупочных цен на 5-15% +- Ускорение процесса выбора поставщиков +- Снижение рисков + +### Как DLE поможет с финансами? + +**Автоматизация учета**: +- Ведение бухгалтерии +- Формирование отчетов +- Контроль расходов +- Планирование бюджета + +**Блокчейн-финансы**: +- Мгновенные платежи 24/7 +- Комиссии в 50-100 раз ниже +- Нет географических ограничений +- Прозрачность всех операций + +**Аналитика**: +- Прогнозирование денежных потоков +- Анализ рентабельности +- Выявление финансовых рисков +- KPI и метрики + +--- + +## Вопросы по интеграции с существующими системами + +### Как перенести данные из существующих систем? + +**Пошаговый процесс**: +1. **Экспорт данных** из текущей системы +2. **Очистка и форматирование** данных +3. **Импорт в DLE** через веб-интерфейс +4. **Проверка корректности** данных +5. **Настройка связей** между таблицами + +**Поддерживаемые форматы**: +- Excel (.xlsx, .xls) +- CSV +- JSON + +## Вопросы по масштабированию + +### Как DLE масштабируется с ростом бизнеса? + +**Горизонтальное масштабирование**: +- Добавление новых серверов +- Распределение нагрузки +- Кластеризация баз данных +- CDN для статики + +**Вертикальное масштабирование**: +- Увеличение RAM и CPU +- SSD диски +- Оптимизация запросов +- Кэширование + +**Ограничения**: +- **Пользователи**: до 10,000 одновременных +- **Данные**: до 1TB на таблицу +- **API запросы**: до 10,000/минуту +- **Файлы**: до 100GB общий размер + +### Сколько пользователей может работать одновременно? + +**Рекомендуемые лимиты**: +- **Малый бизнес** (до 50 пользователей): стандартная конфигурация +- **Средний бизнес** (до 500 пользователей): увеличенная RAM (32GB+) +- **Крупный бизнес** (до 5,000 пользователей): кластерная конфигурация +- **Корпорации** (10,000+ пользователей): распределенная архитектура + +**Производительность**: +- **Отклик интерфейса**: < 200ms +- **Загрузка страниц**: < 2 секунды +- **API запросы**: < 500ms +- **Поиск**: < 1 секунды + +### Как DLE справляется с большими объемами данных? + +**Оптимизации**: +- **Индексирование**: автоматические индексы для поиска +- **Пагинация**: загрузка данных по частям +- **Кэширование**: Redis для часто используемых данных +- **Сжатие**: сжатие данных в базе + +**Рекомендации**: +- Используйте фильтры для больших таблиц +- Настройте архивирование старых данных +- Регулярно очищайте неиспользуемые файлы +- Мониторьте производительность + +--- + ## Дополнительные ресурсы ### Документация diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue index 62423ae..7e7d8cd 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -141,12 +141,6 @@ 2024-2025. Все права защищены.