Files
DLE/setup.sh

254 lines
10 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
# All rights reserved.
# This software is proprietary and confidential.
# For licensing inquiries: info@hb3-accelerator.com
# Вывод цветного текста
print_green() {
echo -e "\e[32m$1\e[0m"
}
print_blue() {
echo -e "\e[34m$1\e[0m"
}
print_yellow() {
echo -e "\e[33m$1\e[0m"
}
print_red() {
echo -e "\e[31m$1\e[0m"
}
# Проверка и установка Docker и Docker Compose
check_docker() {
print_blue "Проверка наличия Docker..."
if ! command -v docker &> /dev/null; then
print_yellow "Docker не установлен."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
print_blue "Автоматическая установка Docker для Linux..."
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
rm get-docker.sh
print_green "Docker установлен. Перезапустите терминал или выполните: newgrp docker"
else
print_yellow "Пожалуйста, установите Docker вручную: https://docs.docker.com/get-docker/"
print_yellow "Для Windows/Mac: скачайте и установите Docker Desktop."
exit 1
fi
fi
print_green "Docker установлен."
print_blue "Проверка Docker Compose..."
if ! docker compose version &> /dev/null; then
print_yellow "Docker Compose не установлен или требуется обновление."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
print_blue "Установка Docker Compose (входит в новые версии Docker)..."
print_yellow "Если после установки Docker Compose не работает, обновите Docker или следуйте инструкции: https://docs.docker.com/compose/install/"
else
print_yellow "Пожалуйста, установите Docker Compose вручную: https://docs.docker.com/compose/install/"
exit 1
fi
fi
print_green "Docker Compose установлен."
}
# Инструкция для пользователей без git
print_no_git_instructions() {
print_blue "Если у вас нет git, скачайте архив проекта с GitHub:"
print_yellow "1. Перейдите на https://github.com/VC-HB3-Accelerator/DLE"
print_yellow "2. Нажмите 'Code' > 'Download ZIP'"
print_yellow "3. Распакуйте архив и перейдите в папку проекта"
print_yellow "4. Запустите этот скрипт: ./setup.sh"
}
# Все настройки хранятся в зашифрованной базе данных
# Создание ключа шифрования
create_encryption_key() {
print_blue "Проверка ключа шифрования..."
# Проверяем наличие OpenSSL
if ! command -v openssl &> /dev/null; then
print_yellow "OpenSSL не установлен. Установка..."
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
sudo apt-get update && sudo apt-get install -y openssl
else
print_red "Пожалуйста, установите OpenSSL вручную: https://www.openssl.org/"
exit 1
fi
fi
# Создаём папку для ключей
mkdir -p ./ssl/keys
# Генерируем ключ шифрования (если его нет)
if [ ! -f "./ssl/keys/full_db_encryption.key" ]; then
print_blue "🔑 Генерация ключа шифрования..."
openssl rand -base64 32 > ./ssl/keys/full_db_encryption.key
chmod 600 ./ssl/keys/full_db_encryption.key
print_green "✅ Ключ создан: ./ssl/keys/full_db_encryption.key"
else
print_green "✅ Ключ шифрования уже существует."
fi
}
# Предварительная загрузка образов
pull_images() {
print_blue "Предварительная загрузка образов Docker..."
images=("node:20-alpine" "postgres:16-alpine" "ollama/ollama:latest" "curlimages/curl:latest")
for img in "${images[@]}"; do
print_blue "Загрузка образа: $img"
docker pull $img
if [ $? -ne 0 ]; then
print_yellow "Предупреждение: Не удалось загрузить образ $img, но продолжаем работу..."
else
print_green "Образ $img успешно загружен."
fi
done
}
# Запуск проекта
start_project() {
print_blue "Запуск проекта..."
# Сначала убедимся, что предыдущие контейнеры остановлены
print_blue "Остановка существующих контейнеров..."
docker compose down
# Запуск сервисов в Docker Compose
print_blue "Запуск сервисов (PostgreSQL, Ollama, Backend, Frontend)..."
docker compose up -d
# Проверяем, что сервисы запустились
if [ $? -eq 0 ]; then
print_green "Сервисы успешно запущены!"
# Предзагрузка моделей Ollama
print_blue "Предзагрузка моделей Ollama..."
print_yellow "Это может занять несколько минут..."
# Ждем, пока Ollama запустится
print_blue "Ожидание запуска Ollama..."
for i in {1..30}; do
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
print_green "Ollama готов!"
break
fi
if [ $i -eq 30 ]; then
print_yellow "Ollama не ответил за 60 секунд, продолжаем без предзагрузки..."
break
fi
sleep 2
done
# Предзагружаем модели
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
print_blue "Предзагрузка qwen2.5:7b..."
curl -X POST http://localhost:11434/api/generate -d '{"model": "qwen2.5:7b", "prompt": "test", "stream": false}' > /dev/null 2>&1
print_blue "Предзагрузка mxbai-embed-large:latest..."
curl -X POST http://localhost:11434/api/generate -d '{"model": "mxbai-embed-large:latest", "prompt": "test", "stream": false}' > /dev/null 2>&1
print_green "✅ Модели предзагружены и останутся в памяти!"
fi
# Добавляем токены аутентификации
print_blue "🔑 Добавление токенов аутентификации..."
./scripts/internal/db/db_init_helper.sh 2>/dev/null || print_yellow "Токены уже добавлены или скрипт недоступен"
# Создаём функции шифрования в PostgreSQL
print_blue "📝 Создание функций шифрования в PostgreSQL..."
docker exec dapp-postgres psql -U dapp_user -d dapp_db << 'EOF' 2>/dev/null || print_yellow "Функции шифрования уже существуют или БД не готова"
-- Создаём расширение для шифрования
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Функция для шифрования текста
CREATE OR REPLACE FUNCTION encrypt_text(data text, key text)
RETURNS text AS $$
BEGIN
IF data IS NULL THEN
RETURN NULL;
END IF;
RETURN encode(encrypt_iv(data::bytea, decode(key, 'base64'), decode('000102030405060708090A0B0C0D0E0F', 'hex'), 'aes-cbc'), 'base64');
END;
$$ LANGUAGE plpgsql;
-- Функция для расшифровки текста
CREATE OR REPLACE FUNCTION decrypt_text(encrypted_data text, key text)
RETURNS text AS $$
BEGIN
IF encrypted_data IS NULL THEN
RETURN NULL;
END IF;
RETURN convert_from(decrypt_iv(decode(encrypted_data, 'base64'), decode(key, 'base64'), decode('000102030405060708090A0B0C0D0E0F', 'hex'), 'aes-cbc'), 'utf8');
END;
$$ LANGUAGE plpgsql;
-- Функция для шифрования JSON
CREATE OR REPLACE FUNCTION encrypt_json(data jsonb, key text)
RETURNS text AS $$
BEGIN
IF data IS NULL THEN
RETURN NULL;
END IF;
RETURN encode(encrypt_iv(data::text::bytea, decode(key, 'base64'), decode('000102030405060708090A0B0C0D0E0F', 'hex'), 'aes-cbc'), 'base64');
END;
$$ LANGUAGE plpgsql;
-- Функция для расшифровки JSON
CREATE OR REPLACE FUNCTION decrypt_json(encrypted_data text, key text)
RETURNS jsonb AS $$
BEGIN
IF encrypted_data IS NULL THEN
RETURN NULL;
END IF;
RETURN convert_from(decrypt_iv(decode(encrypted_data, 'base64'), decode(key, 'base64'), decode('000102030405060708090A0B0C0D0E0F', 'hex'), 'aes-cbc'), 'utf8')::jsonb;
END;
$$ LANGUAGE plpgsql;
EOF
print_green "----------------------------------------"
print_green "Проект Digital_Legal_Entity(DLE) доступен по адресам:"
print_green "Frontend: http://localhost:5173"
print_green "Backend API: http://localhost:8000"
print_green "Ollama API: http://localhost:11434"
print_green "PostgreSQL: localhost:5432"
print_green "----------------------------------------"
print_green "🔐 Ключ шифрования: ./ssl/keys/full_db_encryption.key"
print_green "📋 Все настройки хранятся в зашифрованной базе данных"
print_green "----------------------------------------"
print_green "ИИ-ассистент готов к работе!"
print_green "----------------------------------------"
else
print_red "Произошла ошибка при запуске сервисов."
print_yellow "Проверьте логи командой: docker compose logs"
print_yellow "Для просмотра логов конкретного сервиса: docker compose logs [service]"
print_yellow "Например: docker compose logs backend"
fi
}
# Основная функция
main() {
print_blue "==============================================="
print_blue " Установка и запуск Digital_Legal_Entity(DLE)"
print_blue "==============================================="
print_yellow "\nЕсли у вас нет git, скачайте проект архивом с GitHub!"
print_no_git_instructions
check_docker
create_encryption_key
pull_images
start_project
}
# Запуск основной функции
main