Блог "Дети ОИТа"
/поиск

Автоматизация развертывания приложений с помощью Docker Compose и GitHub Actions

Непрерывная интеграция и доставка (CI/CD) — стандарт современной разработки. Docker Compose позволяет описать многоконтейнерные окружения локально, а GitHub Actions — автоматизировать сборку, тестирование и деплой в облако или на сервер. В этом руководстве мы соберём пайплайн:...

Автоматизация развертывания приложений с помощью Docker Compose и GitHub Actions

Введение

Непрерывная интеграция и доставка (CI/CD) — стандарт современной разработки. Docker Compose позволяет описать многоконтейнерные окружения локально, а GitHub Actions — автоматизировать сборку, тестирование и деплой в облако или на сервер. В этом руководстве мы соберём пайплайн: сборка образов, пуш в registry, деплой через SSH с docker compose pull & up, health-check’и и откат.

1. Структура проекта

.
├── docker-compose.yml
├── Dockerfile
├── .github/
│   └── workflows/
│       └── ci-cd.yml
└── app/
    ├── main.py
    └── requirements.txt

2. docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - ENV=production
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 5s
      retries: 3

  redis:
    image: redis:7-alpine
    restart: unless-stopped

3. GitHub Actions: ci-cd.yml

name: CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}, ghcr.io/${{ github.repository }}:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Deploy to server
        if: github.ref == 'refs/heads/main'
        uses: appleboy/ssh-action@v1.0.
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            set -euo pipefail
            cd /opt/myapp
            echo "${{ secrets.GHCR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
            docker compose pull
            docker compose up -d --remove-orphans
            sleep 5
            if ! curl -fsS http://localhost:8000/health; then
              echo "Healthcheck failed, rolling back"
              docker compose down
              docker compose up -d
            fi

4. Health-check и откат

  • Healthcheck в compose — первая линия обороны. При провале на проде — алёрт и/или автоматический откат на предыдущую ревизию образа (используйте digest: image@sha256:...).
  • Стратегия деплоя: blue-green или rolling с health-check’ом на каждом шаге.

5. Секреты и безопасность

  • Храните секреты в GitHub Secrets: SERVER_HOST, SERVER_USER, SERVER_SSH_KEY, GHCR_PAT.
  • Используйте least privilege: отдельный пользователь на сервере, sudo только для docker, SSH только по ключу.
  • Подписывайте образы (cosign/sigstore) и включите сканирование уязвимостей (Trivy) в workflow.

6. Локальная разработка

# Собрать и запустить
 docker compose up --build

# Логи
 docker compose logs -f

# Выполнить миграции
 docker compose run --rm web python manage.py migrate

7. Распространённые ошибки

  • Забыли пробросить порты или volume для БД — данные теряются при пересоздании.
  • Нет healthcheck’а — деплой «зелёный», но сервис не отвечает.
  • Жёстко закодированные пути/версии образов — непредсказуемость на проде.
  • Секреты в репозитории — компрометация.

8. Чек-лист выкатки

  • docker-compose.yml прошёл compose config --quiet
  • Healthcheck определён и проверен локально
  • Секреты в GitHub Secrets, не в коде
  • Workflow кэширует слои (Buildx + GHA cache)
  • Деплойный скрипт идемпотентен
  • Есть откат по healthcheck’у
  • Скан уязвимостей включён

Заключение

Связка Docker Compose + GitHub Actions даёт воспроизводимый и контролируемый путь от коммита до продакшена. Чёткие health-check’и, кэширование билдов и дисциплина секретов превращают пайплайн в надёжный конвейер.


Ключевые слова: Docker Compose, GitHub Actions, CI/CD, docker, devops, автоматизация, healthcheck, security.