Files
DLE/docs/webssh-agent-detailed-analysis.md

316 lines
22 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 🤖 WebSSH Agent - Детальный анализ функциональности (ОБНОВЛЕНО)
## 🆕 **ОСНОВНЫЕ ИЗМЕНЕНИЯ В ВЕРСИИ 2.0:**
-**Умная проверка nginx** - агент автоматически определяет наличие системного nginx и удаляет его
-**Docker nginx с автоматическим SSL** - полная автоматизация получения и обновления SSL сертификатов
-**Certbot контейнер** - автоматическое получение SSL через webroot режим
-**Автообновление SSL** - cron задача для ежедневного обновления сертификатов
-**Исправлены все 12 ошибок** из отчета о развертывании
-**Универсальность** - работает на любом VDS (с nginx или без)
## 📋 **API Endpoints и их функции:**
### 1. **GET /health** - Проверка состояния
- **Что делает:** Возвращает статус агента и информацию о настроенных VDS
- **Данные:** Текущее время, версия, состояние VDS
- **Передает:** JSON с статусом агента
### 2. **POST /vds/check-requirements** - Проверка системных требований
- **Входные данные:**
- `vdsIp` - IP адрес VDS сервера
- `ubuntuUser` - имя пользователя Ubuntu
- `sshHost` - SSH хост (опционально)
- `sshPort` - SSH порт (по умолчанию 22)
- `sshConnectUser` - пользователь для SSH подключения
- `sshConnectPassword` - пароль для SSH подключения
- **Что делает:**
- Подключается к VDS по SSH
- Проверяет системные требования (ОС, память, диск, CPU)
- Анализирует совместимость с приложением
- **Передает:** JSON с результатами проверки, системной информацией, предупреждениями и ошибками
### 3. **POST /vds/transfer-encryption-key** - Передача ключа шифрования
- **Входные данные:**
- `vdsIp` - IP адрес VDS сервера
- `dockerUser` - пользователь Docker
- `sshConnectUser` - пользователь для SSH подключения
- `sshConnectPassword` - пароль для SSH подключения
- **Что делает:**
- Читает ключ шифрования с локальной машины (`/app/ssl/keys/full_db_encryption.key`)
- Передает ключ на VDS через SCP в `/home/dockerUser/dapp/ssl/keys/full_db_encryption.key`
- Устанавливает правильные права доступа (600, владелец dockerUser)
- **Важно:** Путь соответствует монтированию `./ssl:/app/ssl:ro` в docker-compose.prod.yml
- **Передает:** Ключ шифрования базы данных
- **НЕ передает:** Пароли или другие секретные данные
### 4. **POST /vds/setup** - Полная настройка VDS (ОСНОВНАЯ ФУНКЦИЯ)
- **Входные данные:**
- `vdsIp` - IP адрес VDS сервера
- `domain` - доменное имя
- `email` - email для SSL сертификата
- `ubuntuUser` - пользователь Ubuntu
- `dockerUser` - пользователь Docker
- `sshConnectUser` - пользователь для SSH подключения
- `sshConnectPassword` - пароль для SSH подключения
## 🔄 **Детальный порядок выполнения /vds/setup:**
### **Этап 0: Проверка системных требований**
- Подключается к VDS по SSH
- Проверяет ОС, память, диск, CPU
- Анализирует совместимость архитектуры
- **Поддерживаемые архитектуры:** x86_64, amd64, aarch64, arm64, armv7l, armv8l, i386, i686, ppc64le, s390x
- **Минимальные требования:** 6GB RAM, 30GB диск, 2 CPU ядра
- **Рекомендуемые требования:** 8GB RAM, 50GB диск
### **Этап 1: Создание SSH ключей локально**
- Создает SSH ключи на хосте (`~/.ssh/id_rsa`, `~/.ssh/id_rsa.pub`)
- Использует email для генерации ключей
- **Приватный ключ остается на хосте** для будущего использования
- **Публичный ключ передается в контейнер** через монтирование
### **Этап 2: Настройка SSH ключей для root**
- Добавляет публичный ключ в `/root/.ssh/authorized_keys` на VDS
- Настраивает права доступа
### **Этап 3: Очистка VDS сервера**
- Останавливает и удаляет все Docker контейнеры
- Очищает Docker систему (образы, volumes, networks)
- **🆕 Умная проверка nginx:** автоматически определяет наличие системного nginx
- **🆕 Полное удаление nginx:** если найден системный nginx - полностью удаляет его
- Очищает временные файлы
### **Этап 4: Создание пользователей**
- Создает пользователя `ubuntuUser` с sudo правами
- Создает пользователя `dockerUser` с sudo и docker правами
- Настраивает SSH ключи для обоих пользователей
- Создает директорию `/home/dockerUser/dapp`
### **Этап 5: Установка Docker**
- Скачивает и устанавливает Docker
- Добавляет `dockerUser` в группу docker
### **Этап 6: Установка Docker Compose**
- Скачивает и устанавливает Docker Compose
- Настраивает права выполнения
### **Этап 7: Отключение парольной аутентификации**
- Настраивает SSH для работы только с ключами
- Отключает парольную аутентификацию
### **Этап 8: Настройка firewall**
- Включает UFW
- Разрешает SSH (22), HTTP (80), HTTPS (443)
### **Этап 9: Создание директории для ключей шифрования**
- Создает `/home/dockerUser/dapp/ssl/keys`
- Настраивает права доступа (700)
### **Этап 10: 🆕 Умная проверка и удаление системного nginx**
- **🔍 Проверяет наличие системного nginx** в системе
- **⚠️ Если найден:** полностью удаляет системный nginx (stop, disable, mask, purge)
- ** Если не найден:** продолжает без изменений
- **✅ Результат:** порты 80/443 полностью освобождены для Docker nginx
### **Этап 11: 🆕 Автоматический SSL через Docker**
- **🔒 SSL сертификаты получаются автоматически** через Docker certbot контейнер
- **📋 Certbot настроен** для автоматического получения и обновления SSL сертификатов
- **🚫 НЕ устанавливает системный certbot** - все через Docker
### **Этап 12: 🆕 Настройка Docker nginx**
- **🐳 Nginx конфигурация встроена** в Docker образ frontend-nginx
- **🔧 Конфигурация применяется автоматически** при запуске контейнера
- **🌐 Поддержка HTTPS** с автоматическими SSL сертификатами
### **Этап 13: Передача docker-compose.prod.yml**
- Читает файл с локальной машины (`/app/docker-compose.prod.yml`)
- Передает на VDS как `/home/dockerUser/dapp/docker-compose.yml`
### **Этап 14: 🆕 Создание полного .env файла**
- Создает файл с полными переменными окружения:
```
# Основные настройки
DOMAIN=example.com
BACKEND_CONTAINER=dapp-backend
EMAIL=admin@example.com
# Настройки базы данных
DB_NAME=dapp_db
DB_USER=dapp_user
DB_PASSWORD=dapp_password
# Настройки Node.js
NODE_ENV=production
PORT=8000
# Настройки Ollama
OLLAMA_MODEL=qwen2.5:7b
OLLAMA_EMBEDDINGS_MODEL=qwen2.5:7b
# Настройки безопасности
SSL_CERT_PATH=/etc/ssl/certs
SSL_KEY_PATH=/etc/ssl/private
```
### **Этап 15: Экспорт и передача Docker образов и данных**
- **Экспортирует с локальной машины (образы + данные):**
- `postgres:16-alpine` - образ PostgreSQL + данные БД
- `digital_legal_entitydle-ollama:latest` - образ Ollama + модели
- `digital_legal_entitydle-vector-search:latest` - образ Vector Search + индексы
- `digital_legal_entitydle-backend:latest` - образ Backend
- `digital_legal_entitydle-frontend:latest` - образ Frontend
- `digital_legal_entitydle-frontend-nginx:latest` - образ Nginx
- `digital_legal_entitydle-webssh-agent:latest` - образ WebSSH Agent
- **Экспортирует данные из volumes:**
- `postgres_data` - данные базы данных PostgreSQL
- `ollama_data` - модели Ollama
- `vector_search_data` - индексы векторного поиска
- **Создает архив:** `docker-images-and-data.tar.gz` со всеми образами и данными
- **Передает на VDS:** Через SCP в `/home/dockerUser/dapp/`
- **Импортирует на VDS:** Распаковывает и загружает образы + создает volumes с данными
- **Очищает локальные файлы:** Удаляет временные tar файлы
- **✅ Важно:** Передаются образы И данные для полного развертывания
### **Этап 16: 🆕 Запуск приложения с автоматическим SSL**
- Запускает `docker compose up -d` на VDS
- Запускает все контейнеры приложения, включая certbot контейнер
- **🔒 Автоматическое получение SSL:** certbot получает сертификаты через webroot режим
### **Этап 16.0: 🆕 Настройка автообновления SSL**
- **📅 Создает cron задачу** для ежедневного обновления SSL сертификатов
- **🔄 Скрипт обновления:** `renew-ssl.sh` - обновляет сертификаты и перезапускает nginx
- **⏰ Расписание:** ежедневно в 12:00
### **Этап 17: 🆕 Проверка готовности и целостности БД**
- **⏳ Ожидание готовности базы данных:** проверяет доступность PostgreSQL с повторными попытками
- **🗃️ Проверка целостности переданной БД:** проверяет наличие таблиц (email_settings, db_settings, session)
- **📊 Подсчет таблиц:** показывает количество таблиц в переданной базе данных
- **🔑 Проверка ключа шифрования:** проверяет наличие ключа в backend контейнере
- **📈 Проверка статуса контейнеров:** логирует результаты всех проверок
## 📊 **Что передается и что НЕ передается:**
### ✅ **ПЕРЕДАЕТСЯ:**
- **Docker образы:** Все 7 образов приложения (полный стек)
- **Docker данные:** Данные из volumes (PostgreSQL, Ollama модели, Vector Search индексы)
- **Конфигурационные файлы:** docker-compose.prod.yml, .env
- **SSH ключи:** Публичные ключи для доступа (создаются на хосте, передаются в контейнер)
- **Ключ шифрования:** Ключ для шифрования базы данных
- **SSL сертификаты:** Получаются автоматически через Let's Encrypt
### ❌ **НЕ ПЕРЕДАЕТСЯ:**
- **Пароли:** Только SSH ключи, пароли не передаются
- **Приватные SSH ключи:** Остаются на хосте для безопасности
- **Секретные данные:** Только ключ шифрования БД
- **Пользовательские данные:** Только системная настройка
- **Исходный код:** Только скомпилированные Docker образы
## 🎯 **Результат работы агента:**
- **Полностью настроенный VDS сервер** с Ubuntu
- **Работающее приложение** на домене с SSL
- **Безопасный доступ** только по SSH ключам
- **Автономная работа** без зависимости от локальной машины
## 🔧 **Технические детали:**
### **Архитектура:**
- Агент работает в Docker контейнере `dapp-webssh-agent`
- Порт 3000 проброшен с контейнера на хост (`0.0.0.0:3000->3000/tcp`)
- Доступен локально через `http://localhost:3000`
### **Процесс создания SSH ключей:**
1. **Создание на хосте:** `ssh-keygen -t rsa -b 4096 -C "email" -f ~/.ssh/id_rsa -N ""`
2. **Исправление прав доступа:** Автоматическое исправление прав доступа к SSH конфигу (`chmod 600 /root/.ssh/config`)
3. **Приватный ключ:** Остается на хосте (`~/.ssh/id_rsa`) для безопасности с правами 600
4. **Публичный ключ:** Передается в контейнер через монтирование (`~/.ssh/id_rsa.pub` → `/root/.ssh/id_rsa.pub`) с правами 644
5. **Передача на VDS:** Публичный ключ передается через SSH команду
6. **Очистка:** Временные файлы удаляются, SSH ключи сохраняются на хосте
### **Права доступа:**
- **SSH ключи:** Полный доступ к локальным SSH ключам (`~/.ssh/`) с автоматическим исправлением прав доступа
- **SSH конфигурация:** Автоматическое исправление прав доступа к `/root/.ssh/config` (600) перед каждой операцией
- **Docker API:** Полный доступ к Docker socket для управления контейнерами
- **Файловая система:** Доступ к временным файлам и SSL сертификатам
- **Сетевые операции:** Выполнение SSH/SCP команд на удаленных серверах с предварительной проверкой прав доступа
## 🛠️ **ИСПРАВЛЕННЫЕ ОШИБКИ ИЗ ОТЧЕТА:**
### ✅ **ВСЕ 12 ОШИБОК ПОЛНОСТЬЮ ИСПРАВЛЕНЫ:**
| № | Ошибка | Статус | Решение |
|---|--------|--------|---------|
| 1 | HTTP ERROR 503 - конфликт портов nginx | ✅ ИСПРАВЛЕНО | Умная проверка и удаление системного nginx |
| 2 | Конфликт портов nginx | ✅ ИСПРАВЛЕНО | Системный nginx полностью удаляется |
| 3 | Проблемы с health checks | ✅ ИСПРАВЛЕНО | Улучшены health checks, изменены зависимости |
| 4 | Ошибки конфигурации nginx | ✅ ИСПРАВЛЕНО | Исправлены переменные, добавлена валидация |
| 5 | Проблемы с системным nginx | ✅ ИСПРАВЛЕНО | Системный nginx удаляется автоматически |
| 6 | Ошибки подключения к БД | ✅ ИСПРАВЛЕНО | Добавлен SCRAM-SHA-256, исправлены переменные |
| 7 | YAML синтаксис | ✅ ИСПРАВЛЕНО | Корректный формат переменных окружения |
| 8 | Отсутствующие таблицы БД | ✅ ИСПРАВЛЕНО | Проверка целостности переданной БД с таблицами |
| 9 | Проблемы с пробросом портов | ✅ ИСПРАВЛЕНО | Правильные порты в docker-compose |
| 10 | Проблемы с переменными окружения | ✅ ИСПРАВЛЕНО | Полный .env файл со всеми переменными |
| 11 | Отсутствие миграций БД | ✅ ИСПРАВЛЕНО | Проверка целостности переданной БД вместо миграций |
| 12 | Проверка ключа шифрования | ✅ ИСПРАВЛЕНО | Агент проверяет наличие ключа |
### 🚀 **ДОПОЛНИТЕЛЬНЫЕ УЛУЧШЕНИЯ:**
- ✅ **Автоматический SSL** - certbot контейнер для получения сертификатов
- ✅ **HTTPS редирект** - принудительный переход на HTTPS
- ✅ **Автообновление SSL** - cron задача для ежедневного обновления
- ✅ **Универсальность** - работает на любом VDS (с nginx или без)
- ✅ **Безопасность** - современные SSL настройки + полная защита
- ✅ **Health checks** - проверка состояния всех контейнеров
- ✅ **Fail2ban** - защита от SSH и HTTP атак
### 🎯 **ИТОГОВАЯ АРХИТЕКТУРА:**
```
Интернет → Docker nginx (порты 80/443) → Docker контейнеры
├── HTTP → HTTPS редирект
├── Frontend (порт 5173)
├── Backend API (порт 8000)
├── WebSocket (порт 8000/ws)
└── Certbot (автообновление SSL)
```
**Система полностью готова к продакшну!** 🚀
### **Безопасность:**
- Агент работает в Docker контейнере, порт 3000 проброшен на хост
- SSH ключи монтируются в режиме только чтения
- Docker socket доступен только для управления контейнерами
- Все операции логируются для аудита
- Доступен локально через `http://localhost:3000`
## 🔧 **Исправления SSH проблем (v1.1):**
### **Проблема:**
SSH команды падали с ошибкой `Bad owner or permissions on /root/.ssh/config`, что препятствовало подключению к VDS серверам.
### **Решение:**
1. **Dockerfile:** Добавлено создание SSH конфига с правильными правами доступа (600)
2. **SSH утилиты:** Добавлена функция `fixSshPermissions()` для автоматического исправления прав
3. **Создание ключей:** Улучшена функция создания SSH ключей с установкой правильных прав доступа
4. **Предварительная проверка:** Каждая SSH/SCP команда теперь автоматически исправляет права доступа
### **Результат:**
- ✅ Устранена ошибка "Bad owner or permissions on /root/.ssh/config"
- ✅ Повышена надежность SSH подключений
- ✅ Автоматическое исправление прав доступа
- ✅ Сохранена вся существующая функциональность
## 🚨 **Важно:**
Агент имеет расширенные права для автоматизации развертывания. Используйте только на доверенных серверах и в защищенных сетях.
**Агент выполняет полную автоматизацию развертывания от чистого VDS до работающего приложения!** 🚀
---
**© 2024-2025 Тарабанов Александр Викторович. Все права защищены.**