# Процесс настройки VDS агентом ## 📋 Полная последовательность настройки VDS ### **🎯 Что делает агент при настройке VDS:** #### **1. Создание SSH ключей агентом на хосте (Этап 1-2)** ```bash # Агент создает SSH ключи на хосте (не в контейнере!) ssh-keygen -t rsa -b 4096 -C "email@example.com" -f ~/.ssh/id_rsa -N "" # Автоматическое исправление прав доступа к SSH конфигу chmod 600 /root/.ssh/config 2>/dev/null || true # Установка правильных прав доступа к созданным ключам chmod 600 /root/.ssh/id_rsa chmod 644 /root/.ssh/id_rsa.pub # Ключи автоматически доступны в контейнерах через монтирование: # ~/.ssh:/root/.ssh:rw (в docker-compose.yml) # Создание директории .ssh для root на VDS sudo mkdir -p /root/.ssh sudo chmod 700 /root/.ssh # Добавление публичного ключа в authorized_keys на VDS echo "ssh-rsa AAAAB3NzaC1yc2E..." | sudo tee -a /root/.ssh/authorized_keys sudo chmod 600 /root/.ssh/authorized_keys sudo chown root:root /root/.ssh/authorized_keys ``` **⚠️ Важно:** SSH ключи создаются на хосте и автоматически доступны в контейнерах через монтирование `~/.ssh:/root/.ssh:rw` в docker-compose.yml. Это позволяет SSH Key Server находить ключи для health check. #### **2. Создание пользователей БЕЗ паролей (Этап 3-4)** ```bash # Создание пользователя Ubuntu БЕЗ пароля sudo useradd -m -s /bin/bash ubuntu sudo usermod -aG sudo ubuntu # Создание пользователя Docker БЕЗ пароля sudo useradd -m -s /bin/bash docker sudo usermod -aG sudo docker sudo usermod -aG docker docker # Создание директории для приложения sudo mkdir -p /home/docker/dapp sudo chown docker:docker /home/docker/dapp ``` #### **3. Установка Docker и Docker Compose (Этап 5-6)** ```bash # Установка Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker docker # Установка Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` #### **4. Настройка firewall (Этап 7)** ```bash # Настройка UFW sudo ufw --force enable sudo ufw allow ssh sudo ufw allow 80 sudo ufw allow 443 ``` #### **5. Сохранение ключа шифрования (Этап 8)** ```bash # Создание директории для ключей sudo mkdir -p /home/docker/dapp/ssl/keys # Сохранение ключа шифрования echo 'encryption-key-content' | sudo tee /home/docker/dapp/ssl/keys/full_db_encryption.key sudo chmod 600 /home/docker/dapp/ssl/keys/full_db_encryption.key sudo chown docker:docker /home/docker/dapp/ssl/keys/full_db_encryption.key ``` #### **6. Установка Nginx и SSL сертификатов (Этап 9)** ```bash # Установка Nginx sudo apt-get install -y nginx sudo systemctl enable nginx # Установка Certbot sudo apt-get install -y certbot python3-certbot-nginx # Получение SSL сертификата sudo certbot --nginx -d example.com --email admin@example.com --agree-tos --non-interactive ``` #### **7. Создание конфигурации приложения (Этап 9.4-9.5)** ```bash # Создание docker-compose.yml cat > /home/docker/dapp/docker-compose.yml << 'EOF' version: '3.8' services: postgres: image: postgres:16-alpine container_name: dapp-postgres restart: unless-stopped environment: - POSTGRES_DB=dapp_db - POSTGRES_USER=dapp_user - POSTGRES_PASSWORD=dapp_password volumes: - postgres_data:/var/lib/postgresql/data ollama: image: dapp-ollama:latest container_name: dapp-ollama restart: unless-stopped volumes: - ollama_data:/root/.ollama ports: - "11434:11434" vector-search: image: dapp-vector-search:latest container_name: dapp-vector-search restart: unless-stopped ports: - "8080:8080" backend: image: dapp-backend:latest container_name: dapp-backend restart: unless-stopped environment: - NODE_ENV=production - PORT=8000 - FRONTEND_URL=https://${DOMAIN} depends_on: - postgres - ollama - vector-search frontend-nginx: image: dapp-frontend-nginx:latest container_name: dapp-frontend-nginx restart: unless-stopped ports: - "80:80" - "443:443" environment: - DOMAIN=${DOMAIN} - BACKEND_CONTAINER=dapp-backend volumes: - ./ssl:/etc/ssl/certs:ro depends_on: - backend volumes: postgres_data: ollama_data: EOF # Создание .env файла cat > /home/docker/dapp/.env << EOF DOMAIN=example.com BACKEND_CONTAINER=dapp-backend EOF ``` #### **8. Импорт Docker образов (Этап 10)** ```bash # Проверка наличия Docker образов if [ -f /home/docker/dapp/docker-images.tar.gz ]; then echo "Импорт Docker образов..." cd /home/docker/dapp sudo chmod +x import-images.sh ./import-images.sh else echo "Docker образы не найдены. Образы будут собираться на VDS." fi ``` #### **9. Запуск приложения (Этап 11-12)** ```bash # Запуск приложения cd /home/docker/dapp sudo docker compose up -d # Проверка статуса контейнеров sudo docker ps --format "table {{.Names}}\t{{.Status}}" ``` ## ✅ **Результат настройки:** ### **Что получается после настройки:** 1. **✅ SSH ключи** созданы агентом автоматически 2. **✅ Пользователи Ubuntu и Docker** созданы БЕЗ паролей (только SSH ключи) 3. **✅ Docker и Docker Compose** установлены 4. **✅ Firewall** настроен (SSH, HTTP, HTTPS) 5. **✅ Ключ шифрования** передан с локальной машины 6. **✅ Nginx** установлен и настроен 7. **✅ SSL сертификат** получен от Let's Encrypt 8. **✅ Docker образы** экспортированы и переданы с локальной машины 9. **✅ Docker контейнеры** запущены и работают 10. **✅ Приложение** доступно по HTTPS ### **URL приложения:** - **HTTP:** `http://example.com` - **HTTPS:** `https://example.com` ✅ (основной) ## 🚨 **Важные моменты:** ### **Предварительные требования:** 1. **Домен** должен указывать на IP VDS сервера (A запись) 2. **VDS сервер** должен быть доступен по SSH 3. **Пользователь** должен иметь права sudo на VDS 4. **Порты 80 и 443** должны быть открыты ### **Что НЕ настраивается агентом:** 1. **База данных** - создается при первом запуске контейнеров 2. **Данные приложения** - нужно будет восстановить отдельно 3. **Резервное копирование** - настраивается отдельно ## 📝 **Логи настройки:** Агент выводит подробные логи каждого этапа настройки, что позволяет отслеживать прогресс и выявлять проблемы. ## 🔧 **Исправления 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 подключений - ✅ Автоматическое исправление прав доступа - ✅ Сохранена вся существующая функциональность ### **Для применения исправлений:** ```bash # Пересборка контейнера с исправлениями docker compose build dapp-webssh-agent docker compose restart dapp-webssh-agent ```