Другое

Как организовать деплой без Kubernetes через GitHub Actions

Полное руководство по деплою приложений без Kubernetes с использованием GitHub Actions. Узнайте про SSH-подключение, Docker Hub и docker-compose для автоматизации развертывания.

Как организовать деплой без Kubernetes с использованием GitHub CI/CD?
Подскажите стандартный процесс развертывания приложений без Kubernetes через GitHub Actions.
Правильно ли я понимаю, что для этого нужно подключаться по SSH к удаленному серверу и скачивать обновленные Docker‑образы из Docker Hub?
Также интересует, можно ли в таком подходе использовать docker‑compose для управления контейнерами?

Deploy без Kubernetes с использованием GitHub Actions обычно выполняется через SSH‑подключение к удаленному серверу, где запускаются Docker‑контейнеры. Стандартный процесс включает сборку образа, публикацию в Docker Hub и развертывание на сервере с помощью SSH‑команд. Да, docker‑compose отлично подходит для управления контейнерами в таком подходе, позволяя оркестрировать несколько сервисов.


Содержание


Основной процесс деплоя через GitHub Actions

Стандартный процесс деплоя приложений без Kubernetes через GitHub Actions включает несколько ключевых этапов. Сначала приложение собирается в Docker‑образ, который затем публикуется в Docker Hub или другом реестре образов. После этого через SSH‑подключение к удаленному серверу выполняются команды для обновления контейнеров и запуска нового приложения.

Основные шаги процесса:

  1. Сборка Docker‑образа – создание контейнера с вашим приложением
  2. Публикация образа – отправка образа в Docker Hub или частный реестр
  3. SSH‑подключение к серверу – установление безопасного соединения
  4. Обновление контейнеров – скачивание новых образов и запуск приложений
  5. Проверка работоспособности – тесты для подтверждения успешного деплоя

Такой подход позволяет автоматизировать развертывание приложений на традиционных серверах без необходимости в сложных оркестровочных системах вроде Kubernetes.


Настройка SSH‑ключей для безопасного доступа

Для безопасного деплоя через SSH необходимо правильно настроить аутентификацию. GitHub Actions позволяет использовать SSH‑ключи для безопасного подключения к удаленным серверам без ввода паролей.

Шаги настройки SSH‑ключей:

  1. Генерация SSH‑ключа – создайте пару ключей на вашем сервере
  2. Добавление публичного ключа – поместите публичный ключ в authorized_keys пользователя на сервере
  3. Хранение приватного ключа – сохраните приватный ключ в Secrets GitHub репозитория
  4. Настройка прав доступа – убедитесь, что deploy‑пользователь имеет необходимые права
yaml
# Пример добавления SSH‑ключа в workflow
- name: Add SSH key
  uses: webfactory/ssh-agent@v0.6.0
  with:
    ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

Важно: Никогда не храните SSH‑ключи в коде репозитория. Используйте GitHub Secrets для безопасного хранения секретных данных.


Использование Docker Hub для хранения образов

Docker Hub является наиболее популярным реестром контейнерных образов и идеально подходит для хранения Docker‑образов в CI/CD процессах.

Преимущества использования Docker Hub:

  • Бесплатный аккаунт для публичных репозиториев
  • Автоматическая сборка образов при каждом push в репозиторий
  • Версионирование образов с помощью тегов
  • Интеграция с GitHub Actions для публикации

Пример публикации образа в Docker Hub:

yaml
- name: Build and push Docker image
  run: |
    docker build -t ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} .
    docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
    docker push ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}

Для приватных репозиториев рекомендуется использовать Docker Pro или организовать собственный реестр образов.


Интеграция docker‑compose в процесс деплоя

Да, docker‑compose идеально подходит для управления контейнерами в данном подходе. Он позволяет оркестрировать несколько контейнеров, управлять их зависимостями и конфигурацией.

Преимущества docker‑compose в CI/CD:

  • Управление несколькими сервисами в одном файле
  • Определение зависимостей между контейнерами
  • Установка переменных окружения
  • Управление сетями и томами данных

Пример workflow с docker‑compose:

yaml
- name: SSH to server and deploy
  run: |
    ssh -i ${{ secrets.SSH_PRIVATE_KEY }} user@server.com "
      docker pull ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}
      docker-compose down
      docker-compose up -d
    "

Рекомендуемая структура проекта:

project/
├── .github/
│   └── workflows/
│       └── deploy.yml
├── docker-compose.yml
├── Dockerfile
└── src/

Бест‑практики CI/CD без Kubernetes

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

Ключевые бест‑практики:

  1. Использование семантического версионирования – присваивайте образам осмысленные теги
  2. Rollback‑механизмы – всегда имейте возможность отката к предыдущей версии
  3. Health checks – реализуйте проверки состояния приложения после деплоя
  4. Безопасность – регулярно обновляйте образы и зависимые пакеты
  5. Мониторинг – настраивайте логирование и мониторинг развернутых приложений

Пример проверки состояния приложения:

yaml
- name: Health check
  run: |
    sleep 30
    curl -f http://your-app-domain/health || exit 1

Пример рабочего workflow

В этом разделе представлен полный пример рабочего workflow для деплоя приложения без Kubernetes.

yaml
name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    
    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    
    - name: Build and push Docker image
      run: |
        docker build -t ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} .
        docker push ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}
    
    - name: Add SSH key
      uses: webfactory/ssh-agent@v0.6.0
      with:
        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
    
    - name: Deploy to server
      run: |
        ssh -i ${{ secrets.SSH_PRIVATE_KEY }} user@server.com "
          cd /path/to/app
          export DOCKER_IMAGE=${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}
          docker-compose pull
          docker-compose up -d
          docker system prune -f
        "
    
    - name: Health check
      run: |
        sleep 30
        curl -f http://your-domain.com/health || exit 1

Разбор ключевых компонентов:

  • Сборка образа – создание Docker‑образа с последующим push в Docker Hub
  • SSH‑подключение – безопасный доступ к серверу для выполнения команд
  • Обновление контейнеров – pull новых образов и перезапуск сервисов
  • Очистка – удаление неиспользуемых образов для экономии места

Источники

  1. GitHub Actions Documentation
  2. Docker Documentation
  3. Docker Compose Documentation
  4. SSH Agent Action for GitHub Actions
  5. Docker Buildx Documentation

Заключение

Организация деплоя без Kubernetes через GitHub Actions является эффективным подходом для многих проектов. Основной процесс включает сборку Docker‑образов, их публикацию в Docker Hub и развертывание через SSH‑подключение на удаленных серверах. Docker‑compose отлично подходит для управления контейнерами в таком подходе, позволяя оркестрировать несколько сервисов.

Ключевые рекомендации:

  1. Всегда используйте SSH‑ключи для безопасного доступа к серверам
  2. Храните секреты (пароли, ключи) в GitHub Secrets
  3. Реализуйте механизмы отката на случай неудачного деплоя
  4. Настройте health checks для проверки работоспособности приложений
  5. Используйте семантическое версионирование для Docker‑образов

Для начала работы рекомендуется создать минимальный workflow и постепенно добавлять проверки мониторинга и безопасности. Такой подход позволяет достичь высокой надежности развертывания при сохранении относительной простоты управления.

Авторы
Проверено модерацией
Модерация