From 6335b7900a29a84a0cb6967ba17e5272ba6a8e3f Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 24 Oct 2025 17:04:39 +0300 Subject: [PATCH] Backup: Add template files and updated setup script --- EXPORT-TEMPLATE.md | 157 ++++++++++++++++++++----- database_schema_check.md | 248 --------------------------------------- setup-template.sh | 82 ++++++++++++- 3 files changed, 209 insertions(+), 278 deletions(-) delete mode 100644 database_schema_check.md diff --git a/EXPORT-TEMPLATE.md b/EXPORT-TEMPLATE.md index e8f268a..c117385 100644 --- a/EXPORT-TEMPLATE.md +++ b/EXPORT-TEMPLATE.md @@ -47,65 +47,158 @@ docker run --rm -v digital_legal_entitydle_backend_node_modules:/source -v $(pwd docker run --rm -v digital_legal_entitydle_frontend_node_modules:/source -v $(pwd)/docker-data/volumes:/backup alpine tar czf /backup/frontend_node_modules.tar.gz -C /source . ``` -### 4. Загрузить все в GitHub +### 4. Создать архив для GitHub Release ```bash -# Добавить файлы в git -git add docker-data/ +# Создать сжатый архив +tar -czf dle-template.tar.gz docker-data/ -# Закоммитить -git commit -m "Add exported images and volumes" +# Проверить размер +ls -lh dle-template.tar.gz +# Ожидаемый размер: ~5.3GB +``` -# Запушить в репозиторий -git push +### 5. Создать GitHub Release +```bash +# Создать тег версии +git tag v1.0.0 +git push origin v1.0.0 + +# GitHub автоматически создаст Release +# Затем вручную загрузить dle-template.tar.gz в Release ``` ## 📊 Результат -После выполнения всех команд в репозитории будут: -- ✅ Все образы как файлы (.tar) -- ✅ Все тома как файлы (.tar.gz) -- ✅ Полный шаблон приложения +После выполнения всех команд: +- ✅ **GitHub Release** с архивом `dle-template.tar.gz` (5.3GB) +- ✅ **Все образы** как файлы (.tar) внутри архива +- ✅ **Все тома** как файлы (.tar.gz) внутри архива +- ✅ **Полный шаблон** приложения готов к скачиванию ## 🚀 Использование шаблона ### Для пользователей: + +#### Автоматическая установка (рекомендуется): ```bash -# Клонировать репозиторий +# Скачать и запустить скрипт установки +curl -fsSL https://raw.githubusercontent.com/VC-HB3-Accelerator/DLE/main/setup-template.sh | bash +``` + +#### Ручная установка: +```bash +# 1. Клонировать репозиторий git clone https://github.com/VC-HB3-Accelerator/DLE.git cd DLE -# Импортировать образы +# 2. Скачать архив из GitHub Release +# Перейти на страницу Release и скачать dle-template.tar.gz (5.3GB) + +# 3. Распаковать архив +tar -xzf dle-template.tar.gz + +# 4. Импортировать образы docker load -i docker-data/images/backend.tar docker load -i docker-data/images/frontend.tar docker load -i docker-data/images/vector-search.tar docker load -i docker-data/images/ollama.tar docker load -i docker-data/images/webssh-agent.tar -# Импортировать тома +# 5. Создать и импортировать тома docker volume create digital_legal_entitydle_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 - docker volume create digital_legal_entitydle_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 - docker volume create digital_legal_entitydle_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 - docker volume create digital_legal_entitydle_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 - docker volume create digital_legal_entitydle_frontend_node_modules + +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 +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 +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 +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 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 -# Запустить приложение +# 6. Запустить приложение docker-compose up -d ``` -## ⚠️ Важные замечания +## 📊 Точные размеры экспорта -1. **Размер файлов**: Образы могут быть большими (несколько GB) -2. **Время загрузки**: Зависит от размера файлов и скорости интернета -3. **Место на диске**: Убедитесь, что достаточно места для всех файлов +### Образы (5 файлов .tar): +- `backend.tar` - **36MB** +- `frontend.tar` - **45MB** +- `vector-search.tar` - **40MB** +- `ollama.tar` - **46MB** +- `webssh-agent.tar` - **47MB** +- **Итого образы**: ~215MB + +### Volumes (5 файлов .tar.gz): +- `postgres_data.tar.gz` - **28MB** +- `ollama_data.tar.gz` - **5.2GB** (самый большой!) +- `vector_search_data.tar.gz` - **87 байт** (пустой) +- `backend_node_modules.tar.gz` - **127MB** +- `frontend_node_modules.tar.gz` - **40MB** +- **Итого volumes**: ~5.4GB + +### **ОБЩИЙ РАЗМЕР**: ~5.6GB + +## 🚨 Проблема с GitHub + +**GitHub имеет лимиты:** +- Максимум 100MB на файл +- Максимум 1GB на репозиторий (бесплатно) +- Наш архив 5.3GB превышает лимиты! + +## 💡 Варианты решения для хранения архива + +### 1. GitHub Releases (рекомендуется) ✅ +```bash +# Создать архив +tar -czf dle-template.tar.gz docker-data/ + +# Создать тег и Release +git tag v1.0.0 +git push origin v1.0.0 + +# Загрузить dle-template.tar.gz в GitHub Release +# Лимит: 2GB на файл, 10GB на релиз +``` +**Плюсы**: +- Простота настройки +- Нет лимитов размера (до 2GB на файл) +- Версионирование релизов +- Отдельно от кода репозитория + +**Минусы**: +- Пользователи скачивают архив отдельно +- Нужно обновлять инструкции + +### 2. Git LFS (Large File Storage) +```bash +# Настроить LFS +git lfs track "*.tar" "*.tar.gz" +git add .gitattributes +git add docker-data/ +``` +**Плюсы**: Автоматическое управление большими файлами +**Минусы**: Лимит 1GB (бесплатно), нужен Git LFS + +### 3. Внешние хранилища +- **Google Drive** - 15GB бесплатно +- **Dropbox** - 2GB бесплатно +- **OneDrive** - 5GB бесплатно +- **Mega** - 20GB бесплатно + +### 4. Облачные хранилища +- **AWS S3** - платно, но надежно +- **Google Cloud Storage** - платно +- **Azure Blob** - платно + +### 5. Разделение на части +```bash +# Разделить архив на части по 1GB +split -b 1G dle-template.tar.gz dle-template-part- +# Результат: dle-template-part-aa, dle-template-part-ab, etc. +``` ## 📁 Структура после экспорта @@ -127,4 +220,12 @@ docker-data/ ## ✅ Готово! -После выполнения всех команд у вас будет полный шаблон приложения в GitHub репозитории, который можно клонировать и запускать на любом устройстве. +После выполнения всех команд у вас будет: +- ✅ **GitHub Release** с архивом `dle-template.tar.gz` (5.3GB) +- ✅ **Полный шаблон** приложения готов к скачиванию +- ✅ **Автоматический скрипт** установки для пользователей +- ✅ **Ручные инструкции** для продвинутых пользователей + +**Пользователи могут:** +1. **Автоматически**: `curl -fsSL ... | bash` +2. **Вручную**: Скачать архив из Release и следовать инструкциям diff --git a/database_schema_check.md b/database_schema_check.md deleted file mode 100644 index 7e5bef9..0000000 --- a/database_schema_check.md +++ /dev/null @@ -1,248 +0,0 @@ -# Проверка схемы базы данных - -## Таблица `users` -```sql -CREATE TABLE users ( - id SERIAL PRIMARY KEY, - username VARCHAR(255), - email VARCHAR(255) UNIQUE, - address VARCHAR(255) UNIQUE, - first_name_encrypted TEXT, - last_name_encrypted TEXT, - status VARCHAR(50) DEFAULT 'active', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - role user_role DEFAULT 'user', - first_name VARCHAR(255), - last_name VARCHAR(255), - preferred_language JSONB, - is_blocked BOOLEAN DEFAULT false, - blocked_at TIMESTAMP -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `username` - VARCHAR(255) -- `email` - VARCHAR(255) UNIQUE -- `address` - VARCHAR(255) UNIQUE -- `first_name_encrypted` - TEXT (зашифрованное) -- `last_name_encrypted` - TEXT (зашифрованное) -- `status` - VARCHAR(50) DEFAULT 'active' -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- `updated_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- `role` - user_role DEFAULT 'user' -- `first_name` - VARCHAR(255) (незашифрованное) -- `last_name` - VARCHAR(255) (незашифрованное) -- `preferred_language` - JSONB -- `is_blocked` - BOOLEAN DEFAULT false -- `blocked_at` - TIMESTAMP - -## Таблица `conversations` -```sql -CREATE TABLE conversations ( - id SERIAL PRIMARY KEY, - user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, - title VARCHAR(255), - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - conversation_type VARCHAR(50) DEFAULT 'user_chat' -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `user_id` - INTEGER REFERENCES users(id) -- `title` - VARCHAR(255) (НЕ зашифрованное!) -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- `updated_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- `conversation_type` - VARCHAR(50) DEFAULT 'user_chat' - -## Таблица `messages` -```sql -CREATE TABLE messages ( - id SERIAL PRIMARY KEY, - conversation_id INTEGER REFERENCES conversations(id) ON DELETE CASCADE, - sender_type_encrypted TEXT NOT NULL, - sender_id INTEGER, - content_encrypted TEXT, - channel_encrypted TEXT NOT NULL, - role_encrypted TEXT NOT NULL DEFAULT 'user', - direction_encrypted TEXT, - metadata JSONB, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, - tokens_used INTEGER DEFAULT 0, - is_processed BOOLEAN DEFAULT false, - role VARCHAR(20) NOT NULL DEFAULT 'user', - attachment_filename TEXT, - attachment_mimetype TEXT, - attachment_size BIGINT, - attachment_data BYTEA, - direction VARCHAR(8), - message_type VARCHAR(20) DEFAULT 'public' -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `conversation_id` - INTEGER REFERENCES conversations(id) -- `sender_type_encrypted` - TEXT NOT NULL (зашифрованное) -- `sender_id` - INTEGER -- `content_encrypted` - TEXT (зашифрованное) -- `channel_encrypted` - TEXT NOT NULL (зашифрованное) -- `role_encrypted` - TEXT NOT NULL DEFAULT 'user' (зашифрованное) -- `direction_encrypted` - TEXT (зашифрованное) -- `metadata` - JSONB -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- `user_id` - INTEGER REFERENCES users(id) -- `tokens_used` - INTEGER DEFAULT 0 -- `is_processed` - BOOLEAN DEFAULT false -- `role` - VARCHAR(20) NOT NULL DEFAULT 'user' (НЕ зашифрованное!) -- `attachment_filename` - TEXT -- `attachment_mimetype` - TEXT -- `attachment_size` - BIGINT -- `attachment_data` - BYTEA -- `direction` - VARCHAR(8) (НЕ зашифрованное!) -- `message_type` - VARCHAR(20) DEFAULT 'public' - -**Триггеры:** -- `trg_set_message_user_id` - автоматически устанавливает user_id - -## Таблица `conversation_participants` -```sql -CREATE TABLE conversation_participants ( - id SERIAL PRIMARY KEY, - conversation_id INTEGER REFERENCES conversations(id) ON DELETE CASCADE, - user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UNIQUE(conversation_id, user_id) -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `conversation_id` - INTEGER REFERENCES conversations(id) -- `user_id` - INTEGER REFERENCES users(id) -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP - -**Индексы:** -- PRIMARY KEY на `id` -- UNIQUE CONSTRAINT на `(conversation_id, user_id)` -- Индекс на `conversation_id` -- Индекс на `user_id` - -## Таблица `admin_read_messages` -```sql -CREATE TABLE admin_read_messages ( - admin_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - last_read_at TIMESTAMP NOT NULL, - PRIMARY KEY (admin_id, user_id) -); -``` - -**Колонки:** -- `admin_id` - INTEGER NOT NULL REFERENCES users(id) (админ) -- `user_id` - INTEGER NOT NULL REFERENCES users(id) (пользователь) -- `last_read_at` - TIMESTAMP NOT NULL (время последнего прочтения) - -**Индексы:** -- PRIMARY KEY на `(admin_id, user_id)` - -## Таблица `admin_read_contacts` -```sql -CREATE TABLE admin_read_contacts ( - admin_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - contact_id TEXT NOT NULL, - read_at TIMESTAMP NOT NULL DEFAULT NOW(), - PRIMARY KEY (admin_id, contact_id) -); -``` - -**Колонки:** -- `admin_id` - INTEGER NOT NULL REFERENCES users(id) (админ) -- `contact_id` - TEXT NOT NULL (ID контакта) -- `read_at` - TIMESTAMP NOT NULL DEFAULT NOW() (время прочтения) - -**Индексы:** -- PRIMARY KEY на `(admin_id, contact_id)` -- Индекс на `admin_id` -- Индекс на `contact_id` - -## Таблица `user_identities` -```sql -CREATE TABLE user_identities ( - id SERIAL PRIMARY KEY, - user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, - provider_encrypted TEXT NOT NULL, - provider_id_encrypted TEXT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `user_id` - INTEGER REFERENCES users(id) (пользователь) -- `provider_encrypted` - TEXT NOT NULL (зашифрованный провайдер) -- `provider_id_encrypted` - TEXT NOT NULL (зашифрованный ID провайдера) -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP - -**Индексы:** -- PRIMARY KEY на `id` -- Индекс на `user_id` - -## Таблица `user_preferences` -```sql -CREATE TABLE user_preferences ( - id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - preference_key VARCHAR(50) NOT NULL, - preference_value TEXT, - metadata JSONB DEFAULT '{}', - created_at TIMESTAMP NOT NULL DEFAULT NOW(), - updated_at TIMESTAMP NOT NULL DEFAULT NOW(), - UNIQUE(user_id, preference_key) -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `user_id` - INTEGER NOT NULL REFERENCES users(id) (пользователь) -- `preference_key` - VARCHAR(50) NOT NULL (ключ настройки) -- `preference_value` - TEXT (значение настройки) -- `metadata` - JSONB DEFAULT '{}' (метаданные) -- `created_at` - TIMESTAMP NOT NULL DEFAULT NOW() -- `updated_at` - TIMESTAMP NOT NULL DEFAULT NOW() - -**Индексы:** -- PRIMARY KEY на `id` -- Индекс на `user_id` -- UNIQUE CONSTRAINT на `(user_id, preference_key)` - -## Таблица `user_tag_links` -```sql -CREATE TABLE user_tag_links ( - id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - tag_id INTEGER NOT NULL REFERENCES user_rows(id) ON DELETE CASCADE, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UNIQUE(user_id, tag_id) -); -``` - -**Колонки:** -- `id` - SERIAL PRIMARY KEY -- `user_id` - INTEGER NOT NULL REFERENCES users(id) (пользователь) -- `tag_id` - INTEGER NOT NULL REFERENCES user_rows(id) (тег) -- `created_at` - TIMESTAMP DEFAULT CURRENT_TIMESTAMP - -**Индексы:** -- PRIMARY KEY на `id` -- Индекс на `user_id` -- Индекс на `tag_id` -- UNIQUE CONSTRAINT на `(user_id, tag_id)` - -## Анализ проблем в коде - -Теперь, имея полную схему базы данных, давайте проверим код на соответствие: diff --git a/setup-template.sh b/setup-template.sh index a3043f8..e710405 100755 --- a/setup-template.sh +++ b/setup-template.sh @@ -53,7 +53,7 @@ check_docker_running() { print_green "✅ Docker запущен" } -# Скачивание репозитория +# Скачивание репозитория и архива download_repo() { print_blue "📥 Скачивание репозитория..." if [ -d "DLE" ]; then @@ -72,6 +72,79 @@ download_repo() { git clone https://github.com/VC-HB3-Accelerator/DLE.git cd DLE print_green "✅ Репозиторий скачан" + + # Скачивание архива из GitHub Release + download_archive +} + +# Скачивание архива из GitHub Release +download_archive() { + print_blue "📦 Скачивание архива из GitHub Release..." + + # Проверяем наличие архива + if [ -f "dle-template.tar.gz" ]; then + print_yellow "⚠️ Архив dle-template.tar.gz уже существует" + read -p "Перескачать архив? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + rm -f dle-template.tar.gz + else + print_blue "Используем существующий архив" + extract_archive + return + fi + fi + + # Получаем URL последнего релиза + print_blue "🔍 Поиск последнего релиза..." + RELEASE_URL=$(curl -s https://api.github.com/repos/VC-HB3-Accelerator/DLE/releases/latest | grep "browser_download_url.*dle-template.tar.gz" | cut -d '"' -f 4) + + if [ -z "$RELEASE_URL" ]; then + print_red "❌ Не удалось найти архив в релизах!" + print_yellow "Проверьте, что релиз создан и содержит dle-template.tar.gz" + print_blue "Ручная установка:" + print_blue "1. Перейдите на https://github.com/VC-HB3-Accelerator/DLE/releases" + print_blue "2. Скачайте dle-template.tar.gz" + print_blue "3. Поместите в папку DLE" + print_blue "4. Запустите скрипт снова" + exit 1 + fi + + print_blue "📥 Скачивание архива (5.3GB)..." + print_yellow "Это может занять несколько минут..." + + if curl -L -o dle-template.tar.gz "$RELEASE_URL"; then + print_green "✅ Архив скачан" + extract_archive + else + print_red "❌ Ошибка скачивания архива!" + print_yellow "Попробуйте скачать вручную:" + print_blue "1. Перейдите на https://github.com/VC-HB3-Accelerator/DLE/releases" + print_blue "2. Скачайте dle-template.tar.gz" + print_blue "3. Поместите в папку DLE" + print_blue "4. Запустите скрипт снова" + exit 1 + fi +} + +# Распаковка архива +extract_archive() { + print_blue "📦 Распаковка архива..." + + if [ ! -f "dle-template.tar.gz" ]; then + print_red "❌ Архив dle-template.tar.gz не найден!" + exit 1 + fi + + if tar -xzf dle-template.tar.gz; then + print_green "✅ Архив распакован" + print_blue "🗑️ Удаление архива для экономии места..." + rm -f dle-template.tar.gz + print_green "✅ Архив удален" + else + print_red "❌ Ошибка распаковки архива!" + exit 1 + fi } # Проверка файлов образов @@ -213,12 +286,14 @@ check_status() { main() { print_blue "🚀 Установка шаблона приложения Digital Legal Entity" print_blue "==================================================" + print_blue "📦 Автоматическое скачивание из GitHub Release" + print_blue "==================================================" # Проверки check_docker check_docker_running - # Скачивание + # Скачивание репозитория и архива download_repo # Проверка файлов @@ -241,6 +316,9 @@ main() { print_blue " Запуск: docker-compose up -d" print_blue " Остановка: docker-compose down" print_blue " Логи: docker-compose logs" + print_blue "==================================================" + print_blue "📝 Примечание: Архив (5.3GB) автоматически скачан и удален" + print_blue " для экономии места на диске" } # Запуск