Ссылка скопирована

Настройка автодеплоя GitHub через SSH

DonVardix DonVardix

Введение

Ручное обновление проектов на сервере через SSH (ssh user@ip, переход в папку, ввод паролей и выполнение git pull) замедляет разработку и приводит к ошибкам с правами файлов, если команды случайно выполнены под root.

Что будет сделано:

  • Настроен безопасный изолированный доступ под непривилегированным пользователем deploy;
  • Сгенерирован сервисный SSH-ключ на сервере и привязан к GitHub для доступа к коду;
  • Сконфигурирован GitHub Actions workflow (appleboy/ssh-action) с передачей секретов;
  • Настроен атомарный процесс обновления рабочей директории через git fetch и git reset.

Результат: надежный непрерывный автодеплой без сторонних тяжелых панелей — любой git push в ветку main мгновенно обновляет проект на продакшене.

(Для контейнеризированных проектов с реверс-прокси Caddy используйте специализированное руководство Автодеплой Docker-проектов на VPS через GitHub Actions и SSH).


1. Подготовка пользователя deploy

Все команды деплоя и владение файлами проектов должны быть изолированы под пользователем deploy.

Важно

Следующие команды должны выполняться строго от имени пользователя deploy, а не root или admin.

Переключитесь на пользователя deploy из-под учетной записи с sudo:

sudo -u deploy -i

Или подключитесь отдельной SSH-сессией:

ssh deploy@203.0.113.10

2. Выпуск SSH-ключа на сервере

Для скачивания кода репозитория серверу нужен собственный SSH-ключ. Сгенерируйте пару Ed25519 без парольной фразы:

ssh-keygen -t ed25519 -f ~/.ssh/github_deploy -C "github_deploy"

Выставите строгие права доступа на созданные файлы:

chmod 600 ~/.ssh/github_deploy
chmod 644 ~/.ssh/github_deploy.pub

3. Добавление публичного ключа в GitHub

Выведите публичный ключ в консоль и скопируйте его:

cat ~/.ssh/github_deploy.pub
  1. Откройте GitHub: Settings → SSH and GPG keys → New SSH key.
  2. В поле Title укажите VPS Deploy Key.
  3. Вставьте скопированный ключ и нажмите Add SSH key.

4. Настройка SSH config на сервере

Чтобы SSH-клиент на сервере автоматически использовал нужный ключ при обращении к GitHub, создайте файл ~/.ssh/config:

nano ~/.ssh/config

Добавьте конфигурацию:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_deploy
    IdentitiesOnly yes

Защитите файл правами:

chmod 600 ~/.ssh/config

Проверьте авторизацию:

ssh -T git@github.com

При первом подключении введите yes. Ответ должен содержать: Hi username! You've successfully authenticated....


5. Первичное клонирование репозитория

Перед запуском автоматического пайплайна репозиторий должен быть первично инициализирован на сервере.

Перейдите в директорию сайта (она должна быть пустой):

cd /var/www/example.com

Выполните клонирование через SSH в текущую папку (точка в конце обязательна):

git clone git@github.com:username/repository.git .

Проверьте статус:

git status

6. Настройка секретов в GitHub Actions

В репозитории проекта на GitHub перейдите в раздел Settings → Secrets and variables → Actions → New repository secret.

Добавьте параметры подключения к серверу:

  • HOST — публичный IP-адрес или домен сервера (203.0.113.10);
  • USERNAME — имя пользователя на сервере (deploy);
  • KEY — содержимое приватного ключа доступа к серверу (личный ключ администратора для входа под deploy);
  • PORT — SSH-порт сервера (по умолчанию 22).

7. Создание workflow деплоя

Создайте файл описания процесса .github/workflows/deploy.yml в вашем проекте:

name: Deploy (main)

on:
  push:
    branches:
      - main

concurrency:
  group: deploy-main
  cancel-in-progress: true

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          port: ${{ secrets.PORT }}
          script: |
            set -e

            cd /var/www/example.com

            git fetch origin main
            git reset --hard origin/main

            composer install --no-dev --optimize-autoloader
            npm run build

Директива git reset --hard origin/main гарантирует, что локальная рабочая копия на сервере в точности соответствует ветке main, предотвращая конфликты при слиянии.


Вывод

Пайплайн автодеплоя настроен. Теперь каждый коммит, отправленный в ветку main, автоматически активирует runner на GitHub и обновляет проект на сервере.

1. Чек-лист проверки деплоя

  1. Сделайте тестовое изменение в репозитории на локальном компьютере.
  2. Отправьте коммит: git push origin main.
  3. Откройте вкладку Actions в GitHub и дождитесь зеленого чекбокса выполнения workflow.
  4. Проверьте результат на сервере: git log -n 1 в директории /var/www/example.com.

2. Добавление серверных команд

В блоке script пайплайна можно последовательно наращивать цепочку команд:

  • Очистка кеша фреймворка: php artisan optimize:clear && php artisan config:cache
  • Запуск миграций БД: php artisan migrate --force
  • Перезапуск очередей или демонов: sudo systemctl restart supervisor

3. Шпаргалка команд

  • Проверка SSH-подключения сервера к GitHub: ssh -T git@github.com
  • Проверка текущего владельца папки: ls -la /var/www/example.com
  • Просмотр истории коммитов на сервере: git log --oneline -n 5