Налаштування автоматичного розгортання сайту
Автоматичне розгортання — це процес, при якому зміни в коді автоматично потрапляють на сервер після проходження CI-перевірок. Це усуває ручні операції, знижує ризик людських помилок і прискорює доставку змін.
Варіанти автоматичного розгортання
Push-based — система CI/CD сама підключається до сервера і виконує розгортання. Pull-based — сервер сам періодично перевіряє і забирає зміни (підхід GitOps).
GitHub Actions → SSH розгортання
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: npm ci && npm run build
- name: Deploy via SSH
uses: appleboy/[email protected]
with:
host: ${{ secrets.SERVER_HOST }}
username: deploy
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
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
php artisan queue:restart
sudo systemctl reload php8.3-fpm
Deployer (PHP)
Deployer — інструмент для атомарного розгортання з можливістю відкату:
// deploy.php
namespace Deployer;
require 'recipe/laravel.php';
host('production')
->set('hostname', 'your-server.com')
->set('remote_user', 'deploy')
->set('deploy_path', '/var/www/myapp')
->set('branch', 'main');
host('staging')
->set('hostname', 'staging.example.com')
->set('remote_user', 'deploy')
->set('deploy_path', '/var/www/staging')
->set('branch', 'develop');
set('shared_files', ['.env']);
set('shared_dirs', ['storage']);
set('writable_dirs', ['bootstrap/cache', 'storage']);
set('keep_releases', 5);
after('deploy:failed', 'deploy:unlock');
task('deploy:migrate', function () {
run('cd {{release_path}} && php artisan migrate --force');
});
after('deploy:vendors', 'deploy:migrate');
# Розгортання
dep deploy production
# Відкат
dep rollback production
Webhook-розгортання
Для простих випадків — вебхук на сервері:
// deploy.php (на сервері)
<?php
$secret = getenv('DEPLOY_SECRET');
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
if (!hash_equals("sha256=" . hash_hmac('sha256', file_get_contents('php://input'), $secret), $signature)) {
http_response_code(403);
exit;
}
$output = shell_exec('cd /var/www/myapp && git pull && composer install --no-dev && php artisan migrate --force 2>&1');
echo $output;
GitHub → Repository Settings → Webhooks → Add webhook → URL вашого deploy.php.
Zero-Downtime розгортання через Symlink
# Структура директорій
/var/www/myapp/
├── current -> releases/20241115143022 # симлинк на активний релиз
├── releases/
│ ├── 20241115143022/ # поточний
│ ├── 20241115120000/ # попередній
│ └── 20241114090000/ # старий
├── shared/
│ ├── .env
│ └── storage/
#!/bin/bash
# deploy.sh
DEPLOY_DIR=/var/www/myapp
RELEASE_DIR=$DEPLOY_DIR/releases/$(date +%Y%m%d%H%M%S)
# 1. Скачати новий код
git clone --depth=1 https://github.com/user/repo.git $RELEASE_DIR
# 2. Привязати shared ресурси
ln -s $DEPLOY_DIR/shared/.env $RELEASE_DIR/.env
ln -s $DEPLOY_DIR/shared/storage $RELEASE_DIR/storage
# 3. Встановити залежності
cd $RELEASE_DIR && composer install --no-dev --optimize-autoloader
# 4. Переключити симлинк (атомарно)
ln -sfn $RELEASE_DIR $DEPLOY_DIR/current
# 5. Перезагрузити сервіси
sudo systemctl reload php8.3-fpm
# 6. Видалити старі релизи (залишити 5)
ls -t $DEPLOY_DIR/releases | tail -n +6 | xargs -I{} rm -rf $DEPLOY_DIR/releases/{}
Сповіщення про розгортання
# GitHub Actions — сповіщення в Slack
- name: Notify Slack
if: always()
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: "Deploy to production: ${{ job.status }}"
webhook_url: ${{ secrets.SLACK_WEBHOOK }}
Терміни реалізації
Базовий автодеплой через SSH/GitHub Actions: 1 день. Deployer з zero-downtime і відкатом: 2–3 дні.







