#!/bin/bash # Pre-deployment system check for CatLink # Проверяет готовность системы к развертыванию set -e # Цвета RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' success() { echo -e "${GREEN}✅ $1${NC}"; } warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } error() { echo -e "${RED}❌ $1${NC}"; } info() { echo -e "${BLUE}ℹ️ $1${NC}"; } ERRORS=0 WARNINGS=0 check_and_report() { if $1; then success "$2" else error "$2" ((ERRORS++)) fi } check_and_warn() { if $1; then success "$2" else warning "$2" ((WARNINGS++)) fi } echo "🔍 ===== CatLink Pre-Deployment Check =====" echo "" # Проверка операционной системы info "Проверка операционной системы..." OS=$(lsb_release -si 2>/dev/null || echo "Unknown") VERSION=$(lsb_release -sr 2>/dev/null || echo "Unknown") echo " OS: $OS $VERSION" # Проверка архитектуры ARCH=$(uname -m) echo " Architecture: $ARCH" # Проверка прав sudo check_and_report "sudo -n true 2>/dev/null" "Права sudo доступны" # Проверка свободного места info "Проверка дискового пространства..." DISK_SPACE=$(df / | awk 'NR==2 {print $4}') DISK_SPACE_GB=$((DISK_SPACE / 1024 / 1024)) echo " Свободно: ${DISK_SPACE_GB}GB" if [ $DISK_SPACE_GB -lt 5 ]; then error "Недостаточно места на диске (минимум 5GB)" ((ERRORS++)) elif [ $DISK_SPACE_GB -lt 10 ]; then warning "Мало места на диске (рекомендуется минимум 10GB)" ((WARNINGS++)) else success "Достаточно места на диске" fi # Проверка RAM info "Проверка оперативной памяти..." RAM_MB=$(free -m | awk 'NR==2{print $2}') RAM_GB=$((RAM_MB / 1024)) echo " RAM: ${RAM_GB}GB (${RAM_MB}MB)" if [ $RAM_MB -lt 1024 ]; then error "Недостаточно RAM (минимум 1GB)" ((ERRORS++)) elif [ $RAM_MB -lt 2048 ]; then warning "Мало RAM (рекомендуется минимум 2GB)" ((WARNINGS++)) else success "Достаточно RAM" fi # Проверка Docker echo "" info "Проверка Docker..." check_and_report "command -v docker >/dev/null 2>&1" "Docker установлен" if command -v docker >/dev/null 2>&1; then DOCKER_VERSION=$(docker --version | cut -d' ' -f3 | cut -d',' -f1) echo " Версия Docker: $DOCKER_VERSION" check_and_report "docker ps >/dev/null 2>&1" "Docker daemon запущен" check_and_report "docker info | grep -q 'Server Version'" "Docker доступен без sudo" fi # Проверка Docker Compose # Проверка Docker Compose echo "" info "Проверка Docker Compose..." # Проверяем Docker Compose v1 или v2 if command -v docker-compose >/dev/null 2>&1; then COMPOSE_VERSION=$(docker-compose --version | cut -d' ' -f3 | cut -d',' -f1) echo " Версия Docker Compose v1: $COMPOSE_VERSION" success "Docker Compose v1 установлен" elif docker compose version >/dev/null 2>&1; then COMPOSE_VERSION=$(docker compose version --short 2>/dev/null || docker compose version | head -1 | cut -d' ' -f4) echo " Версия Docker Compose v2: $COMPOSE_VERSION" success "Docker Compose v2 установлен" else error "Docker Compose не установлен" ((ERRORS++)) fi # Проверка портов echo "" info "Проверка портов..." check_port() { ! netstat -tuln 2>/dev/null | grep -q ":$1 " && ! ss -tuln 2>/dev/null | grep -q ":$1 " } check_and_warn "check_port 80" "Порт 80 свободен" check_and_warn "check_port 443" "Порт 443 свободен" check_and_warn "check_port 3000" "Порт 3000 свободен" check_and_warn "check_port 8000" "Порт 8000 свободен" check_and_warn "check_port 5432" "Порт 5432 свободен" # Проверка nginx echo "" info "Проверка nginx..." if command -v nginx >/dev/null 2>&1; then NGINX_VERSION=$(nginx -v 2>&1 | cut -d' ' -f3) success "nginx установлен ($NGINX_VERSION)" if systemctl is-active --quiet nginx; then warning "nginx уже запущен (может потребоваться перенастройка)" else success "nginx остановлен (готов к настройке)" fi else warning "nginx не установлен (будет установлен автоматически)" fi # Проверка certbot check_and_warn "command -v certbot >/dev/null 2>&1" "certbot установлен (будет установлен при необходимости)" # Проверка Python echo "" info "Проверка Python..." check_and_report "command -v python3 >/dev/null 2>&1" "Python 3 установлен" if command -v python3 >/dev/null 2>&1; then PYTHON_VERSION=$(python3 --version | cut -d' ' -f2) echo " Версия Python: $PYTHON_VERSION" fi # Проверка openssl check_and_report "command -v openssl >/dev/null 2>&1" "OpenSSL установлен" # Проверка файлов проекта echo "" info "Проверка файлов проекта..." check_and_report "[ -f 'docker-compose.yml' ]" "docker-compose.yml найден" check_and_report "[ -f 'Makefile' ]" "Makefile найден" check_and_report "[ -d 'backend' ]" "Директория backend найдена" check_and_report "[ -d 'frontend' ]" "Директория frontend найдена" # Проверка git if [ -d ".git" ]; then success "Git репозиторий найден" BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo " Текущая ветка: $BRANCH" if git status --porcelain | grep -q .; then warning "Есть неcommitted изменения" else success "Рабочая директория чистая" fi else warning "Не Git репозиторий" fi # Проверка интернет соединения echo "" info "Проверка интернет соединения..." check_and_report "ping -c 1 8.8.8.8 >/dev/null 2>&1" "Интернет соединение доступно" check_and_report "ping -c 1 docker.io >/dev/null 2>&1" "Docker Hub доступен" # Проверка DNS if command -v nslookup >/dev/null 2>&1; then check_and_report "nslookup google.com >/dev/null 2>&1" "DNS работает" fi # Проверка firewall echo "" info "Проверка firewall..." if command -v ufw >/dev/null 2>&1; then if ufw status | grep -q "Status: active"; then warning "UFW активен (может блокировать порты)" echo " Убедитесь что порты 80, 443 открыты" else info "UFW неактивен" fi fi # Проверка SELinux (если есть) if command -v getenforce >/dev/null 2>&1; then SELINUX_STATUS=$(getenforce 2>/dev/null || echo "Unknown") if [ "$SELINUX_STATUS" = "Enforcing" ]; then warning "SELinux в режиме Enforcing (может блокировать Docker)" else info "SELinux: $SELINUX_STATUS" fi fi # Итоговая сводка echo "" echo "📊 ===== ИТОГОВАЯ СВОДКА =====" if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then success "Система полностью готова к развертыванию!" echo "" echo "🚀 Можете запускать: make deploy" elif [ $ERRORS -eq 0 ]; then warning "Система готова к развертыванию с предупреждениями ($WARNINGS)" echo "" echo "⚡ Можете запускать: make deploy" echo " (предупреждения будут обработаны автоматически)" else error "Обнаружены критические проблемы ($ERRORS ошибок, $WARNINGS предупреждений)" echo "" echo "🔧 Исправьте ошибки перед развертыванием:" echo " - Установите недостающие компоненты" echo " - Освободите дисковое пространство" echo " - Настройте права доступа" exit 1 fi echo "" echo "💡 Полезные команды:" echo " make help - Показать все доступные команды" echo " make deploy - Запустить полное развертывание" echo " make security-audit - Проверить безопасность" echo " make logs - Посмотреть логи" exit 0