Прозрачное развертывание с GitHub Actions (ru)
2025-06-24
Недавно я нашёл простой способ выполнять любые операции на своих серверах через GitHub Actions. Мне нравится прозрачность этого подхода — я могу контролировать все шаги и процессы. Сейчас я покажу, как настроить чистое развертывание, но вы можете адаптировать это под свои задачи.
Как мы разворачиваем вручную? В простейшем случае подключаемся к серверу, вытягиваем репозиторий и перезапускаем приложение.
Автоматизируем этот процесс. Начнём с подключения. Обычно это выглядит так:
ssh root@192.168.0.1 -i ~/.ssh/id_rsa25519Нам нужны три компонента для доступа:
- IP-адрес сервера
- Имя пользователя
- Приватный SSH-ключ Для “чистого” развертывания автоматизируем все шаги. Чтобы GitHub Actions мог подключиться к серверу, передадим данные через секреты.
В репозитории GitHub зайдите в Settings → Security → Secrets and Variables → Actions. Добавьте три секрета: SSH_USER, SSH_HOST, SSH_KEY. Не забудьте добавить публичный ключ в ~/.ssh/authorized_keys на сервере. Первый шаг завершён.
Далее — вытягивание репозитория. Если сервер чистый, его нужно клонировать. Для приватных репозиториев вы можете столкнуться с ошибкой:
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.Сгенерируйте SSH-ключи на сервере:
ssh-keygen -C github -t ed25519Добавьте публичный ключ в Deploy keys в настройках репозитория GitHub. Создайте секрет SSH_PROJECT_PATH для пути к проекту.
Финальный шаг — GitHub Actions. Создайте файл .gitub/workflows/deploy.yaml (имя не важно):
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Pull repo
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ${{ secrets.SSH_PROJECT_PATH }}
git pull origin main --rebase
- name: Compose down
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ${{ secrets.SSH_PROJECT_PATH }}
docker compose down
- name: Compose up
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd ${{ secrets.SSH_PROJECT_PATH }}
docker compose up -dВ этом примере я использую Docker для перезапуска сервисов. Выберите свой подход!```