intrabot/scripts/rollback.sh
2026-03-15 21:36:03 +03:00

59 lines
2.7 KiB
Bash

#!/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"