#!/bin/bash # AI Server Status Script for Ubuntu # RTX 2060 Optimized # Colors GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' echo -e "${BLUE}📊 AI Server Status Report${NC}" echo "========================================" # System Information echo -e "${PURPLE}🖥️ Система:${NC}" echo " Хост: $(hostname)" echo " IP: $(hostname -I | awk '{print $1}')" echo " Время работы: $(uptime -p)" echo " Дата: $(date '+%Y-%m-%d %H:%M:%S')" # GPU Status echo "" echo -e "${PURPLE}🎮 GPU (RTX 2060):${NC}" if command -v nvidia-smi &> /dev/null; then # GPU basic info GPU_INFO=$(nvidia-smi --query-gpu=name,driver_version,memory.used,memory.total,utilization.gpu,temperature.gpu --format=csv,noheader,nounits) if [[ -n "$GPU_INFO" ]]; then echo "$GPU_INFO" | while IFS=', ' read -r name driver mem_used mem_total util temp; do echo " ✅ Модель: $name" echo " 📦 Драйвер: $driver" echo " 🧠 VRAM: ${mem_used}MB / ${mem_total}MB ($(( (mem_used * 100) / mem_total ))%)" echo " ⚡ Загрузка: ${util}%" echo " 🌡️ Температура: ${temp}°C" # Warning thresholds if (( temp > 80 )); then echo -e " ${RED}⚠️ ВНИМАНИЕ: Высокая температура GPU!${NC}" fi if (( util > 90 )); then echo -e " ${YELLOW}⚠️ GPU сильно загружен${NC}" fi done else echo -e " ${RED}❌ Не удается получить информацию о GPU${NC}" fi else echo -e " ${RED}❌ NVIDIA драйверы не установлены${NC}" fi # Docker Status echo "" echo -e "${PURPLE}🐳 Docker:${NC}" if command -v docker &> /dev/null; then if docker info >/dev/null 2>&1; then echo -e " ✅ Docker запущен" echo " 📦 Версия: $(docker --version | cut -d' ' -f3 | tr -d ',')" # Check NVIDIA Docker support if docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi >/dev/null 2>&1; then echo -e " ✅ NVIDIA GPU поддержка включена" else echo -e " ${YELLOW}⚠️ NVIDIA GPU поддержка не настроена${NC}" fi else echo -e " ${RED}❌ Docker не запущен${NC}" fi else echo -e " ${RED}❌ Docker не установлен${NC}" fi # Ollama Status echo "" echo -e "${PURPLE}🤖 Ollama:${NC}" if systemctl is-active --quiet ollama; then echo -e " ✅ Сервис запущен" echo " 📍 Адрес: http://localhost:11434" # Test connection if curl -s http://localhost:11434 >/dev/null 2>&1; then echo -e " ✅ API доступен" # List models echo " 📦 Установленные модели:" sudo -u aiserver ollama list 2>/dev/null | tail -n +2 | while read -r line; do if [[ -n "$line" ]]; then model_name=$(echo "$line" | awk '{print $1}') model_size=$(echo "$line" | awk '{print $2}') echo " • $model_name ($model_size)" fi done else echo -e " ${RED}❌ API недоступен${NC}" fi # Service logs (last 3 lines) echo " 📋 Последние логи:" sudo journalctl -u ollama --no-pager -n 3 | tail -n +4 | sed 's/^/ /' else echo -e " ${RED}❌ Сервис остановлен${NC}" fi # Web UI Status echo "" echo -e "${PURPLE}🌐 Веб-интерфейс:${NC}" cd /opt/ai-server 2>/dev/null || { echo -e " ${RED}❌ Рабочая директория не найдена${NC}" exit 1 } if docker compose ps 2>/dev/null | grep -q "running"; then echo -e " ✅ Контейнеры запущены" echo " 📍 Адрес: http://$(hostname -I | awk '{print $1}'):3000" # Container details echo " 📦 Статус контейнеров:" docker compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null | tail -n +2 | while read -r line; do if [[ -n "$line" ]]; then echo " $line" fi done # Resource usage echo " 💻 Использование ресурсов:" docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" 2>/dev/null | \ grep "ai-server" | while read -r line; do echo " $line" done else echo -e " ${RED}❌ Контейнеры не запущены${NC}" fi # System Resources echo "" echo -e "${PURPLE}💾 Системные ресурсы:${NC}" # CPU CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1) echo " 🧮 CPU: ${CPU_USAGE}%" # Memory MEM_INFO=$(free -h | grep "Mem:") MEM_TOTAL=$(echo $MEM_INFO | awk '{print $2}') MEM_USED=$(echo $MEM_INFO | awk '{print $3}') MEM_PERCENT=$(free | grep Mem | awk '{printf("%.1f", ($3/$2) * 100.0)}') echo " 🧠 RAM: ${MEM_USED}/${MEM_TOTAL} (${MEM_PERCENT}%)" # Disk DISK_INFO=$(df -h /opt/ai-server 2>/dev/null | tail -1) if [[ -n "$DISK_INFO" ]]; then DISK_USED=$(echo $DISK_INFO | awk '{print $3}') DISK_TOTAL=$(echo $DISK_INFO | awk '{print $2}') DISK_PERCENT=$(echo $DISK_INFO | awk '{print $5}') echo " 💽 Диск: ${DISK_USED}/${DISK_TOTAL} (${DISK_PERCENT})" fi # Network echo " 🌐 Сетевые порты:" netstat -tln 2>/dev/null | grep -E ":3000|:11434|:9000" | while read -r line; do port=$(echo $line | awk '{print $4}' | cut -d':' -f2) case $port in 3000) echo " ✅ 3000 (Web UI) - активен" ;; 11434) echo " ✅ 11434 (Ollama) - активен" ;; 9000) echo " ✅ 9000 (Portainer) - активен" ;; esac done # Recommendations echo "" echo -e "${CYAN}💡 Рекомендации для RTX 2060:${NC}" # Check GPU memory usage if command -v nvidia-smi &> /dev/null; then GPU_MEM_USED=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits) if (( GPU_MEM_USED > 5000 )); then echo -e " ${YELLOW}⚠️ VRAM почти заполнена. Рассмотрите использование меньших моделей${NC}" echo " • llama3.2:1b (1.3GB) - быстрая модель" echo " • llama3.2:3b (2GB) - оптимальная для RTX 2060" elif (( GPU_MEM_USED < 1000 )); then echo -e " ${GREEN}✅ VRAM свободна. Можно использовать более крупные модели${NC}" echo " • codellama:7b (3.8GB) - для программирования" echo " • mistral:7b (4.1GB) - универсальная модель" fi fi echo "" echo "========================================" echo -e "${GREEN}📋 Команды управления:${NC}" echo " ai-start - запуск сервера" echo " ai-stop - остановка сервера" echo " ai-logs - просмотр логов" echo " ai-models - управление моделями" # Show last update time echo "" echo -e "${CYAN}Обновлено: $(date '+%H:%M:%S')${NC}"