Files
DLE/docs/vds.md

524 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

# Задача: Простая настройка VDS с автоматической установкой Ubuntu
## 🎯 **Описание задачи:**
### **Цель:**
Создать простую форму для автоматической настройки VDS сервера с установкой Ubuntu и деплоем DLE приложения.
### **Проблема:**
Нужно вручную настраивать VDS сервер, устанавливать Ubuntu и необходимые компоненты для работы DLE приложения.
### **Решение:**
Автоматическая очистка VDS, установка Ubuntu, создание пользователя и деплой DLE приложения через локальную форму.
## 📋 **Требования:**
### **1. Входные данные (8 полей):**
- **Домен** - например `example.com` (IP адрес определяется автоматически из DNS)
- **Email** - для SSL сертификата
- **Логин Ubuntu** - пользователь для VDS (по умолчанию `ubuntu`, создается БЕЗ пароля)
- **Логин Docker** - пользователь для Docker (по умолчанию `docker`, создается БЕЗ пароля)
- **SSH хост** - SSH хост сервера (может отличаться от домена)
- **SSH порт** - SSH порт сервера (обычно 22)
- **SSH пользователь** - пользователь для SSH подключения (обычно `root`)
- **SSH пароль** - пароль для SSH подключения к VDS
### **1.1. Требования к домену:**
- **A запись** `example.com` → IP VDS сервера
- **CNAME запись** `www.example.com``example.com` (опционально)
- **Домен должен быть активен** и доступен
- **DNS записи должны распространиться** (проверка перед настройкой)
### **2. Что должно происходить:**
1. **Проверка DNS** - валидация A записи домена
2. **Подключение** к VDS по SSH (root + пароль)
3. **Создание SSH ключей на хосте** агентом автоматически (доступны в контейнерах через монтирование)
4. **Очистка** всего содержимого на VDS
5. **Создание пользователя Ubuntu** БЕЗ пароля (только SSH ключи)
6. **Создание пользователя Docker** БЕЗ пароля (только SSH ключи)
7. **Установка** Docker, Docker Compose, nginx
8. **Настройка безопасности** (UFW, отключение парольной аутентификации)
9. **Настройка** nginx для продакшн приложения
10. **Получение** SSL сертификата
11. **Экспорт и передача** Docker образов с локальной машины
12. **Передача ключа шифрования** на VDS
13. **Запуск** DLE приложения в Docker
### **3. Результат:**
- **VDS полностью очищена** и настроена
- **Пользователи Ubuntu и Docker** созданы БЕЗ паролей (только SSH ключи)
- **Базовый софт установлен** (Docker, nginx, SSL)
- **Безопасность настроена** (UFW, отключение парольной аутентификации)
- **Docker образы** экспортированы и переданы с локальной машины
- **Ключ шифрования** передан с локальной машины на VDS
- **SSH ключи** настроены для безопасного доступа
- **DLE приложение** работает в Docker на VDS
- **Домен работает** с SSL
- **Приложение работает** автономно на VDS
## 🏗️ **Архитектура:**
```
Продакшн режим:
Интернет → VDS nginx (домен) → VDS 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 (8 полей, без лишних настроек портов)
2. **WebSSH сервис** - SSH команды к VDS с автоматическим определением IP
3. **SSH агент** - подключение к VDS
4. **VDS сервер** - Ubuntu + Docker + nginx + SSL + Node.js
5. **Docker образы** - мигрированы с локальной машины
6. **База данных** - с зашифрованными настройками в таблицах
## 🚀 **Процесс работы:**
### **1. Первоначальная настройка:**
- Заходит на `http://localhost:5173/settings/interface/webssh`
- Заполняет форму с данными VDS (8 полей: домен, email, логины, SSH хост/порт/пользователь/пароль)
- Нажимает "Опубликовать" (настроить VDS)
### **2. Система настраивает VDS:**
- **Получает IP адрес** из DNS записей домена автоматически
- **Проверяет доступность** домена и IP
- **Предупреждает** если домен не готов
- Подключается к VDS по SSH (root + пароль)
- **Создает SSH ключи** агентом автоматически
- **Очищает** все содержимое на VDS
- **Создает пользователя Ubuntu** БЕЗ пароля (только SSH ключи)
- **Создает пользователя Docker** БЕЗ пароля (только SSH ключи)
- **Устанавливает** Docker, Docker Compose, nginx
- **Настраивает безопасность** (UFW, отключение парольной аутентификации)
- Настраивает nginx для продакшн
- Получает SSL сертификат
- **Экспортирует и передает** Docker образы с локальной машины
- **Передает ключ шифрования** на VDS
- **Запускает** DLE приложение в Docker
### **3. Результат:**
- **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 работает без внешних зависимостей
## 📁 **Файлы проекта:**
### **Frontend:**
- `frontend/src/components/WebSshForm.vue` - форма управления
- `frontend/src/services/webSshService.js` - SSH команды к VDS
### **Backend:**
- `backend/routes/vds-management.js` - API для управления VDS
- `backend/services/sshManager.js` - SSH команды
- `backend/services/encryptionManager.js` - управление шифрованием
### **Scripts:**
- `scripts/setup-vds.sh` - очистка VDS и установка Ubuntu
- `scripts/migrate-docker.sh` - миграция Docker образов на VDS
- `scripts/configure-vds.sh` - настройка nginx и SSL
- `scripts/transfer-keys.sh` - передача ключей на VDS
- `scripts/restore-database.sh` - восстановление БД с настройками
- `scripts/install-ubuntu.sh` - автоматическая установка Ubuntu
## ✅ **Статус:**
### **Готово:**
- ✅ Форма WebSSH упрощена
- ✅ WebSSH сервис обновлен
- ✅ DNS проверка добавлена
- ✅ Инструкции по настройке DNS созданы
- ✅ Поле VDS IP добавлено в форму
### **Нужно доработать:**
- 🔄 SSH агент для очистки и установки Ubuntu
- 🔄 API для управления VDS
- 🔄 Миграция Docker образов на VDS
- 🔄 Передача ключей (шифрования и RSA) на VDS
- 🔄 Восстановление БД с зашифрованными настройками
- 🔄 Автоматическая загрузка ключа шифрования в форму
## 🎯 **Следующие шаги:**
1. **Создать SSH агент** для очистки и установки Ubuntu
2. **Добавить API** для управления VDS
3. **Реализовать миграцию** Docker образов на VDS
4. **Создать скрипты** для передачи ключей на VDS
5. **Реализовать восстановление** БД с зашифрованными настройками
6. **Добавить автоматическую загрузку** ключа шифрования в форму
7. **Протестировать** на реальной VDS