name: Deploy via SSH (rsync) on: push: branches: [main, master] workflow_dispatch: jobs: deploy: runs-on: self-hosted steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup SSH for rsync run: | echo "🔧 Настраиваем SSH для rsync..." # Проверяем наличие SSH ключа if [ ! -f "/var/lib/act_runner/.ssh/id_ed25519" ]; then echo "❌ SSH ключ не найден!" echo "Создаем новый SSH ключ..." sudo -u act_runner ssh-keygen -t ed25519 -f /var/lib/act_runner/.ssh/id_ed25519 -N "" sudo -u act_runner cat /var/lib/act_runner/.ssh/id_ed25519.pub | sudo -u deployer tee -a /home/deployer/.ssh/authorized_keys fi # Устанавливаем правильные права chmod 600 /var/lib/act_runner/.ssh/id_ed25519 2>/dev/null || true # Настраиваем known_hosts ssh-keyscan -H localhost >> /var/lib/act_runner/.ssh/known_hosts 2>/dev/null || true ssh-keyscan -H 127.0.0.1 >> /var/lib/act_runner/.ssh/known_hosts 2>/dev/null || true # Проверяем rsync which rsync >/dev/null 2>&1 || { echo "Устанавливаем rsync..." apt-get update && apt-get install -y rsync } # Тестируем соединение ssh -o BatchMode=yes -o ConnectTimeout=5 -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost "echo '✅ SSH соединение установлено'" || { echo "⚠️ SSH соединение требует настройки" exit 1 } - name: Backup current site run: | echo "💾 Создаем бэкап текущего сайта..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " BACKUP_DIR=\"/var/backups/arseny.ahtamov.ru/\$(date +%Y%m%d-%H%M%S)\" echo \"Создаем бэкап в: \${BACKUP_DIR}\" mkdir -p \"\${BACKUP_DIR}\" if [ -d \"/var/www/arseny.ahtamov.ru/html\" ]; then # Используем rsync для бэкапа (сохраняем все атрибуты) rsync -a /var/www/arseny.ahtamov.ru/html/ \"\${BACKUP_DIR}/\" # Создаем файл информации о бэкапе echo \"Backup created: \$(date)\" > \"\${BACKUP_DIR}/BACKUP_INFO.txt\" echo \"Source: /var/www/arseny.ahtamov.ru/html\" >> \"\${BACKUP_DIR}/BACKUP_INFO.txt\" echo \"Files: \$(find \"\${BACKUP_DIR}\" -type f | wc -l)\" >> \"\${BACKUP_DIR}/BACKUP_INFO.txt\" echo \"✅ Бэкап создан: \${BACKUP_DIR}\" du -sh \"\${BACKUP_DIR}\" else echo \"⚠️ Целевая директория не существует, пропускаем бэкап\" fi " - name: Clean old backups run: | echo "🧹 Очищаем старые бэкапы (старше 7 дней)..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " # Удаляем бэкапы старше 7 дней find /var/backups/arseny.ahtamov.ru/ -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \; 2>/dev/null || true # Показываем оставшиеся бэкапы echo \"Оставшиеся бэкапы:\" ls -la /var/backups/arseny.ahtamov.ru/ 2>/dev/null | head -20 || echo \"Директория бэкапов пуста\" " - name: Deploy with rsync run: | echo "🚀 Начинаем деплой с помощью rsync..." # Проверяем, есть ли файлы для деплоя if [ ! -d "./html" ] || [ -z "\$(ls -A ./html 2>/dev/null)" ]; then echo "⚠️ Директория html пуста или не существует" exit 1 fi # Используем rsync для деплоя rsync -avz --delete \ -e "ssh -i /var/lib/act_runner/.ssh/id_ed25519 -o StrictHostKeyChecking=no" \ --exclude=".*" \ --exclude="*.tmp" \ --exclude="*.bak" \ --exclude="*.backup" \ ./html/ \ deployer@localhost:/var/www/arseny.ahtamov.ru/html/ echo "✅ Rsync выполнен успешно" # Проверяем результат ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " echo \"Проверка загруженных файлов:\" ls -la /var/www/arseny.ahtamov.ru/html/ | head -10 echo \"Всего файлов: \$(find /var/www/arseny.ahtamov.ru/html/ -type f | wc -l)\" " - name: Set correct permissions run: | echo "🔧 Устанавливаем права на файлы..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " # Устанавливаем владельца chown -R deployer:www-data /var/www/arseny.ahtamov.ru/html/ 2>/dev/null || echo \"Не удалось изменить владельца, продолжаем...\" # Права на директории find /var/www/arseny.ahtamov.ru/html/ -type d -exec chmod 755 {} \; 2>/dev/null || true # Права на файлы find /var/www/arseny.ahtamov.ru/html/ -type f -exec chmod 644 {} \; 2>/dev/null || true # Исполняемые права для скриптов find /var/www/arseny.ahtamov.ru/html/ -name \"*.php\" -exec chmod 755 {} \; 2>/dev/null || true find /var/www/arseny.ahtamov.ru/html/ -name \"*.cgi\" -exec chmod 755 {} \; 2>/dev/null || true find /var/www/arseny.ahtamov.ru/html/ -name \"*.sh\" -exec chmod 755 {} \; 2>/dev/null || true find /var/www/arseny.ahtamov.ru/html/ -name \"*.pl\" -exec chmod 755 {} \; 2>/dev/null || true echo \"✅ Права установлены\" " - name: Check nginx configuration run: | echo "🔍 Проверяем конфигурацию nginx..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " echo \"Проверка конфигурации nginx...\" if sudo nginx -t 2>/dev/null; then echo \"✅ Конфигурация nginx в порядке\" else echo \"⚠️ Ошибка в конфигурации nginx\" # Показываем ошибку sudo nginx -t 2>&1 | head -20 fi " - name: Restart nginx run: | echo "🔄 Перезагружаем nginx..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " echo \"Перезагрузка nginx...\" if sudo systemctl reload nginx 2>/dev/null; then echo \"✅ Nginx успешно перезагружен\" else echo \"⚠️ Не удалось перезагрузить nginx через systemctl, пробуем signal...\" sudo nginx -s reload 2>/dev/null && echo \"✅ Nginx перезагружен через signal\" || echo \"❌ Не удалось перезагрузить nginx\" fi # Проверяем статус echo \"Статус nginx:\" sudo systemctl status nginx --no-pager 2>/dev/null | head -10 || true " - name: Verify deployment run: | echo "📊 Проверка завершенного деплоя..." ssh -i /var/lib/act_runner/.ssh/id_ed25519 deployer@localhost " echo \"=== ИТОГИ ДЕПЛОЯ ===\" echo \"1. Директория: /var/www/arseny.ahtamov.ru/html/\" echo \"2. Общий размер:\" du -sh /var/www/arseny.ahtamov.ru/html/ echo \"3. Количество файлов:\" find /var/www/arseny.ahtamov.ru/html/ -type f | wc -l echo \"4. Количество директорий:\" find /var/www/arseny.ahtamov.ru/html/ -type d | wc -l echo \"5. Проверка основных файлов:\" # Проверяем наличие основных файлов for file in index.html index.php; do if [ -f \"/var/www/arseny.ahtamov.ru/html/\${file}\" ]; then echo \" ✅ \${file} - найден\" else echo \" ⚠️ \${file} - отсутствует\" fi done echo \"6. Последние 10 измененных файлов:\" find /var/www/arseny.ahtamov.ru/html/ -type f -printf '%T+ %p\n' 2>/dev/null | sort -r | head -10 | cut -d' ' -f2- echo \"✅ Деплой успешно завершен!\" " - name: Test website accessibility run: | echo "🌐 Тестируем доступность сайта..." # Даем время nginx перезагрузиться sleep 2 # Проверяем доступность локально if curl -f -s -o /dev/null -w "%{http_code}" http://localhost/ 2>/dev/null | grep -q "200\|301\|302"; then echo "✅ Сайт доступен локально" else echo "⚠️ Сайт может быть недоступен локально" fi echo "🎉 Весь процесс деплоя завершен!"