Backup: Add template files and updated setup script
This commit is contained in:
@@ -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 .
|
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
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
# Запушить в репозиторий
|
### 5. Создать GitHub Release
|
||||||
git push
|
```bash
|
||||||
|
# Создать тег версии
|
||||||
|
git tag v1.0.0
|
||||||
|
git push origin v1.0.0
|
||||||
|
|
||||||
|
# GitHub автоматически создаст Release
|
||||||
|
# Затем вручную загрузить dle-template.tar.gz в Release
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📊 Результат
|
## 📊 Результат
|
||||||
|
|
||||||
После выполнения всех команд в репозитории будут:
|
После выполнения всех команд:
|
||||||
- ✅ Все образы как файлы (.tar)
|
- ✅ **GitHub Release** с архивом `dle-template.tar.gz` (5.3GB)
|
||||||
- ✅ Все тома как файлы (.tar.gz)
|
- ✅ **Все образы** как файлы (.tar) внутри архива
|
||||||
- ✅ Полный шаблон приложения
|
- ✅ **Все тома** как файлы (.tar.gz) внутри архива
|
||||||
|
- ✅ **Полный шаблон** приложения готов к скачиванию
|
||||||
|
|
||||||
## 🚀 Использование шаблона
|
## 🚀 Использование шаблона
|
||||||
|
|
||||||
### Для пользователей:
|
### Для пользователей:
|
||||||
|
|
||||||
|
#### Автоматическая установка (рекомендуется):
|
||||||
```bash
|
```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
|
git clone https://github.com/VC-HB3-Accelerator/DLE.git
|
||||||
cd DLE
|
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/backend.tar
|
||||||
docker load -i docker-data/images/frontend.tar
|
docker load -i docker-data/images/frontend.tar
|
||||||
docker load -i docker-data/images/vector-search.tar
|
docker load -i docker-data/images/vector-search.tar
|
||||||
docker load -i docker-data/images/ollama.tar
|
docker load -i docker-data/images/ollama.tar
|
||||||
docker load -i docker-data/images/webssh-agent.tar
|
docker load -i docker-data/images/webssh-agent.tar
|
||||||
|
|
||||||
# Импортировать тома
|
# 5. Создать и импортировать тома
|
||||||
docker volume create digital_legal_entitydle_postgres_data
|
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 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 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 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 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
|
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
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## ⚠️ Важные замечания
|
## 📊 Точные размеры экспорта
|
||||||
|
|
||||||
1. **Размер файлов**: Образы могут быть большими (несколько GB)
|
### Образы (5 файлов .tar):
|
||||||
2. **Время загрузки**: Зависит от размера файлов и скорости интернета
|
- `backend.tar` - **36MB**
|
||||||
3. **Место на диске**: Убедитесь, что достаточно места для всех файлов
|
- `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 и следовать инструкциям
|
||||||
|
|||||||
@@ -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)`
|
|
||||||
|
|
||||||
## Анализ проблем в коде
|
|
||||||
|
|
||||||
Теперь, имея полную схему базы данных, давайте проверим код на соответствие:
|
|
||||||
@@ -53,7 +53,7 @@ check_docker_running() {
|
|||||||
print_green "✅ Docker запущен"
|
print_green "✅ Docker запущен"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Скачивание репозитория
|
# Скачивание репозитория и архива
|
||||||
download_repo() {
|
download_repo() {
|
||||||
print_blue "📥 Скачивание репозитория..."
|
print_blue "📥 Скачивание репозитория..."
|
||||||
if [ -d "DLE" ]; then
|
if [ -d "DLE" ]; then
|
||||||
@@ -72,6 +72,79 @@ download_repo() {
|
|||||||
git clone https://github.com/VC-HB3-Accelerator/DLE.git
|
git clone https://github.com/VC-HB3-Accelerator/DLE.git
|
||||||
cd DLE
|
cd DLE
|
||||||
print_green "✅ Репозиторий скачан"
|
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() {
|
main() {
|
||||||
print_blue "🚀 Установка шаблона приложения Digital Legal Entity"
|
print_blue "🚀 Установка шаблона приложения Digital Legal Entity"
|
||||||
print_blue "=================================================="
|
print_blue "=================================================="
|
||||||
|
print_blue "📦 Автоматическое скачивание из GitHub Release"
|
||||||
|
print_blue "=================================================="
|
||||||
|
|
||||||
# Проверки
|
# Проверки
|
||||||
check_docker
|
check_docker
|
||||||
check_docker_running
|
check_docker_running
|
||||||
|
|
||||||
# Скачивание
|
# Скачивание репозитория и архива
|
||||||
download_repo
|
download_repo
|
||||||
|
|
||||||
# Проверка файлов
|
# Проверка файлов
|
||||||
@@ -241,6 +316,9 @@ main() {
|
|||||||
print_blue " Запуск: docker-compose up -d"
|
print_blue " Запуск: docker-compose up -d"
|
||||||
print_blue " Остановка: docker-compose down"
|
print_blue " Остановка: docker-compose down"
|
||||||
print_blue " Логи: docker-compose logs"
|
print_blue " Логи: docker-compose logs"
|
||||||
|
print_blue "=================================================="
|
||||||
|
print_blue "📝 Примечание: Архив (5.3GB) автоматически скачан и удален"
|
||||||
|
print_blue " для экономии места на диске"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Запуск
|
# Запуск
|
||||||
|
|||||||
Reference in New Issue
Block a user