test server

This commit is contained in:
2025-09-22 15:07:35 +05:00
commit a8f09eb4ea
11 changed files with 1843 additions and 0 deletions

228
scripts/models.sh Normal file
View File

@@ -0,0 +1,228 @@
#!/bin/bash
# AI Server Model Management Script
# Optimized for RTX 2060
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m'
show_menu() {
echo -e "${BLUE}🤖 AI Server - Управление моделями${NC}"
echo "=================================="
echo "1. Показать установленные модели"
echo "2. Установить рекомендуемые модели для RTX 2060"
echo "3. Установить конкретную модель"
echo "4. Удалить модель"
echo "5. Тестировать модель"
echo "6. Показать использование VRAM"
echo "7. Рекомендации по моделям"
echo "8. Выход"
echo ""
}
list_models() {
echo -e "${PURPLE}📦 Установленные модели:${NC}"
sudo -u aiserver ollama list
echo ""
if command -v nvidia-smi &> /dev/null; then
echo -e "${PURPLE}💾 Использование VRAM:${NC}"
nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits | \
awk -F', ' '{printf "Используется: %d MB / %d MB (%.1f%%)\n", $1, $2, ($1/$2)*100}'
fi
echo ""
}
install_recommended() {
echo -e "${YELLOW}🎯 Установка рекомендуемых моделей для RTX 2060...${NC}"
echo ""
models=("llama3.2:1b" "llama3.2:3b" "codellama:7b")
descriptions=("Быстрая модель (1.3GB)" "Оптимальная модель (2GB)" "Модель для кода (3.8GB)")
for i in "${!models[@]}"; do
model="${models[$i]}"
desc="${descriptions[$i]}"
echo -e "${BLUE}Устанавливаю: $model - $desc${NC}"
sudo -u aiserver ollama pull "$model"
if [ $? -eq 0 ]; then
echo -e "${GREEN}$model установлена${NC}"
else
echo -e "${RED}❌ Ошибка установки $model${NC}"
fi
echo ""
done
}
install_custom() {
echo -e "${YELLOW}Введите название модели (например: llama3.2:3b):${NC}"
read -r model_name
if [[ -z "$model_name" ]]; then
echo -e "${RED}❌ Название модели не может быть пустым${NC}"
return
fi
echo -e "${BLUE}Установка модели: $model_name${NC}"
echo -e "${YELLOW}Это может занять несколько минут...${NC}"
sudo -u aiserver ollama pull "$model_name"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Модель $model_name успешно установлена${NC}"
else
echo -e "${RED}❌ Ошибка установки модели $model_name${NC}"
fi
}
remove_model() {
echo -e "${PURPLE}📦 Доступные модели для удаления:${NC}"
sudo -u aiserver ollama list
echo ""
echo -e "${YELLOW}Введите название модели для удаления:${NC}"
read -r model_name
if [[ -z "$model_name" ]]; then
echo -e "${RED}❌ Название модели не может быть пустым${NC}"
return
fi
echo -e "${YELLOW}⚠️ Удалить модель $model_name? (y/N):${NC}"
read -r confirm
if [[ $confirm =~ ^[Yy]$ ]]; then
sudo -u aiserver ollama rm "$model_name"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Модель $model_name удалена${NC}"
else
echo -e "${RED}❌ Ошибка удаления модели $model_name${NC}"
fi
else
echo -e "${BLUE}Отменено${NC}"
fi
}
test_model() {
echo -e "${PURPLE}📦 Доступные модели:${NC}"
sudo -u aiserver ollama list
echo ""
echo -e "${YELLOW}Введите название модели для тестирования:${NC}"
read -r model_name
if [[ -z "$model_name" ]]; then
echo -e "${RED}❌ Название модели не может быть пустым${NC}"
return
fi
echo -e "${BLUE}Тестирование модели: $model_name${NC}"
echo -e "${YELLOW}Задаю тестовый вопрос...${NC}"
sudo -u aiserver ollama run "$model_name" "Привет! Как дела? Ответь кратко."
}
show_vram_usage() {
if command -v nvidia-smi &> /dev/null; then
echo -e "${PURPLE}🎮 Информация о GPU:${NC}"
nvidia-smi --query-gpu=name,memory.used,memory.total,utilization.gpu,temperature.gpu --format=csv,noheader
echo ""
echo -e "${PURPLE}📊 Детальное использование VRAM:${NC}"
nvidia-smi
else
echo -e "${RED}❌ NVIDIA GPU не найден или драйверы не установлены${NC}"
fi
}
show_recommendations() {
echo -e "${BLUE}🎯 Рекомендации по моделям для RTX 2060 (6GB VRAM):${NC}"
echo ""
echo -e "${GREEN}🥇 ЛУЧШИЙ ВЫБОР:${NC}"
echo " • llama3.2:3b (2GB VRAM) - оптимальный баланс скорости и качества"
echo ""
echo -e "${YELLOW}🥈 БЫСТРЫЕ МОДЕЛИ:${NC}"
echo " • llama3.2:1b (1.3GB VRAM) - максимальная скорость"
echo ""
echo -e "${PURPLE}🥉 СПЕЦИАЛИЗИРОВАННЫЕ:${NC}"
echo " • codellama:7b (3.8GB VRAM) - для программирования"
echo " • mistral:7b (4.1GB VRAM) - высокое качество (почти предел)"
echo ""
echo -e "${RED}НЕ РЕКОМЕНДУЕТСЯ:${NC}"
echo " • llama3:8b - требует 8GB+ VRAM"
echo " • llama3:70b - требует 40GB+ VRAM"
echo " • codellama:34b - требует 20GB+ VRAM"
echo ""
echo -e "${CYAN}💡 СОВЕТЫ:${NC}"
echo " • Не устанавливайте много больших моделей одновременно"
echo " • Мониторьте температуру GPU (ai-status)"
echo " • При перегреве используйте меньшие модели"
echo " • Для продакшена рекомендуется llama3.2:3b"
}
# Основной цикл
main() {
while true; do
show_menu
echo -e "${YELLOW}Выберите опцию (1-8):${NC}"
read -r choice
case $choice in
1)
list_models
;;
2)
install_recommended
;;
3)
install_custom
;;
4)
remove_model
;;
5)
test_model
;;
6)
show_vram_usage
;;
7)
show_recommendations
;;
8)
echo -e "${GREEN}👋 До свидания!${NC}"
exit 0
;;
*)
echo -e "${RED}❌ Неверный выбор. Попробуйте снова.${NC}"
;;
esac
echo ""
echo -e "${CYAN}Нажмите Enter для продолжения...${NC}"
read -r
clear
done
}
# Проверка прав
if [[ ! -d "/opt/ai-server" ]]; then
echo -e "${RED}❌ AI Server не установлен. Запустите сначала install-ubuntu.sh${NC}"
exit 1
fi
clear
main

119
scripts/start.sh Normal file
View File

@@ -0,0 +1,119 @@
#!/bin/bash
# AI Server Start Script for Ubuntu
# Optimized for RTX 2060
set -e
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}🚀 Запуск AI Server...${NC}"
# Check if running as root for system services
if [[ $EUID -eq 0 ]]; then
echo -e "${YELLOW}Запуск системных сервисов...${NC}"
# Start Ollama service
echo "🤖 Запуск Ollama..."
systemctl start ollama
# Wait for Ollama to start
sleep 5
# Check Ollama status
if systemctl is-active --quiet ollama; then
echo -e "${GREEN}✅ Ollama запущен${NC}"
else
echo -e "${RED}❌ Ошибка запуска Ollama${NC}"
journalctl -u ollama --no-pager -l | tail -10
exit 1
fi
# Start Web UI service
echo "🌐 Запуск веб-интерфейса..."
systemctl start ai-server-webui
# Wait for containers to start
sleep 10
# Check Web UI status
if systemctl is-active --quiet ai-server-webui; then
echo -e "${GREEN}Веб-интерфейс запущен${NC}"
else
echo -e "${RED}❌ Ошибка запуска веб-интерфейса${NC}"
journalctl -u ai-server-webui --no-pager -l | tail -10
exit 1
fi
else
echo -e "${YELLOW}Запуск пользовательских сервисов...${NC}"
# Change to working directory
cd /opt/ai-server
# Check if Ollama is running
echo "🤖 Проверка Ollama..."
if ! curl -s http://localhost:11434 >/dev/null 2>&1; then
echo -e "${YELLOW}Ollama не отвечает, попытка запуска...${NC}"
sudo systemctl start ollama
sleep 5
# Check again
if ! curl -s http://localhost:11434 >/dev/null 2>&1; then
echo -e "${RED}Не удается запустить Ollama${NC}"
echo "Попробуйте: sudo systemctl status ollama"
exit 1
fi
fi
echo -e "${GREEN}✅ Ollama доступен${NC}"
# Start web interface containers
echo "🌐 Запуск веб-интерфейса..."
docker compose up -d
# Wait for containers
sleep 10
# Check container status
if docker compose ps | grep -q "running"; then
echo -e "${GREEN}Веб-интерфейс запущен${NC}"
else
echo -e "${RED}❌ Ошибка запуска контейнеров${NC}"
docker compose logs --tail=20
exit 1
fi
fi
# Get server IP
SERVER_IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}🎉 AI Server успешно запущен!${NC}"
echo ""
echo -e "${BLUE}📍 Доступные сервисы:${NC}"
echo " 🌐 Веб-интерфейс: http://${SERVER_IP}:3000"
echo " 🤖 Ollama API: http://${SERVER_IP}:11434"
echo " 📊 Portainer: http://${SERVER_IP}:9000 (если включен)"
echo ""
echo -e "${BLUE}💡 GPU информация:${NC}"
if command -v nvidia-smi &> /dev/null; then
nvidia-smi --query-gpu=name,memory.used,memory.total,utilization.gpu --format=csv,noheader,nounits 2>/dev/null | \
awk -F', ' '{printf " GPU: %s\n VRAM: %d/%d MB (%.1f%%)\n Загрузка: %d%%\n", $1, $2, $3, ($2/$3)*100, $4}'
else
echo " ❌ NVIDIA GPU недоступен"
fi
echo ""
echo -e "${YELLOW}📋 Полезные команды:${NC}"
echo " ai-status - проверка статуса"
echo " ai-stop - остановка сервера"
echo " ai-logs - просмотр логов"
echo " ai-models - список моделей"
echo ""
echo -e "${GREEN}Готово к работе! 🎯${NC}"

202
scripts/status.sh Normal file
View File

@@ -0,0 +1,202 @@
#!/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}"

98
scripts/stop.sh Normal file
View File

@@ -0,0 +1,98 @@
#!/bin/bash
# AI Server Stop Script for Ubuntu
set -e
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}⏹️ Остановка AI Server...${NC}"
# Check if running as root for system services
if [[ $EUID -eq 0 ]]; then
echo -e "${YELLOW}Остановка системных сервисов...${NC}"
# Stop Web UI service
echo "🌐 Остановка веб-интерфейса..."
if systemctl is-active --quiet ai-server-webui; then
systemctl stop ai-server-webui
echo -e "${GREEN}Веб-интерфейс остановлен${NC}"
else
echo -e "${YELLOW}⚠️ Веб-интерфейс не был запущен${NC}"
fi
# Stop Ollama service (optional)
read -p "Остановить Ollama сервер? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "🤖 Остановка Ollama..."
systemctl stop ollama
echo -e "${GREEN}✅ Ollama остановлен${NC}"
else
echo -e "${YELLOW}⚠️ Ollama оставлен запущенным${NC}"
fi
else
echo -e "${YELLOW}Остановка пользовательских сервисов...${NC}"
# Change to working directory
cd /opt/ai-server 2>/dev/null || {
echo -e "${RED}Не найдена рабочая директория /opt/ai-server${NC}"
exit 1
}
# Stop web interface containers
echo "🌐 Остановка веб-интерфейса..."
if docker compose ps | grep -q "running"; then
docker compose down
echo -e "${GREEN}✅ Контейнеры остановлены${NC}"
else
echo -e "${YELLOW}⚠️ Контейнеры не были запущены${NC}"
fi
# Optional: Stop Ollama if requested
if systemctl is-active --quiet ollama; then
read -p "Остановить Ollama сервер? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "🤖 Остановка Ollama..."
sudo systemctl stop ollama
echo -e "${GREEN}✅ Ollama остановлен${NC}"
else
echo -e "${YELLOW}⚠️ Ollama оставлен запущенным${NC}"
fi
fi
fi
# Clean up unused Docker resources
echo "🧹 Очистка неиспользуемых ресурсов..."
docker system prune -f >/dev/null 2>&1 || true
# Show final status
echo ""
echo -e "${GREEN}✅ AI Server остановлен!${NC}"
echo ""
echo -e "${BLUE}📊 Текущий статус:${NC}"
# Check Ollama
if systemctl is-active --quiet ollama; then
echo " 🤖 Ollama: запущен"
else
echo " 🤖 Ollama: остановлен"
fi
# Check containers
cd /opt/ai-server 2>/dev/null || exit 0
if docker compose ps 2>/dev/null | grep -q "running"; then
echo " 🌐 Веб-интерфейс: запущен"
else
echo " 🌐 Веб-интерфейс: остановлен"
fi
echo ""
echo -e "${YELLOW}💡 Для запуска используйте: ai-start${NC}"