358 lines
12 KiB
Bash
Executable File
358 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
||
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||
# All rights reserved.
|
||
# This software is proprietary and confidential.
|
||
# For licensing inquiries: info@hb3-accelerator.com
|
||
|
||
# Скрипт для автоматической установки шаблона приложения DLE
|
||
# Скачивает репозиторий, проверяет Docker, импортирует образы и тома, запускает приложение
|
||
|
||
# Цветной вывод
|
||
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"
|
||
}
|
||
|
||
ARCHIVE_VERSION="v1.0.1"
|
||
ARCHIVE_BASE_URL="https://github.com/VC-HB3-Accelerator/DLE/releases/download/${ARCHIVE_VERSION}"
|
||
ARCHIVE_PARTS=(
|
||
"dle-template.tar.gz.part-aa"
|
||
"dle-template.tar.gz.part-ab"
|
||
"dle-template.tar.gz.part-ac"
|
||
"dle-template.tar.gz.part-ad"
|
||
)
|
||
|
||
# Проверка curl
|
||
check_curl() {
|
||
print_blue "🔍 Проверка наличия curl..."
|
||
if ! command -v curl &> /dev/null; then
|
||
print_red "❌ Утилита curl не найдена!"
|
||
print_yellow "Установите curl: https://curl.se/download.html"
|
||
exit 1
|
||
fi
|
||
print_green "✅ curl установлен"
|
||
}
|
||
|
||
# Установка Docker
|
||
install_docker() {
|
||
print_blue "📦 Установка Docker..."
|
||
if curl -fsSL https://get.docker.com | bash; then
|
||
print_green "✅ Docker установлен"
|
||
systemctl enable docker 2>/dev/null || true
|
||
systemctl start docker 2>/dev/null || true
|
||
sleep 2
|
||
else
|
||
print_red "❌ Ошибка установки Docker"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Проверка Docker
|
||
check_docker() {
|
||
print_blue "🔍 Проверка Docker..."
|
||
if ! command -v docker &> /dev/null; then
|
||
print_yellow "⚠️ Docker не установлен. Начинаем установку..."
|
||
install_docker
|
||
fi
|
||
|
||
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
|
||
print_yellow "⚠️ Docker Compose не найден, но это нормально - используется встроенный docker compose"
|
||
fi
|
||
|
||
print_green "✅ Docker установлен и готов к работе"
|
||
}
|
||
|
||
# Проверка Docker запущен
|
||
check_docker_running() {
|
||
print_blue "🔍 Проверка запуска Docker..."
|
||
if ! docker info &> /dev/null; then
|
||
print_red "❌ Docker не запущен!"
|
||
print_yellow "Запустите Docker и повторите попытку"
|
||
exit 1
|
||
fi
|
||
print_green "✅ Docker запущен"
|
||
}
|
||
|
||
# Скачивание репозитория
|
||
download_repo() {
|
||
print_blue "📥 Скачивание репозитория..."
|
||
if [ -d "DLE" ]; then
|
||
print_yellow "⚠️ Папка DLE уже существует"
|
||
read -p "Удалить существующую папку? (y/N): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
rm -rf DLE
|
||
else
|
||
print_blue "Используем существующую папку"
|
||
cd DLE
|
||
return
|
||
fi
|
||
fi
|
||
|
||
git clone https://github.com/VC-HB3-Accelerator/DLE.git
|
||
cd DLE
|
||
print_green "✅ Репозиторий скачан"
|
||
}
|
||
|
||
# Загрузка частей архива docker-data
|
||
download_archive_parts() {
|
||
print_blue "📥 Загрузка docker-data из релиза..."
|
||
|
||
local tmp_dir
|
||
tmp_dir=$(mktemp -d)
|
||
|
||
print_blue "Используем временную директорию: $tmp_dir"
|
||
|
||
for part in "${ARCHIVE_PARTS[@]}"; do
|
||
local url="${ARCHIVE_BASE_URL}/${part}"
|
||
print_blue "⇣ Загрузка ${part}..."
|
||
if ! curl -fL --retry 3 --continue-at - --output "${tmp_dir}/${part}" "${url}"; then
|
||
print_red "❌ Не удалось скачать ${part}"
|
||
print_yellow "Проверьте подключение к сети или доступность релиза ${ARCHIVE_VERSION}"
|
||
rm -rf "${tmp_dir}"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
print_blue "🧩 Сборка архива dle-template.tar.gz..."
|
||
cat "${tmp_dir}"/dle-template.tar.gz.part-* > "${tmp_dir}/dle-template.tar.gz"
|
||
|
||
print_blue "🧹 Очистка предыдущих данных docker-data..."
|
||
rm -rf docker-data
|
||
|
||
print_blue "📦 Распаковка docker-data..."
|
||
if tar -xzf "${tmp_dir}/dle-template.tar.gz" -C .; then
|
||
print_green "✅ docker-data успешно распакован"
|
||
else
|
||
print_red "❌ Ошибка распаковки docker-data"
|
||
rm -rf "${tmp_dir}"
|
||
exit 1
|
||
fi
|
||
|
||
rm -rf "${tmp_dir}"
|
||
}
|
||
|
||
# Проверка наличия docker-data, загрузка при необходимости
|
||
ensure_docker_data() {
|
||
print_blue "🔍 Проверка наличия docker-data..."
|
||
if [ -d "docker-data/images" ] && [ -d "docker-data/volumes" ]; then
|
||
print_green "✅ Папка docker-data найдена локально"
|
||
return
|
||
fi
|
||
|
||
print_yellow "⚠️ Папка docker-data отсутствует. Будет выполнена загрузка частей архива."
|
||
check_curl
|
||
download_archive_parts
|
||
}
|
||
|
||
# Проверка файлов образов
|
||
check_images() {
|
||
print_blue "🔍 Проверка файлов образов..."
|
||
if [ ! -d "docker-data/images" ]; then
|
||
print_red "❌ Папка docker-data/images не найдена!"
|
||
print_yellow "Убедитесь, что репозиторий содержит экспортированные образы"
|
||
exit 1
|
||
fi
|
||
|
||
local images=("backend.tar" "frontend.tar" "vector-search.tar" "ollama.tar" "webssh-agent.tar")
|
||
for image in "${images[@]}"; do
|
||
if [ ! -f "docker-data/images/$image" ]; then
|
||
print_red "❌ Файл образа $image не найден!"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
print_green "✅ Все файлы образов найдены"
|
||
}
|
||
|
||
# Проверка файлов томов
|
||
check_volumes() {
|
||
print_blue "🔍 Проверка файлов томов..."
|
||
if [ ! -d "docker-data/volumes" ]; then
|
||
print_red "❌ Папка docker-data/volumes не найдена!"
|
||
print_yellow "Убедитесь, что репозиторий содержит экспортированные тома"
|
||
exit 1
|
||
fi
|
||
|
||
local volumes=("postgres_data.tar.gz" "ollama_data.tar.gz" "vector_search_data.tar.gz" "backend_node_modules.tar.gz" "frontend_node_modules.tar.gz")
|
||
for volume in "${volumes[@]}"; do
|
||
if [ ! -f "docker-data/volumes/$volume" ]; then
|
||
print_red "❌ Файл тома $volume не найден!"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
print_green "✅ Все файлы томов найдены"
|
||
}
|
||
|
||
# Импорт образов
|
||
import_images() {
|
||
print_blue "📦 Импорт образов..."
|
||
|
||
local images=("backend.tar" "frontend.tar" "vector-search.tar" "ollama.tar" "webssh-agent.tar")
|
||
for image in "${images[@]}"; do
|
||
print_blue "Импорт $image..."
|
||
if docker load -i "docker-data/images/$image"; then
|
||
print_green "✅ $image импортирован"
|
||
else
|
||
print_red "❌ Ошибка импорта $image"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
print_green "✅ Все образы импортированы"
|
||
}
|
||
|
||
# Создание томов
|
||
create_volumes() {
|
||
print_blue "💾 Создание томов..."
|
||
|
||
local volumes=("digital_legal_entitydle_postgres_data" "digital_legal_entitydle_ollama_data" "digital_legal_entitydle_vector_search_data" "digital_legal_entitydle_backend_node_modules" "digital_legal_entitydle_frontend_node_modules")
|
||
|
||
for volume in "${volumes[@]}"; do
|
||
if docker volume ls | grep -q "$volume"; then
|
||
print_yellow "⚠️ Том $volume уже существует"
|
||
else
|
||
docker volume create "$volume"
|
||
print_green "✅ Том $volume создан"
|
||
fi
|
||
done
|
||
}
|
||
|
||
# Импорт томов
|
||
import_volumes() {
|
||
print_blue "📥 Импорт данных в тома..."
|
||
|
||
# PostgreSQL
|
||
print_blue "Импорт postgres_data..."
|
||
docker run --rm -v digital_legal_entitydle_postgres_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/postgres_data.tar.gz -C /target
|
||
print_green "✅ postgres_data импортирован"
|
||
|
||
# Ollama
|
||
print_blue "Импорт ollama_data..."
|
||
docker run --rm -v digital_legal_entitydle_ollama_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/ollama_data.tar.gz -C /target
|
||
print_green "✅ ollama_data импортирован"
|
||
|
||
# Vector Search
|
||
print_blue "Импорт vector_search_data..."
|
||
docker run --rm -v digital_legal_entitydle_vector_search_data:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/vector_search_data.tar.gz -C /target
|
||
print_green "✅ vector_search_data импортирован"
|
||
|
||
# Backend node_modules
|
||
print_blue "Импорт backend_node_modules..."
|
||
docker run --rm -v digital_legal_entitydle_backend_node_modules:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/backend_node_modules.tar.gz -C /target
|
||
print_green "✅ backend_node_modules импортирован"
|
||
|
||
# Frontend node_modules
|
||
print_blue "Импорт frontend_node_modules..."
|
||
docker run --rm -v digital_legal_entitydle_frontend_node_modules:/target -v "$(pwd)/docker-data/volumes:/backup" alpine tar xzf /backup/frontend_node_modules.tar.gz -C /target
|
||
print_green "✅ frontend_node_modules импортирован"
|
||
|
||
print_green "✅ Все тома импортированы"
|
||
}
|
||
|
||
# Копирование ключа шифрования из архива
|
||
copy_encryption_key() {
|
||
print_blue "🔐 Копирование ключа шифрования..."
|
||
|
||
# Проверяем наличие ключа в архиве
|
||
if [ -f "docker-data/ssl/keys/full_db_encryption.key" ]; then
|
||
# Создаем директорию для ключа
|
||
mkdir -p ssl/keys
|
||
|
||
# Копируем ключ
|
||
cp docker-data/ssl/keys/full_db_encryption.key ssl/keys/full_db_encryption.key
|
||
chmod 600 ssl/keys/full_db_encryption.key
|
||
|
||
print_green "✅ Ключ шифрования скопирован из архива"
|
||
print_yellow "⚠️ Примечание: Это дефолтный ключ, замените его на свой!"
|
||
else
|
||
print_yellow "⚠️ Ключ шифрования не найден в архиве"
|
||
print_blue "Создайте новый ключ или он будет создан автоматически"
|
||
|
||
# Создаем директорию для ключа на всякий случай
|
||
mkdir -p ssl/keys
|
||
fi
|
||
}
|
||
|
||
# Запуск приложения
|
||
start_application() {
|
||
print_blue "🚀 Запуск приложения..."
|
||
|
||
if docker-compose up -d; then
|
||
print_green "✅ Приложение запущено"
|
||
print_blue "🌐 Доступ к приложению: http://localhost:5173"
|
||
else
|
||
print_red "❌ Ошибка запуска приложения"
|
||
print_yellow "Проверьте логи: docker-compose logs"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Проверка статуса
|
||
check_status() {
|
||
print_blue "🔍 Проверка статуса контейнеров..."
|
||
sleep 10
|
||
|
||
if docker-compose ps | grep -q "Up"; then
|
||
print_green "✅ Контейнеры запущены"
|
||
print_blue "🌐 Приложение доступно по адресу: http://localhost:5173"
|
||
else
|
||
print_yellow "⚠️ Некоторые контейнеры могут быть не готовы"
|
||
print_blue "Проверьте статус: docker-compose ps"
|
||
print_blue "Просмотрите логи: docker-compose logs"
|
||
fi
|
||
}
|
||
|
||
# Основная функция
|
||
main() {
|
||
print_blue "🚀 Установка шаблона приложения Digital Legal Entity"
|
||
print_blue "=================================================="
|
||
|
||
# Проверки
|
||
check_docker
|
||
check_docker_running
|
||
|
||
# Скачивание
|
||
download_repo
|
||
ensure_docker_data
|
||
|
||
# Проверка файлов
|
||
check_images
|
||
check_volumes
|
||
|
||
# Импорт
|
||
import_images
|
||
create_volumes
|
||
import_volumes
|
||
|
||
# Копирование ключа шифрования
|
||
copy_encryption_key
|
||
|
||
# Запуск
|
||
start_application
|
||
check_status
|
||
|
||
print_green "🎉 Установка завершена!"
|
||
print_blue "=================================================="
|
||
print_blue "🌐 Приложение доступно: http://localhost:5173"
|
||
print_blue "🔧 Управление:"
|
||
print_blue " Запуск: docker-compose up -d"
|
||
print_blue " Остановка: docker-compose down"
|
||
print_blue " Логи: docker-compose logs"
|
||
}
|
||
|
||
# Запуск
|
||
main "$@"
|