From fd2e00069b85235749efaf9b3a0af7d5f4086811 Mon Sep 17 00:00:00 2001 From: "S.Gromov" Date: Thu, 23 Oct 2025 22:12:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=B5=D1=80=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BB=D1=83=D1=87=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Автоматическое определение project name из Docker labels - Остановка и запуск контейнеров с использованием их ID вместо docker-compose - Обновлены комментарии и документация для ясности использования - Изменены примеры в env.example и README.md для соответствия новым изменениям --- .gitea/workflows/docker-build-1.yml | 4 +- README.md | 4 +- backup.sh | 93 ++++++++++++++++++----------- docker-compose.yaml | 3 +- env.example | 8 +-- 5 files changed, 69 insertions(+), 43 deletions(-) diff --git a/.gitea/workflows/docker-build-1.yml b/.gitea/workflows/docker-build-1.yml index 518518b..4372f2f 100644 --- a/.gitea/workflows/docker-build-1.yml +++ b/.gitea/workflows/docker-build-1.yml @@ -38,8 +38,8 @@ jobs: uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} - username: ${{ gitea.actor }} - password: ${{ gitea.token }} + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} - name: Extract metadata id: meta diff --git a/README.md b/README.md index e44056b..a1b9352 100644 --- a/README.md +++ b/README.md @@ -111,9 +111,11 @@ docker exec project-backup aws s3 ls s3://your-bucket --endpoint-url=https://you ```yaml environment: - - BACKUP_STOP_SERVICES=app db + - BACKUP_STOP_SERVICES=gitea postgres ``` +**Важно:** Контейнер `backup` должен быть запущен из **того же** `docker-compose.yaml` что и целевые сервисы. Project name определяется автоматически через Docker labels. + Сервисы автоматически запустятся после создания архива. diff --git a/backup.sh b/backup.sh index dd737d2..536bf75 100644 --- a/backup.sh +++ b/backup.sh @@ -64,29 +64,52 @@ stop_services() { return 0 fi - # Ищем docker-compose.yml в директории бекапа - local compose_file="/backup-source/docker-compose.yml" + # Определяем project name из собственных labels контейнера + local project_name=$(docker inspect "$HOSTNAME" --format '{{index .Config.Labels "com.docker.compose.project"}}' 2>/dev/null) - if [ ! -f "$compose_file" ]; then - # Пробуем docker-compose.yaml - compose_file="/backup-source/docker-compose.yaml" - fi - - if [ ! -f "$compose_file" ]; then - log_error "Docker Compose файл не найден в /backup-source/" - return 1 + if [ -z "$project_name" ]; then + log_warning "Не удалось определить project name автоматически" + log_warning "Контейнер backup должен быть запущен из того же docker-compose.yaml что и целевые сервисы" + return 0 fi + log "Project name определён автоматически: ${project_name}" log "Остановка сервисов: ${BACKUP_STOP_SERVICES}" - log "Используется compose файл: ${compose_file}" - # Останавливаем указанные сервисы - docker compose -f "$compose_file" down $BACKUP_STOP_SERVICES || { - log_error "Ошибка при остановке сервисов" - return 1 - } + # Запоминаем ID контейнеров для последующего запуска + CONTAINERS_TO_RESTART="" - log "Сервисы успешно остановлены" + for service in $BACKUP_STOP_SERVICES; do + # Ищем контейнер по service name + project name + статус running + local container_id=$(docker ps \ + --filter "label=com.docker.compose.service=${service}" \ + --filter "label=com.docker.compose.project=${project_name}" \ + --filter "status=running" \ + --format "{{.ID}}" \ + | head -n1) + + if [ -n "$container_id" ]; then + local container_name=$(docker inspect "$container_id" --format '{{.Name}}' | sed 's/^\///') + log "Сервис ${service} (контейнер: ${container_name}) запущен, будет остановлен" + + # Останавливаем контейнер + docker stop "$container_id" >/dev/null 2>&1 || { + log_error "Ошибка при остановке контейнера ${container_name}" + return 1 + } + + # Запоминаем ID для последующего запуска + CONTAINERS_TO_RESTART="${CONTAINERS_TO_RESTART} ${container_id}" + else + log "Сервис ${service} не запущен или не найден, пропускаем" + fi + done + + if [ -n "$CONTAINERS_TO_RESTART" ]; then + log "Контейнеры успешно остановлены" + else + log "Нет запущенных сервисов для остановки" + fi # Даем время на корректное завершение sleep 5 @@ -100,28 +123,28 @@ start_services() { return 0 fi - # Ищем docker-compose.yml в директории бекапа - local compose_file="/backup-source/docker-compose.yml" - - if [ ! -f "$compose_file" ]; then - # Пробуем docker-compose.yaml - compose_file="/backup-source/docker-compose.yaml" + # Проверяем что есть контейнеры для запуска + if [ -z "$CONTAINERS_TO_RESTART" ]; then + log "Нет контейнеров для запуска" + return 0 fi - if [ ! -f "$compose_file" ]; then - log_error "Docker Compose файл не найден в /backup-source/" - return 1 - fi + log "Запуск контейнеров..." - log "Запуск сервисов: ${BACKUP_STOP_SERVICES}" + # Запускаем только те контейнеры, которые были остановлены + for container_id in $CONTAINERS_TO_RESTART; do + local container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null | sed 's/^\///') + + if [ -n "$container_name" ]; then + log "Запуск контейнера: ${container_name}" + docker start "$container_id" >/dev/null 2>&1 || { + log_error "Ошибка при запуске контейнера ${container_name}" + return 1 + } + fi + done - # Запускаем указанные сервисы в detached режиме - docker compose -f "$compose_file" up -d $BACKUP_STOP_SERVICES || { - log_error "Ошибка при запуске сервисов" - return 1 - } - - log "Сервисы успешно запущены" + log "Контейнеры успешно запущены" return 0 } diff --git a/docker-compose.yaml b/docker-compose.yaml index 7b51ec5..1b5f45f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -40,7 +40,8 @@ services: # Запускать ли бэкап сразу при старте контейнера (true/false) - BACKUP_ON_START=${BACKUP_ON_START:-false} - # Список сервисов для остановки перед бекапом через пробел (необязательно): gitea gitea-db + # Список сервисов для остановки перед бекапом через пробел (необязательно): gitea postgres + # Контейнер backup должен быть запущен из того же docker-compose.yaml что и целевые сервисы - BACKUP_STOP_SERVICES=${BACKUP_STOP_SERVICES:-} volumes: diff --git a/env.example b/env.example index 42b061b..c885837 100644 --- a/env.example +++ b/env.example @@ -54,9 +54,9 @@ BACKUP_SCHEDULE=0 5 * * * BACKUP_ON_START=false # Список сервисов для остановки перед бекапом (необязательно) -# Сервисы будут остановлены через "docker compose down", -# а после создания архива запущены через "docker compose up -d" -# Укажите названия сервисов через пробел, например: gitea gitea-db +# Сервисы будут остановлены через "docker stop", +# а после создания архива запущены через "docker start" +# Укажите названия сервисов через пробел, например: gitea postgres # Если не указано - сервисы НЕ будут останавливаться -# Примечание: автоматически ищется docker-compose.yml в директории бекапа +# ВАЖНО: Контейнер backup должен быть запущен из того же docker-compose.yaml что и целевые сервисы BACKUP_STOP_SERVICES=