Загрузка...

🚀 Деплой WordPress сайта на хостинг через GitHub Actions

Troubleshooting

Пошаговое руководство по настройке автоматического деплоя WordPress сайта на shared hosting Beget с использованием GitHub Actions.

📋 Что мы получим

  • ✅ Автоматический деплой при пуше в репозиторий
  • ✅ Сборка VitePress документации
  • ✅ Безопасный деплой без потери пользовательских данных
  • ✅ Автоматические бэкапы перед деплоем
  • ✅ Уведомления в Telegram

📁Подготовка

1. Структура проекта

your-wordpress-site/
├── wp/                    # WordPress core
├── wp-content/            # Контент WordPress
│   ├── mu-plugins/        # Мультисайтовые плагины
│   ├── plugins/           # Плагины
│   ├── themes/            # Темы
│   ├── uploads/           # Пользовательский контент (НЕ ДЕПЛОИМ)
│   └── cache/             # Кеш (НЕ ДЕПЛОИМ)
├── docs/                  # VitePress документация
├── vendor/                # Composer зависимости
├── wp-config-prod.php     # Конфигурация для продакшна
├── index.php              # Точка входа WordPress
└── composer.json          # Зависимости PHP

2. Настройка GitHub Secrets

В настройках репозитория GitHub → Settings → Secrets and variables → Actions добавьте:


name: Deploy to Beget

on:
  push:
    branches: [ main, master ]
  workflow_dispatch:

env:
  PHP_VERSION: '8.3'
  NODE_VERSION: '18'

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      with:
        submodules: false
        fetch-depth: 1
        clean: true
      
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: ${{ env.PHP_VERSION }}
        extensions: mbstring, xml, ctype, iconv, intl, pdo_mysql, curl, zip, gd, redis
        coverage: none
        
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: ${{ env.NODE_VERSION }}
        cache: 'npm'
        cache-dependency-path: 'docs/package-lock.json'
        
    - name: Install Composer dependencies
      run: |
        composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist
        
    - name: Install Node dependencies for docs
      run: |
        cd docs
        npm install
        
    - name: Build documentation
      run: |
        cd docs
        npm run build
        
    - name: Create deployment archive
      run: |
        # Create deployment directory
        mkdir -p deploy-package
        
        # Copy WordPress core
        cp -r wp deploy-package/
        
        # Copy only specific wp-content directories
        mkdir -p deploy-package/wp-content
        cp -r wp-content/mu-plugins deploy-package/wp-content/
        cp -r wp-content/plugins deploy-package/wp-content/
        cp -r wp-content/themes deploy-package/wp-content/
        
        # Copy Composer dependencies
        cp -r vendor deploy-package/
        
        # Copy built documentation
        if [ -d "docs/public" ]; then
          mkdir -p deploy-package/docs/public
          cp -r docs/public/* deploy-package/docs/public/
        fi
        
        # Copy configuration files
        cp index.php deploy-package/
        cp composer.json deploy-package/
        cp composer.lock deploy-package/
        
        # Set proper permissions
        find deploy-package -type d -exec chmod 755 {} \;
        find deploy-package -type f -exec chmod 644 {} \;
        
        # Create archive
        tar -czf deploy-package.tar.gz -C deploy-package .
        
        # Show archive contents for debugging
        echo "📦 Archive contents:"
        tar -tzf deploy-package.tar.gz | head -20
        
    - name: Create backup before deployment
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.BEGET_HOST }}
        username: ${{ secrets.BEGET_USERNAME }}
        password: ${{ secrets.BEGET_PASSWORD }}
        port: ${{ secrets.BEGET_PORT || '22' }}
        script: |
          # Create backup before deployment
          echo "🔄 Creating backup before deployment..."
          cd /home/b/your-username/your-domain.com/public_html
          
          # Create backups directory if it doesn't exist
          mkdir -p ../backups
          
          # Create backup with commit info
          COMMIT_SHA="${{ github.sha }}"
          BACKUP_NAME="auto-backup-$(date +%Y%m%d-%H%M%S)-${COMMIT_SHA:0:7}"
          tar -czf ../backups/${BACKUP_NAME}.tar.gz \
            --exclude='temp-deploy' \
            --exclude='*.tar.gz' \
            --exclude='.cache' \
            .
          
          # Create database backup
          echo "Creating database backup..."
          mysqldump -u ${{ secrets.MYSQL_USER }} -p${{ secrets.MYSQL_PASSWORD }} ${{ secrets.MYSQL_DATABASE }} > ../backups/${BACKUP_NAME}-database.sql 2>/dev/null || echo "Database backup skipped"
          
          # Log backup info
          echo "$(date): $BACKUP_NAME - ${{ github.event.head_commit.message }}" >> ../backups/backup-log.txt
          
          # Clean old backups (keep last 10)
          cd ../backups
          ls -t *.tar.gz | tail -n +11 | xargs -r rm -f
          ls -t *-database.sql | tail -n +11 | xargs -r rm -f
          
          echo "✅ Backup created: ${BACKUP_NAME}"

    - name: Deploy to Beget via SSH
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.BEGET_HOST }}
        username: ${{ secrets.BEGET_USERNAME }}
        password: ${{ secrets.BEGET_PASSWORD }}
        port: ${{ secrets.BEGET_PORT || '22' }}
        script: |
          echo "🚀 Starting deployment..."
          
          # Create temporary directory
          mkdir -p temp-deploy
          cd temp-deploy
          
    - name: Upload deployment archive
      uses: appleboy/scp-action@v0.1.7
      with:
        host: ${{ secrets.BEGET_HOST }}
        username: ${{ secrets.BEGET_USERNAME }}
        password: ${{ secrets.BEGET_PASSWORD }}
        port: ${{ secrets.BEGET_PORT || '22' }}
        source: "deploy-package.tar.gz"
        target: "temp-deploy/"
        
    - name: Extract and deploy files
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.BEGET_HOST }}
        username: ${{ secrets.BEGET_USERNAME }}
        password: ${{ secrets.BEGET_PASSWORD }}
        port: ${{ secrets.BEGET_PORT || '22' }}
        script: |
          cd temp-deploy
          
          # Extract package
          tar -xzf deploy-package.tar.gz
          
          # Deploy files to public_html directory
          echo "Deploying files..."
          rsync -av --exclude='temp-deploy/' . /home/b/your-username/your-domain.com/public_html/
          
          # Cleanup
          cd ..
          rm -rf temp-deploy/
          
    - name: Verify deployment
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.BEGET_HOST }}
        username: ${{ secrets.BEGET_USERNAME }}
        password: ${{ secrets.BEGET_PASSWORD }}
        port: ${{ secrets.BEGET_PORT || '22' }}
        script: |
          # Check if files were deployed
          cd /home/b/your-username/your-domain.com/public_html
          
          if [ ! -f "index.php" ]; then
            echo "❌ WordPress files not found"
            exit 1
          fi
          
          if [ ! -d "docs" ]; then
            echo "❌ Documentation directory not found"
            exit 1
          fi
          
          echo "✅ Files deployed successfully"
          echo "📁 WordPress files: $(ls -la index.php 2>/dev/null | wc -l) files"
          echo "📚 Documentation: $(ls -la docs/ 2>/dev/null | wc -l) items"

  notify:
    needs: [build-and-deploy]
    runs-on: ubuntu-latest
    if: always()
    
    steps:
    - name: Notify Telegram
      uses: appleboy/telegram-action@v0.1.0
      with:
        to: ${{ secrets.TELEGRAM_CHAT_ID }}
        token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
        message: |
          🚀 WordPress Deployment Status
          
          ✅ Deploy: ${{ needs.build-and-deploy.result == 'success' && 'SUCCESS' || 'FAILED' }}
          
           Commit: ${{ github.sha }}
           Author: ${{ github.actor }}
           Branch: ${{ github.ref_name }}
          
           Site: https://your-domain.com/
           Docs: https://your-domain.com/docs/

3. Создайте wp-config-prod.php

<?php
// Конфигурация для продакшна
define('DB_NAME', 'your_database');
define('DB_USER', 'your_user');
define('DB_PASSWORD', 'your_password');
define('DB_HOST', 'localhost');

// Остальные настройки...

🚀Использование

Автоматический деплой

git add .
git commit -m "Обновление сайта"
git push origin main

Ручной деплой

  1. Перейдите в GitHub → Actions
  2. Выберите workflow «Deploy to Beget»
  3. Нажмите «Run workflow»

Результат

deploy

Telegram_6xg0ehh6XN

⚠️ Важные моменты

Что НЕ деплоится (сохраняется на сервере):

  • wp-content/uploads/ — пользовательские файлы
  • wp-content/cache/ — кеш
  • wp-content/backup*/ — бэкапы
  • .htaccess — настройки сервера
  • wp-config.php — конфигурация WordPress

Что деплоится:

  • wp/ — WordPress core
  • wp-content/mu-plugins/ — мультисайтовые плагины
  • wp-content/plugins/ — плагины
  • wp-content/themes/ — темы
  • docs/public/ — собранная документация
  • vendor/ — Composer зависимости

🔍 Мониторинг

Проверка статуса деплоя

# Локально
curl -I https://your-domain.com/

# Проверка документации
curl -I https://your-domain.com/docs/

Логи GitHub Actions

  • Перейдите в GitHub → Actions
  • Выберите последний workflow
  • Просмотрите логи каждого шага

🆘 Troubleshooting

Troubleshooting

Проблема: Сайт не работает после деплоя

  1. Проверьте логи в GitHub Actions
  2. Восстановите из бэкапа на сервере
  3. Проверьте права доступа к файлам

Проблема: Документация не отображается

  1. Убедитесь, что VitePress собран корректно
  2. Проверьте настройки .htaccess для папки docs/

Проблема: Ошибки с базой данных

  1. Проверьте настройки в wp-config.php
  2. Убедитесь, что база данных доступна

🎉 Готово!

Теперь у вас есть полностью автоматизированный деплой WordPress сайта на Beget через GitHub Actions. При каждом пуше в репозиторий сайт будет автоматически обновляться, сохраняя при этом пользовательские данные и настройки.

Преимущества:

  • ✅ Безопасность — не теряются пользовательские данные
  • ✅ Скорость — деплой занимает 2-3 минуты
  • ✅ Надежность — автоматические бэкапы
  • ✅ Удобство — один git push для обновления сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *