GitHub Actions: CI/CD деплой на VPS
GitHub Actions позволяет автоматически тестировать и деплоить приложение на VPS при каждом push в репозиторий. Это основа современного DevOps без платных инструментов.
Подготовка VPS
# Создать deploy пользователя
adduser deploy --disabled-password
usermod -aG www-data deploy
su - deploy
mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keysНастройка GitHub Secrets
В репозитории: Settings → Secrets and variables → Actions → New secret:
VPS_HOST— IP или домен сервераVPS_USER— deployVPS_SSH_KEY— содержимое ~/.ssh/id_rsa (приватный ключ)VPS_PORT— 22 (или нестандартный)
Workflow для PHP проекта
# .github/workflows/deploy.yml
name: Deploy to VPS
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
- name: Run tests
run: ./vendor/bin/phpunit
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
port: ${{ secrets.VPS_PORT }}
script: |
cd /var/www/html
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo systemctl reload php8.3-fpmДеплой через rsync
- name: Deploy files via rsync
uses: burnett01/rsync-deployments@7.0.1
with:
switches: -avzr --delete --exclude='.env' --exclude='storage/'
path: ./
remote_path: /var/www/html/
remote_host: ${{ secrets.VPS_HOST }}
remote_user: ${{ secrets.VPS_USER }}
remote_key: ${{ secrets.VPS_SSH_KEY }}Уведомления в Telegram о деплое
- name: Notify Telegram
if: always()
run: |
STATUS=${{ job.status }}
EMOJI=$([[ "$STATUS" == "success" ]] && echo "OK" || echo "FAIL")
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TG_TOKEN }}/sendMessage" -d "chat_id=${{ secrets.TG_CHAT }}&text=${EMOJI} Deploy ${STATUS}: $GITHUB_REF_NAME"Zero-downtime: Для PHP используйте rolling deploy: деплойте в /releases/$(date), переключайте симлинк и перезагружайте PHP-FPM. Это предотвращает показ ошибок во время деплоя.