ваше сообщение коммита

This commit is contained in:
2025-10-03 18:48:11 +03:00
parent ad7b8e9716
commit 67cf473455
42 changed files with 5515 additions and 1180 deletions

View File

@@ -13,17 +13,15 @@
## 📋 **Требования:**
### **1. Входные данные (9 полей):**
- **VDS IP** - IP адрес сервера
- **Домен** - например `example.com` (должен указывать на IP VDS)
### **1. Входные данные (8 полей):**
- **Домен** - например `example.com` (IP адрес определяется автоматически из DNS)
- **Email** - для SSL сертификата
- **Логин Ubuntu** - пользователь для VDS (по умолчанию `ubuntu`)
- **Пароль Ubuntu** - пароль для пользователя VDS
- **Логин Docker** - пользователь для Docker (по умолчанию `docker`)
- **Пароль Docker** - пароль для пользователя Docker
- **SSH пользователь** - обычно `root`
- **SSH ключ** - приватный ключ для подключения
- **Ключ шифрования** - автоматически загружается с локальной машины
- **Логин Ubuntu** - пользователь для VDS (по умолчанию `ubuntu`, создается БЕЗ пароля)
- **Логин Docker** - пользователь для Docker (по умолчанию `docker`, создается БЕЗ пароля)
- **SSH хост** - SSH хост сервера (может отличаться от домена)
- **SSH порт** - SSH порт сервера (обычно 22)
- **SSH пользователь** - пользователь для SSH подключения (обычно `root`)
- **SSH пароль** - пароль для SSH подключения к VDS
### **1.1. Требования к домену:**
- **A запись** `example.com` → IP VDS сервера
@@ -33,25 +31,27 @@
### **2. Что должно происходить:**
1. **Проверка DNS** - валидация A записи домена
2. **Подключение** к VDS по SSH
3. **Очистка** всего содержимого на VDS
4. **Установка** Ubuntu
5. **Создание пользователя Ubuntu** с паролем
6. **Создание пользователя Docker** с паролем
2. **Подключение** к VDS по SSH (root + пароль)
3. **Создание SSH ключей на хосте** агентом автоматически (доступны в контейнерах через монтирование)
4. **Очистка** всего содержимого на VDS
5. **Создание пользователя Ubuntu** БЕЗ пароля (только SSH ключи)
6. **Создание пользователя Docker** БЕЗ пароля (только SSH ключи)
7. **Установка** Docker, Docker Compose, nginx
8. **Настройка** nginx для продакшн приложения
9. **Получение** SSL сертификата
10. **Миграция** Docker образов с локальной машины
11. **Передача ключей** (шифрования и RSA) на VDS
12. **Обновление переменных** в БД VDS
8. **Настройка безопасности** (UFW, отключение парольной аутентификации)
9. **Настройка** nginx для продакшн приложения
10. **Получение** SSL сертификата
11. **Экспорт и передача** Docker образов с локальной машины
12. **Передача ключа шифрования** на VDS
13. **Запуск** DLE приложения в Docker
### **3. Результат:**
- **VDS полностью очищена** и переустановлена
- **Ubuntu установлена** с пользователями Ubuntu и Docker
- **Docker образы** мигрированы с локальной машины
- **Ключи переданы** с локальной машины на VDS
- **Переменные обновлены** в БД VDS
- **VDS полностью очищена** и настроена
- **Пользователи Ubuntu и Docker** созданы БЕЗ паролей (только SSH ключи)
- **Базовый софт установлен** (Docker, nginx, SSL)
- **Безопасность настроена** (UFW, отключение парольной аутентификации)
- **Docker образы** экспортированы и переданы с локальной машины
- **Ключ шифрования** передан с локальной машины на VDS
- **SSH ключи** настроены для безопасного доступа
- **DLE приложение** работает в Docker на VDS
- **Домен работает** с SSL
- **Приложение работает** автономно на VDS
@@ -63,48 +63,419 @@
Интернет → VDS nginx (домен) → VDS Docker приложение (автономно)
Настройка:
Локальная машина → SSH → VDS сервер → Очистка + Ubuntu + Docker миграция
Локальная машина → WebSSH Agent (Docker) → SSH → VDS сервер → Очистка + Ubuntu + Docker миграция
```
## 🤖 **WebSSH Agent - Автоматизация развертывания:**
### 🚀 **Возможности агента:**
WebSSH Agent - это мощный инструмент для автоматического развертывания приложения на VDS серверах.
**Архитектура:**
- Агент работает в Docker контейнере `dapp-webssh-agent`
- Порт 3000 проброшен с контейнера на хост (`0.0.0.0:3000->3000/tcp`)
- Доступен локально через `http://localhost:3000`
- Имеет расширенные права для автоматизации развертывания
#### 🔐 **Права доступа:**
- **SSH ключи:** Полный доступ к локальным SSH ключам (`~/.ssh/`)
- **Docker API:** Полный доступ к Docker socket для управления контейнерами
- **Файловая система:** Доступ к временным файлам и SSL сертификатам
- **Сетевые операции:** Выполнение SSH/SCP команд на удаленных серверах
#### 🛠️ **Функциональность:**
- **Автоматическая настройка VDS:** Установка Docker, Nginx, SSL сертификатов
- **Передача Docker образов:** Экспорт локальных образов и импорт на VDS
- **Управление пользователями:** Создание системных пользователей с SSH доступом
- **Безопасность:** Настройка firewall, отключение парольной аутентификации
- **Мониторинг:** Проверка системных требований и состояния серверов
#### 🔒 **Безопасность:**
- Агент работает в Docker контейнере, порт 3000 проброшен на хост
- SSH ключи монтируются в режиме только чтения
- Docker socket доступен только для управления контейнерами
- Все операции логируются для аудита
- Доступен локально через `http://localhost:3000`
#### 📡 **API Endpoints:**
- `GET /health` - Проверка состояния агента
- `POST /vds/check-requirements` - Проверка системных требований VDS
- `POST /vds/setup` - Полная настройка VDS сервера
- `POST /vds/transfer-encryption-key` - Передача ключей шифрования
### 🚨 **Важно:**
Агент имеет расширенные права для автоматизации развертывания. Используйте только на доверенных серверах и в защищенных сетях.
### 🔍 **Проверка работы агента:**
```bash
# Проверка состояния агента
curl http://localhost:3000/health
# Просмотр логов агента
docker logs dapp-webssh-agent
# Проверка статуса контейнера
docker ps | grep webssh-agent
```
**Ожидаемый ответ от /health:**
```json
{
"status": "ok",
"timestamp": "2025-10-02T16:33:16.477Z",
"version": "1.0.0",
"vdsConfigured": false,
"vdsDomain": null
}
```
## 🔑 **Логика SSH ключей:**
### **Автоматическое создание SSH ключей агентом:**
#### **📍 На локальной машине (в агенте):**
-**id_rsa** (приватный ключ) - создается агентом автоматически
-**id_rsa.pub** (публичный ключ) - создается агентом автоматически
#### **📍 На VDS сервере:**
-**id_rsa.pub** (публичный ключ) - добавляется в `/root/.ssh/authorized_keys`
-**id_rsa.pub** (публичный ключ) - добавляется в `/home/ubuntu/.ssh/authorized_keys`
-**id_rsa.pub** (публичный ключ) - добавляется в `/home/docker/.ssh/authorized_keys`
-**id_rsa** (приватный ключ) - НЕ передается на VDS
### **Процесс аутентификации:**
```
1. Агент создает SSH ключи на хосте: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
2. Агент добавляет публичный ключ в authorized_keys на VDS
3. Агент подключается: ssh -i ~/.ssh/id_rsa root@VDS_IP
4. VDS проверяет подпись с помощью публичного ключа
5. Доступ разрешен для всех пользователей (root, ubuntu, docker)
```
## 🔧 **Важные особенности архитектуры:**
#### **На локальной машине (разработка):**
- ✅ Git репозиторий с историей изменений
- ✅ Возможность отката к предыдущим версиям
- ✅ Разработка и тестирование
- ✅ Создание архивов для продакшн
#### **На VDS сервере (продакшн):**
- ❌ Git НЕ устанавливается и НЕ нужен
- ❌ История изменений НЕ хранится
- ❌ Откат происходит через архивы с локальной машины
- ✅ Только работающая версия приложения
- ✅ Полная автономность без внешних зависимостей
### **Компоненты:**
1. **Веб-форма** - настройка VDS (7 полей)
2. **WebSSH сервис** - SSH команды к VDS
1. **Веб-форма** - настройка VDS (8 полей, без лишних настроек портов)
2. **WebSSH сервис** - SSH команды к VDS с автоматическим определением IP
3. **SSH агент** - подключение к VDS
4. **VDS сервер** - Ubuntu + Docker + nginx + SSL
4. **VDS сервер** - Ubuntu + Docker + nginx + SSL + Node.js
5. **Docker образы** - мигрированы с локальной машины
6. **Переменные окружения** - настроены для продакшн
6. **База данных** - с зашифрованными настройками в таблицах
## 🚀 **Процесс работы:**
### **1. Первоначальная настройка:**
- Заходит на `http://localhost:5173/settings/interface/webssh`
- Заполняет форму с данными VDS (9 полей)
- Нажимает "Настроить VDS"
- Заполняет форму с данными VDS (8 полей: домен, email, логины, SSH хост/порт/пользователь/пароль)
- Нажимает "Опубликовать" (настроить VDS)
### **2. Система настраивает VDS:**
- **Проверяет DNS** записи домена
- **Получает IP адрес** из DNS записей домена автоматически
- **Проверяет доступность** домена и IP
- **Предупреждает** если домен не готов
- Подключается к VDS по SSH
- Подключается к VDS по SSH (root + пароль)
- **Создает SSH ключи** агентом автоматически
- **Очищает** все содержимое на VDS
- **Устанавливает** Ubuntu
- **Создает пользователя Ubuntu** с паролем
- **Создает пользователя Docker** с паролем
- Устанавливает Docker, Docker Compose, nginx
- **Создает пользователя Ubuntu** БЕЗ пароля (только SSH ключи)
- **Создает пользователя Docker** БЕЗ пароля (только SSH ключи)
- **Устанавливает** Docker, Docker Compose, nginx
- **Настраивает безопасность** (UFW, отключение парольной аутентификации)
- Настраивает nginx для продакшн
- Получает SSL сертификат
- **Мигрирует** Docker образы с локальной машины
- **Передает ключи** (шифрования и RSA) на VDS
- **Обновляет переменные** в БД VDS
- **Экспортирует и передает** Docker образы с локальной машины
- **Передает ключ шифрования** на VDS
- **Запускает** DLE приложение в Docker
### **3. Результат:**
- **VDS полностью готова** для работы
- **Пользователи Ubuntu и Docker** созданы
- **Docker образы** мигрированы и запущены
- **Ключи переданы** с локальной машины на VDS
- **Переменные обновлены** в БД VDS
- **Пользователи Ubuntu и Docker** созданы БЕЗ паролей (только SSH ключи)
- **Базовый софт установлен** (Docker, nginx, SSL)
- **Безопасность настроена** (UFW, отключение парольной аутентификации)
- **Docker образы** экспортированы и переданы с локальной машины
- **Ключ шифрования** передан с локальной машины на VDS
- **SSH ключи** настроены для безопасного доступа
- **DLE приложение** работает автономно в Docker
- **Домен доступен** с SSL
- **Полная автономность** - никаких внешних зависимостей
## 🔧 **Детальная логика установки софта на VDS:**
### **Этап 1: Проверка и подготовка**
```bash
# 1. Получение IP адреса из DNS записей домена
VDS_IP=$(dig +short $DOMAIN | head -1)
echo "IP адрес VDS сервера: $VDS_IP"
# 2. Проверка подключения к VDS
ssh -o ConnectTimeout=10 -o BatchMode=yes $SSH_USER@$VDS_IP "echo 'Connection OK'"
```
### **Этап 2: Очистка VDS**
```bash
# 1. Подключение к VDS
ssh $SSH_USER@$VDS_IP
# 2. Остановка всех сервисов
systemctl stop nginx || true
systemctl stop docker || true
systemctl stop postgresql || true
# 3. Очистка системы
apt-get autoremove -y
apt-get autoclean
rm -rf /var/log/*.log
rm -rf /tmp/*
rm -rf /var/tmp/*
```
### **Этап 3: Установка Ubuntu и базовых пакетов**
```bash
# 1. Обновление системы
apt-get update && apt-get upgrade -y
# 2. Установка базовых пакетов
# ВАЖНО: Git НЕ устанавливается - все обновления идут с локальной машины через архивы
apt-get install -y \
curl wget nginx certbot python3-certbot-nginx \
ufw fail2ban nano htop unzip tar gzip \
openssh-server ca-certificates gnupg lsb-release \
software-properties-common apt-transport-https
# 3. Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
rm get-docker.sh
# 4. Установка Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 5. Установка Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
```
### **Этап 4: Создание пользователей**
```bash
# 1. Создание пользователя Ubuntu
useradd -m -s /bin/bash $UBUNTU_USER
echo "$UBUNTU_USER:$UBUNTU_PASSWORD" | chpasswd
usermod -aG sudo $UBUNTU_USER
# 2. Создание пользователя Docker
useradd -m -s /bin/bash $DOCKER_USER
echo "$DOCKER_USER:$DOCKER_PASSWORD" | chpasswd
usermod -aG docker $DOCKER_USER
usermod -aG sudo $DOCKER_USER
```
### **Этап 5: Настройка безопасности**
```bash
# 1. Настройка UFW Firewall
ufw --force enable
ufw allow ssh
ufw allow 80
ufw allow 443
ufw allow 8000
ufw allow 5173
# 2. Настройка Fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# 3. Настройка SSH
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
```
### **Этап 6: Настройка Nginx**
```bash
# 1. Создание конфигурации для домена
cat > /etc/nginx/sites-available/$DOMAIN << EOF
server {
listen 80;
server_name $DOMAIN;
# Основной location для фронтенда
location / {
proxy_pass http://localhost:5173;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
# API проксирование к backend
location /api/ {
proxy_pass http://localhost:8000/api/;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
# 2. Активация конфигурации
ln -sf /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
```
### **Этап 7: Получение SSL сертификата**
```bash
# 1. Получение SSL сертификата
certbot --nginx -d $DOMAIN --non-interactive --agree-tos --email $EMAIL
# 2. Настройка автообновления
echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -
```
### **Этап 8: Миграция Docker образов**
```bash
# 1. Создание директории для приложения
mkdir -p /home/$DOCKER_USER/dapp
cd /home/$DOCKER_USER/dapp
# 2. Создание бэкапа на локальной машине
docker compose down
docker compose up -d postgres
sleep 10
docker compose exec -T postgres pg_dump -U dapp_user dapp_db > postgres-backup.sql
docker compose exec -T ollama ollama list > ollama-models.txt
# 3. Создание архива приложения
tar -czf app-migration-$(date +%Y%m%d-%H%M%S).tar.gz \
. \
postgres-backup.sql \
ollama-models.txt \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
--exclude='temp' \
--exclude='sessions'
# 4. Копирование архива на VDS
scp app-migration-*.tar.gz $DOCKER_USER@$VDS_IP:/home/$DOCKER_USER/dapp/
# 5. Распаковка на VDS
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && tar -xzf app-migration-*.tar.gz"
```
### **Этап 9: Передача ключей**
```bash
# 1. Создание директории для ключей на VDS
ssh root@$VDS_IP "mkdir -p /home/$DOCKER_USER/dapp/ssl/keys"
# 2. Копирование ключа шифрования БД
scp ./ssl/keys/full_db_encryption.key root@$VDS_IP:/home/$DOCKER_USER/dapp/ssl/keys/
# 3. Настройка SSH ключей (выполняется автоматически агентом)
# Публичный ключ (id_rsa.pub) добавляется в /root/.ssh/authorized_keys
# Приватный ключ (id_rsa) остается на локальной машине
```
### **Этап 10: Восстановление базы данных с настройками**
```bash
# 1. Запуск PostgreSQL на VDS
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && docker compose up -d postgres"
sleep 10
# 2. Восстановление базы данных (включая все таблицы настроек)
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && docker compose exec -T postgres psql -U dapp_user -d dapp_db < postgres-backup.sql"
```
### **Этап 11: Запуск приложения**
```bash
# 1. Запуск всех сервисов
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && docker compose up -d"
# 2. Проверка статуса
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && docker compose ps"
# 3. Проверка логов
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && docker compose logs --tail=20"
```
### **Этап 12: Проверка работоспособности**
```bash
# 1. Проверка доступности домена
curl -I https://$DOMAIN
# 2. Проверка API
curl -I https://$DOMAIN/api/health
# 3. Проверка SSL сертификата
openssl s_client -connect $DOMAIN:443 -servername $DOMAIN
```
## 🔄 **Процесс обновлений приложения:**
### **Обновление с локальной машины:**
```bash
# 1. На локальной машине - разработка
git add .
git commit -m "Новая функция"
git tag v1.2.0
# 2. Создание архива для продакшн
tar -czf app-update-v1.2.0-$(date +%Y%m%d-%H%M%S).tar.gz \
. \
postgres-backup.sql \
ollama-models.txt \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
--exclude='temp' \
--exclude='sessions'
# 3. Деплой на VDS
scp app-update-v1.2.0-*.tar.gz $DOCKER_USER@$VDS_IP:/home/$DOCKER_USER/dapp/
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && tar -xzf app-update-v1.2.0-*.tar.gz && docker compose restart"
```
### **Откат к предыдущей версии:**
```bash
# 1. На локальной машине - переход к предыдущей версии
git checkout v1.1.0
# 2. Создание архива предыдущей версии
tar -czf app-rollback-v1.1.0-$(date +%Y%m%d-%H%M%S).tar.gz \
. \
postgres-backup.sql \
ollama-models.txt \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
--exclude='temp' \
--exclude='sessions'
# 3. Деплой предыдущей версии на VDS
scp app-rollback-v1.1.0-*.tar.gz $DOCKER_USER@$VDS_IP:/home/$DOCKER_USER/dapp/
ssh $DOCKER_USER@$VDS_IP "cd /home/$DOCKER_USER/dapp && tar -xzf app-rollback-v1.1.0-*.tar.gz && docker compose restart"
```
### **Ключевые принципы:**
- **Все обновления** идут с локальной машины через архивы
- **Все откаты** происходят с локальной машины через архивы
- **VDS** никогда не работает с Git - только с архивами
- **Полная автономность** - VDS работает без внешних зависимостей
## 📁 **Файлы проекта:**
@@ -120,9 +491,9 @@
### **Scripts:**
- `scripts/setup-vds.sh` - очистка VDS и установка Ubuntu
- `scripts/migrate-docker.sh` - миграция Docker образов на VDS
- `scripts/configure-vds.sh` - настройка переменных окружения
- `scripts/configure-vds.sh` - настройка nginx и SSL
- `scripts/transfer-keys.sh` - передача ключей на VDS
- `scripts/update-variables.sh` - обновление переменных в БД
- `scripts/restore-database.sh` - восстановление БД с настройками
- `scripts/install-ubuntu.sh` - автоматическая установка Ubuntu
## ✅ **Статус:**
@@ -139,7 +510,7 @@
- 🔄 API для управления VDS
- 🔄 Миграция Docker образов на VDS
- 🔄 Передача ключей (шифрования и RSA) на VDS
- 🔄 Обновление переменных в БД VDS
- 🔄 Восстановление БД с зашифрованными настройками
- 🔄 Автоматическая загрузка ключа шифрования в форму
## 🎯 **Следующие шаги:**
@@ -148,6 +519,6 @@
2. **Добавить API** для управления VDS
3. **Реализовать миграцию** Docker образов на VDS
4. **Создать скрипты** для передачи ключей на VDS
5. **Реализовать обновление** переменных в БД VDS
5. **Реализовать восстановление** БД с зашифрованными настройками
6. **Добавить автоматическую загрузку** ключа шифрования в форму
7. **Протестировать** на реальной VDS