#!/bin/bash # ───────────────────────────────────────────────────────────────────────────── # Откат к предыдущему образу # # Использование (на сервере): # bash /opt/intradbot/scripts/rollback.sh # # Как работает: # Перед каждым деплоем Woodpecker сохраняет ID текущего образа # в /opt/intradbot/.previous_image. # Этот скрипт перетегирует сохранённый образ как :latest и перезапускает # контейнер без обращения к registry. # ───────────────────────────────────────────────────────────────────────────── set -e DEPLOY_DIR="/opt/intradbot" COMPOSE_FILE="$DEPLOY_DIR/docker-compose.yml" PREV_FILE="$DEPLOY_DIR/.previous_image" cd "$DEPLOY_DIR" if [ ! -f "$PREV_FILE" ]; then echo "ERROR: файл $PREV_FILE не найден — предыдущий деплой не был записан" exit 1 fi PREV_IMAGE=$(cat "$PREV_FILE" | tr -d '[:space:]') if [ -z "$PREV_IMAGE" ]; then echo "ERROR: $PREV_FILE пустой" exit 1 fi # Проверяем, что образ ещё есть локально (не был удалён docker prune) if ! docker image inspect "$PREV_IMAGE" > /dev/null 2>&1; then echo "ERROR: образ $PREV_IMAGE не найден локально — используй ручной откат:" echo " docker compose pull # затем подставь нужный sha-тег в docker-compose.yml" exit 1 fi # Определяем полное имя образа из docker-compose.yml TARGET_IMAGE=$(grep 'image:' "$COMPOSE_FILE" | awk '{print $2}' | head -1) if [ -z "$TARGET_IMAGE" ]; then echo "ERROR: не удалось извлечь image из $COMPOSE_FILE" exit 1 fi echo "Откат:" echo " образ сейчас : $(docker compose ps -q intradbot 2>/dev/null | xargs -r docker inspect --format='{{.Image}}' | head -1 || echo 'нет контейнера')" echo " откатываемся : $PREV_IMAGE" # Перетегируем старый образ как :latest локально docker tag "$PREV_IMAGE" "$TARGET_IMAGE" # Перезапускаем без pull (используем локальный образ) docker compose up -d --no-build echo "" echo "Откат выполнен. Текущий образ: $TARGET_IMAGE" echo "Для проверки: docker compose ps"