Введение
Ручное обновление проектов на сервере через 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 из-под учетной записи с 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
- Откройте GitHub: Settings → SSH and GPG keys → New SSH key.
- В поле Title укажите
VPS Deploy Key. - Вставьте скопированный ключ и нажмите 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. Чек-лист проверки деплоя
- Сделайте тестовое изменение в репозитории на локальном компьютере.
- Отправьте коммит:
git push origin main. - Откройте вкладку Actions в GitHub и дождитесь зеленого чекбокса выполнения workflow.
- Проверьте результат на сервере:
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