mirror of
https://gitverse.ru/kpa39l/netbox.git
synced 2026-09-29 18:05:10 +00:00
First working version
This commit is contained in:
Executable
+242
@@ -0,0 +1,242 @@
|
||||
#!/bin/bash
|
||||
# Скрипт восстановления NetBox из бэкапа
|
||||
|
||||
set -e # Останавливаемся при любой ошибке
|
||||
|
||||
BACKUP_DIR="/opt/netbox/backups"
|
||||
YADISK_MOUNT="/opt/netbox/yadisk"
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Функция для вывода цветных сообщений
|
||||
print_error() { echo -e "${RED}❌ $1${NC}"; }
|
||||
print_success() { echo -e "${GREEN}✅ $1${NC}"; }
|
||||
print_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
||||
print_info() { echo -e "ℹ️ $1"; }
|
||||
|
||||
# Показать доступные бэкапы
|
||||
show_backups() {
|
||||
echo ""
|
||||
echo "📁 Доступные бэкапы:"
|
||||
echo "===================="
|
||||
|
||||
# Локальные бэкапы
|
||||
if [ -d "$BACKUP_DIR" ] && [ -n "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
|
||||
echo -e "\n${GREEN}Локальные бэкапы:${NC}"
|
||||
ls -lh $BACKUP_DIR/netbox_db_*.sql.gz 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
||||
fi
|
||||
|
||||
# Бэкапы на Яндекс.Диске
|
||||
if mountpoint -q ${YADISK_MOUNT} && [ -d "$YADISK_MOUNT/netbox-backups" ]; then
|
||||
echo -e "\n${GREEN}Бэкапы на Яндекс.Диске:${NC}"
|
||||
ls -lh $YADISK_MOUNT/netbox-backups/netbox_db_*.sql.gz 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Выбор бэкапа
|
||||
select_backup() {
|
||||
local backup_files=()
|
||||
|
||||
# Собираем все доступные бэкапы
|
||||
if [ -d "$BACKUP_DIR" ]; then
|
||||
for f in $BACKUP_DIR/netbox_db_*.sql.gz; do
|
||||
[ -f "$f" ] && backup_files+=("$f")
|
||||
done
|
||||
fi
|
||||
|
||||
if mountpoint -q ${YADISK_MOUNT} && [ -d "$YADISK_MOUNT/netbox-backups" ]; then
|
||||
for f in $YADISK_MOUNT/netbox-backups/netbox_db_*.sql.gz; do
|
||||
[ -f "$f" ] && backup_files+=("$f")
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ${#backup_files[@]} -eq 0 ]; then
|
||||
print_error "Нет доступных бэкапов!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Выберите бэкап для восстановления:"
|
||||
for i in "${!backup_files[@]}"; do
|
||||
local size=$(du -h "${backup_files[$i]}" | cut -f1)
|
||||
local date=$(basename "${backup_files[$i]}" | sed 's/netbox_db_\(.*\)\.sql.gz/\1/')
|
||||
echo " $((i+1)). $date (${size}) - $(basename $(dirname ${backup_files[$i]}))"
|
||||
done
|
||||
echo " 0. Отмена"
|
||||
echo ""
|
||||
read -p "Введите номер [1-${#backup_files[@]}]: " choice
|
||||
|
||||
if [ "$choice" == "0" ]; then
|
||||
echo "Восстановление отменено."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$choice" -ge 1 ] && [ "$choice" -le ${#backup_files[@]} ]; then
|
||||
SELECTED_BACKUP="${backup_files[$((choice-1))]}"
|
||||
BACKUP_DATE=$(basename "$SELECTED_BACKUP" | sed 's/netbox_db_\(.*\)\.sql.gz/\1/')
|
||||
BACKUP_SOURCE=$(basename $(dirname "$SELECTED_BACKUP"))
|
||||
print_success "Выбран бэкап от $BACKUP_DATE (источник: $BACKUP_SOURCE)"
|
||||
else
|
||||
print_error "Неверный выбор!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверка, что NetBox не запущен
|
||||
check_netbox_stopped() {
|
||||
if docker compose ps | grep -q "Up"; then
|
||||
print_warning "NetBox контейнеры запущены!"
|
||||
read -p "Остановить их перед восстановлением? [y/N]: " stop_containers
|
||||
if [[ $stop_containers =~ ^[Yy]$ ]]; then
|
||||
print_info "Останавливаем контейнеры..."
|
||||
docker compose down
|
||||
else
|
||||
print_error "Пожалуйста, остановите контейнеры вручную: docker compose down"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Основной процесс восстановления
|
||||
restore_backup() {
|
||||
echo ""
|
||||
print_info "Начинаем восстановление из бэкапа $BACKUP_DATE"
|
||||
echo "=========================================="
|
||||
|
||||
# 1. Распаковка и восстановление базы данных
|
||||
echo ""
|
||||
print_info "1. Восстановление базы данных PostgreSQL..."
|
||||
|
||||
# Запускаем только PostgreSQL
|
||||
docker compose up -d postgres redis redis-cache
|
||||
sleep 5
|
||||
|
||||
# Проверяем, что PostgreSQL готов
|
||||
until docker compose exec -T postgres pg_isready -U netbox; do
|
||||
echo " Ожидаем запуска PostgreSQL..."
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Восстанавливаем базу данных
|
||||
echo " Восстанавливаем базу данных из $SELECTED_BACKUP..."
|
||||
gunzip -c "$SELECTED_BACKUP" | docker compose exec -T postgres psql -U netbox -d netbox
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "База данных восстановлена"
|
||||
else
|
||||
print_error "Ошибка восстановления базы данных"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Восстановление медиа-файлов
|
||||
MEDIA_BACKUP="${BACKUP_DIR}/netbox_media_${BACKUP_DATE}.tar.gz"
|
||||
if [ ! -f "$MEDIA_BACKUP" ] && mountpoint -q ${YADISK_MOUNT}; then
|
||||
MEDIA_BACKUP="${YADISK_MOUNT}/netbox-backups/netbox_media_${BACKUP_DATE}.tar.gz"
|
||||
fi
|
||||
|
||||
if [ -f "$MEDIA_BACKUP" ]; then
|
||||
echo ""
|
||||
print_info "2. Восстановление медиа-файлов..."
|
||||
docker compose exec -T netbox rm -rf /opt/netbox/netbox/media/* 2>/dev/null
|
||||
docker compose exec -T netbox tar xzf - -C /opt/netbox/netbox/media < "$MEDIA_BACKUP"
|
||||
print_success "Медиа-файлы восстановлены"
|
||||
else
|
||||
print_warning "Медиа-бэкап не найден: netbox_media_${BACKUP_DATE}.tar.gz"
|
||||
fi
|
||||
|
||||
# 3. Восстановление .env файлов
|
||||
ENV_BACKUP="${BACKUP_DIR}/netbox_env_${BACKUP_DATE}.tar.gz"
|
||||
if [ ! -f "$ENV_BACKUP" ] && mountpoint -q ${YADISK_MOUNT}; then
|
||||
ENV_BACKUP="${YADISK_MOUNT}/netbox-backups/netbox_env_${BACKUP_DATE}.tar.gz"
|
||||
fi
|
||||
|
||||
if [ -f "$ENV_BACKUP" ]; then
|
||||
echo ""
|
||||
print_info "3. Восстановление .env файлов..."
|
||||
tar xzf "$ENV_BACKUP" -C /opt/netbox
|
||||
print_success ".env файлы восстановлены"
|
||||
else
|
||||
print_warning ".env бэкап не найден: netbox_env_${BACKUP_DATE}.tar.gz"
|
||||
fi
|
||||
|
||||
# 4. Запуск миграций и сбор статики
|
||||
echo ""
|
||||
print_info "4. Запуск миграций и сбор статики..."
|
||||
docker compose up -d netbox
|
||||
sleep 10
|
||||
docker compose exec netbox python /opt/netbox/netbox/manage.py migrate
|
||||
docker compose exec netbox python /opt/netbox/netbox/manage.py collectstatic --no-input
|
||||
|
||||
# 5. Запуск всех контейнеров
|
||||
echo ""
|
||||
print_info "5. Запуск всех сервисов..."
|
||||
docker compose up -d
|
||||
|
||||
echo ""
|
||||
print_success "Восстановление завершено!"
|
||||
echo ""
|
||||
print_info "Проверьте логи: docker compose logs netbox --tail 50"
|
||||
print_info "Веб-интерфейс: http://localhost:8080"
|
||||
}
|
||||
|
||||
# Функция для быстрого восстановления последнего бэкапа
|
||||
quick_restore() {
|
||||
local latest_backup=$(ls -t $BACKUP_DIR/netbox_db_*.sql.gz 2>/dev/null | head -1)
|
||||
if [ -z "$latest_backup" ] && mountpoint -q ${YADISK_MOUNT}; then
|
||||
latest_backup=$(ls -t $YADISK_MOUNT/netbox-backups/netbox_db_*.sql.gz 2>/dev/null | head -1)
|
||||
fi
|
||||
|
||||
if [ -z "$latest_backup" ]; then
|
||||
print_error "Нет доступных бэкапов!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SELECTED_BACKUP="$latest_backup"
|
||||
BACKUP_DATE=$(basename "$SELECTED_BACKUP" | sed 's/netbox_db_\(.*\)\.sql.gz/\1/')
|
||||
BACKUP_SOURCE=$(basename $(dirname "$SELECTED_BACKUP"))
|
||||
print_info "Восстанавливаем последний бэкап: $BACKUP_DATE (источник: $BACKUP_SOURCE)"
|
||||
restore_backup
|
||||
}
|
||||
|
||||
# Основное меню
|
||||
main() {
|
||||
cd /opt/netbox
|
||||
|
||||
echo "🔄 NetBox Recovery Script"
|
||||
echo "========================"
|
||||
echo ""
|
||||
echo "1. Показать доступные бэкапы"
|
||||
echo "2. Восстановить из выбранного бэкапа"
|
||||
echo "3. Быстрое восстановление (последний бэкап)"
|
||||
echo "0. Выход"
|
||||
echo ""
|
||||
read -p "Выберите действие [0-3]: " action
|
||||
|
||||
case $action in
|
||||
1)
|
||||
show_backups
|
||||
;;
|
||||
2)
|
||||
show_backups
|
||||
select_backup
|
||||
check_netbox_stopped
|
||||
restore_backup
|
||||
;;
|
||||
3)
|
||||
quick_restore
|
||||
;;
|
||||
0)
|
||||
echo "Выход."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Неверный выбор!"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Запуск
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user