Пошаговое руководство по настройке автоматического деплоя 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
Ручной деплой
- Перейдите в GitHub → Actions
- Выберите workflow «Deploy to Beget»
- Нажмите «Run workflow»
Результат


⚠️ Важные моменты
Что НЕ деплоится (сохраняется на сервере):
wp-content/uploads/— пользовательские файлыwp-content/cache/— кешwp-content/backup*/— бэкапы.htaccess— настройки сервераwp-config.php— конфигурация WordPress
Что деплоится:
wp/— WordPress corewp-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

Проблема: Сайт не работает после деплоя
- Проверьте логи в GitHub Actions
- Восстановите из бэкапа на сервере
- Проверьте права доступа к файлам
Проблема: Документация не отображается
- Убедитесь, что VitePress собран корректно
- Проверьте настройки
.htaccessдля папкиdocs/
Проблема: Ошибки с базой данных
- Проверьте настройки в
wp-config.php - Убедитесь, что база данных доступна
🎉 Готово!
Теперь у вас есть полностью автоматизированный деплой WordPress сайта на Beget через GitHub Actions. При каждом пуше в репозиторий сайт будет автоматически обновляться, сохраняя при этом пользовательские данные и настройки.
Преимущества:
- ✅ Безопасность — не теряются пользовательские данные
- ✅ Скорость — деплой занимает 2-3 минуты
- ✅ Надежность — автоматические бэкапы
- ✅ Удобство — один
git pushдля обновления сайта