Backup: Add template files and updated setup script

This commit is contained in:
2025-10-24 17:04:39 +03:00
parent e41f7a8c30
commit 6335b7900a
3 changed files with 209 additions and 278 deletions

View File

@@ -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 и следовать инструкциям

View File

@@ -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)`
## Анализ проблем в коде
Теперь, имея полную схему базы данных, давайте проверим код на соответствие:

View File

@@ -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 " для экономии места на диске"
}
# Запуск