Автоматизация развертывания приложений с помощью 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.