59 lines
2.7 KiB
Bash
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"
|