158 Zeilen
4.8 KiB
Bash
158 Zeilen
4.8 KiB
Bash
#!/bin/bash
|
|
# Full Server Restore Script for V2-Docker
|
|
# Restores server from a backup created by create_full_backup.sh
|
|
|
|
set -e # Exit on error
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Check if backup path is provided
|
|
if [ $# -eq 0 ]; then
|
|
echo -e "${RED}Error: No backup specified${NC}"
|
|
echo "Usage: $0 <backup_path_or_name>"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 server_backup_20250628_171705"
|
|
echo " $0 /opt/v2-Docker/server-backups/server_backup_20250628_171705"
|
|
echo " $0 server_backup_20250628_171705.tar.gz"
|
|
exit 1
|
|
fi
|
|
|
|
BACKUP_INPUT="$1"
|
|
PROJECT_ROOT="/opt/v2-Docker"
|
|
BACKUP_BASE_DIR="$PROJECT_ROOT/server-backups"
|
|
|
|
# Determine backup directory
|
|
if [ -d "$BACKUP_INPUT" ]; then
|
|
# Full path provided
|
|
BACKUP_DIR="$BACKUP_INPUT"
|
|
elif [ -d "$BACKUP_BASE_DIR/$BACKUP_INPUT" ]; then
|
|
# Backup name provided
|
|
BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_INPUT"
|
|
elif [ -f "$BACKUP_BASE_DIR/$BACKUP_INPUT" ] && [[ "$BACKUP_INPUT" == *.tar.gz ]]; then
|
|
# Tar file provided - extract first
|
|
echo -e "${YELLOW}Extracting backup archive...${NC}"
|
|
TEMP_DIR=$(mktemp -d)
|
|
tar xzf "$BACKUP_BASE_DIR/$BACKUP_INPUT" -C "$TEMP_DIR"
|
|
BACKUP_DIR=$(find "$TEMP_DIR" -maxdepth 1 -type d -name "server_backup_*" | head -1)
|
|
if [ -z "$BACKUP_DIR" ]; then
|
|
echo -e "${RED}Error: Could not find backup directory in archive${NC}"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo -e "${RED}Error: Backup not found: $BACKUP_INPUT${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Starting V2-Docker Full Server Restore...${NC}"
|
|
echo "Restoring from: $BACKUP_DIR"
|
|
|
|
# Verify backup directory structure
|
|
if [ ! -f "$BACKUP_DIR/database_backup.sql.gz" ]; then
|
|
echo -e "${RED}Error: Invalid backup - database_backup.sql.gz not found${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Warning prompt
|
|
echo -e "${YELLOW}WARNING: This will restore the entire server state!${NC}"
|
|
echo "This includes:"
|
|
echo " - Configuration files"
|
|
echo " - SSL certificates"
|
|
echo " - Database (all data will be replaced)"
|
|
echo " - Docker volumes"
|
|
echo ""
|
|
read -p "Are you sure you want to continue? (yes/no): " CONFIRM
|
|
|
|
if [ "$CONFIRM" != "yes" ]; then
|
|
echo "Restore cancelled."
|
|
exit 0
|
|
fi
|
|
|
|
# 1. Stop all services
|
|
echo -e "${YELLOW}Stopping Docker services...${NC}"
|
|
cd "$PROJECT_ROOT"
|
|
docker-compose down
|
|
|
|
# 2. Restore configuration files
|
|
echo -e "${YELLOW}Restoring configuration files...${NC}"
|
|
if [ -f "$BACKUP_DIR/configs/docker-compose.yaml" ]; then
|
|
cp "$BACKUP_DIR/configs/docker-compose.yaml" "$PROJECT_ROOT/"
|
|
fi
|
|
if [ -f "$BACKUP_DIR/configs/.env" ]; then
|
|
cp "$BACKUP_DIR/configs/.env" "$PROJECT_ROOT/"
|
|
fi
|
|
if [ -f "$BACKUP_DIR/configs/nginx.conf" ]; then
|
|
mkdir -p "$PROJECT_ROOT/v2_nginx"
|
|
cp "$BACKUP_DIR/configs/nginx.conf" "$PROJECT_ROOT/v2_nginx/"
|
|
fi
|
|
|
|
# Restore SSL certificates
|
|
if [ -d "$BACKUP_DIR/configs/ssl" ]; then
|
|
mkdir -p "$PROJECT_ROOT/v2_nginx/ssl"
|
|
cp -r "$BACKUP_DIR/configs/ssl/"* "$PROJECT_ROOT/v2_nginx/ssl/"
|
|
fi
|
|
|
|
# 3. Restore Docker volumes
|
|
echo -e "${YELLOW}Restoring Docker volumes...${NC}"
|
|
# Remove old volume
|
|
docker volume rm v2_postgres_data 2>/dev/null || true
|
|
# Create new volume
|
|
docker volume create v2_postgres_data
|
|
# Restore volume data
|
|
docker run --rm -v v2_postgres_data:/data -v "$BACKUP_DIR/volumes":/backup alpine tar xzf /backup/v2_postgres_data.tar.gz -C /data
|
|
|
|
# 4. Start database service only
|
|
echo -e "${YELLOW}Starting database service...${NC}"
|
|
docker-compose up -d db
|
|
|
|
# Wait for database to be ready
|
|
echo "Waiting for database to be ready..."
|
|
sleep 10
|
|
|
|
# 5. Restore database
|
|
echo -e "${YELLOW}Restoring database...${NC}"
|
|
DB_CONTAINER="v2_postgres"
|
|
DB_NAME="v2_license_db"
|
|
DB_USER="v2_user"
|
|
|
|
# Get DB password from restored .env
|
|
if [ -f "$PROJECT_ROOT/.env" ]; then
|
|
source "$PROJECT_ROOT/.env"
|
|
fi
|
|
DB_PASS="${POSTGRES_PASSWORD:-${DB_PASS:-v2_password}}"
|
|
|
|
# Drop and recreate database
|
|
docker exec "$DB_CONTAINER" psql -U "$DB_USER" -c "DROP DATABASE IF EXISTS $DB_NAME;"
|
|
docker exec "$DB_CONTAINER" psql -U "$DB_USER" -c "CREATE DATABASE $DB_NAME;"
|
|
|
|
# Restore database from backup
|
|
gunzip -c "$BACKUP_DIR/database_backup.sql.gz" | docker exec -i "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME"
|
|
|
|
# 6. Start all services
|
|
echo -e "${YELLOW}Starting all services...${NC}"
|
|
docker-compose up -d
|
|
|
|
# Wait for services to be ready
|
|
echo "Waiting for services to start..."
|
|
sleep 15
|
|
|
|
# 7. Verify services are running
|
|
echo -e "${YELLOW}Verifying services...${NC}"
|
|
docker-compose ps
|
|
|
|
# Clean up temporary directory if used
|
|
if [ -n "$TEMP_DIR" ] && [ -d "$TEMP_DIR" ]; then
|
|
rm -rf "$TEMP_DIR"
|
|
fi
|
|
|
|
echo -e "${GREEN}Restore completed successfully!${NC}"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "1. Verify the application is working at https://admin-panel-undso.intelsight.de"
|
|
echo "2. Check logs: docker-compose logs -f"
|
|
echo "3. If there are issues, check the backup info: cat $BACKUP_DIR/backup_info.txt" |