Add project and deployment instruction (docs/DEPLOYMENT.md)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ars
2026-02-19 18:12:09 +00:00
commit 53c572ef46
94 changed files with 9200 additions and 0 deletions

142
scripts/test_vision.sh Executable file
View File

@@ -0,0 +1,142 @@
#!/bin/bash
# Скрипт для тестирования vision capabilities модели gemma3n:e4b-it-fp16
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
TEST_DIR="$PROJECT_DIR/test_images"
IMAGE_URL="https://yandex-images.clstorage.net/PU5vN2154/532297ZKm/lCuSfyMn0DdbJqcFVeFiB9Ti31Te2dZ1EepiRw3Cs0Qw8cQ1ND5OQRKC1yH4LnhdRtloQ4aXHng5ZSLNmXHy_8k293YSMsBWKnOvYAXBbhPcl6pYmqi-ZGWDazZo2pYkJNHpkJHrg5yiO0bEOIeEICe5cFqrojYgyNQ6mHj4e5IUb_Lri3uxo9fmXv0dMf7f1NvH9J5YVsyhRvvmtD9eTc1QfVxV42d8OotKrLTDfHx7jfDqjpIqHAyt9ngIIHsSjLtOJ7_jTYdHLn4hJWlCj_jj69gGlApIBYaTfoxPrtHFDGlYUd-PjHI3hijAm6hIb-lUFlpOehQAJTbwEGwjcqjjVns323WrR2q6CalVyg9kZ8s0jkBm8OVGr26UH86NHaD1rKnPH6zinwJIKBv8VEdF_FrGLt6QFOVqFOQY776w47YDNy8Biwfefg0lxVaL2E9L5NbAztwh8vuCcMNSEfG8aYQFBxe0Eu9CMPhz1Axz1dgqmkpSYCAR8nSA_GMSKKPa9-tzIUc7ooKthV1ykwSjrzhORKq0eRrvBlTbajF5yAUoVX-7XM7HouyU51xMaxFMBl7atixQFW4o1BznMoi_chuL8_mTO_IKce21CosEQ6Owkkhi9EGSz5pIE56NjURBxKn7pwTKt6K4FB_YYHexZG4qlsIg8GVaiJyIB0p0bx5PF4_FIy-SItWZId5f8M9_RIqg2hRVCqP2hDvSfWGAYUjJd6c8lr9mgGj7kPQbVQBCUgIm1NB9lsxQrIO-wO92fytbOQsjjiqBqa0CK9Qjy6wi6CoIfX5vZjw_pj1BKGm0UVOXuArPFngIN2AUgz3w4mZSTvz8IQYo_IhPVlQ7PiOjhyWD6wZSVZ3NDrvsC-8w4lxmzE32T1qMuy5JOTRxaNHHH0QCp4IkgMv8LH8JeJaOUj4sVOGCBBgQi5KMX74TQzOBW9cGTu35UZr3qAfj5O6kMogxjqNanMOs"
IMAGE_FILE="$TEST_DIR/test_image.jpg"
MODEL="gemma3n:e4b-it-fp16"
echo "=== Тестирование Vision Capabilities модели $MODEL ==="
echo ""
# Определяем команду docker (с sudo или без)
DOCKER_CMD="docker"
if ! docker ps >/dev/null 2>&1; then
DOCKER_CMD="sudo docker"
fi
# Проверка контейнера Ollama
echo "1. Проверка контейнера Ollama..."
if ! $DOCKER_CMD ps --format '{{.Names}}' 2>/dev/null | grep -q "^ollama$"; then
echo " ✗ Ошибка: Контейнер ollama не запущен"
echo " Запустите: docker compose up -d ollama"
exit 1
fi
echo " ✓ Контейнер ollama запущен"
# Проверка модели
echo ""
echo "2. Проверка загруженных моделей..."
MODELS=$($DOCKER_CMD exec ollama ollama list 2>/dev/null)
if echo "$MODELS" | grep -q "$MODEL"; then
echo " ✓ Модель $MODEL найдена"
echo "$MODELS" | grep "$MODEL"
else
echo " ✗ Модель $MODEL не найдена"
echo " Загрузите модель: docker exec ollama ollama pull $MODEL"
exit 1
fi
# Создаем директорию для тестовых изображений
mkdir -p "$TEST_DIR"
cd "$TEST_DIR"
# Скачиваем изображение
echo ""
echo "3. Подготовка тестового изображения..."
if [ ! -f "$IMAGE_FILE" ]; then
echo " Скачиваю изображение..."
curl -L -o "$IMAGE_FILE" "$IMAGE_URL" || {
echo " ✗ Ошибка: не удалось скачать изображение"
exit 1
}
echo " ✓ Изображение скачано: $IMAGE_FILE"
else
echo " ✓ Изображение уже существует: $IMAGE_FILE"
fi
# Проверяем размер файла
if [ -f "$IMAGE_FILE" ]; then
FILE_SIZE=$(stat -c%s "$IMAGE_FILE" 2>/dev/null || stat -f%z "$IMAGE_FILE" 2>/dev/null)
echo " Размер файла: $(numfmt --to=iec-i --suffix=B $FILE_SIZE 2>/dev/null || echo "${FILE_SIZE} bytes")"
# Проверяем тип файла
FILE_TYPE=$(file "$IMAGE_FILE" 2>/dev/null | cut -d: -f2)
echo " Тип файла: $FILE_TYPE"
fi
# Кодируем изображение в base64
echo ""
echo "4. Кодирование изображения в base64..."
IMAGE_B64=$(base64 -w 0 "$IMAGE_FILE" 2>/dev/null || base64 "$IMAGE_FILE" | tr -d '\n')
B64_LENGTH=${#IMAGE_B64}
echo " ✓ Изображение закодировано (длина: $B64_LENGTH символов)"
# Отправляем запрос к Ollama API
echo ""
echo "5. Отправка запроса к Ollama API..."
echo " Модель: $MODEL"
echo " Промпт: Опиши это изображение на русском языке. Что ты видишь на картинке?"
echo ""
# Отправляем запрос через Docker exec к Ollama API
# Используем временный файл для передачи большого base64
echo " Отправка запроса (это может занять некоторое время)..."
TEMP_FILE=$(mktemp)
cat > "$TEMP_FILE" <<EOF
{
"model": "$MODEL",
"prompt": "Опиши это изображение на русском языке. Что ты видишь на картинке?",
"images": ["$IMAGE_B64"],
"stream": false
}
EOF
# Копируем файл в контейнер и отправляем запрос
$DOCKER_CMD cp "$TEMP_FILE" ollama:/tmp/request.json >/dev/null 2>&1
RESPONSE=$($DOCKER_CMD exec ollama sh -c "curl -s --max-time 120 -X POST http://localhost:11434/api/generate \
-H 'Content-Type: application/json' \
-d @/tmp/request.json" 2>&1)
# Удаляем временный файл
rm -f "$TEMP_FILE"
# Проверяем ответ
if echo "$RESPONSE" | grep -q '"response"'; then
echo " ✓ Успешно! Ответ модели:"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# Извлекаем ответ более надежным способом
echo "$RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('response', ''))" 2>/dev/null || \
echo "$RESPONSE" | grep -o '"response":"[^"]*"' | sed 's/"response":"\(.*\)"/\1/' | sed 's/\\n/\n/g' | sed 's/\\"/"/g' | head -20
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "=== ✓ Тест завершен успешно! Vision работает! ==="
elif echo "$RESPONSE" | grep -q "error\|Error\|ERROR"; then
echo " ✗ Ошибка при запросе к API:"
echo "$RESPONSE" | grep -i error || echo "$RESPONSE"
echo ""
echo "Проверьте:"
echo " 1. Логи Ollama: $DOCKER_CMD logs ollama --tail 30"
echo " 2. Поддерживает ли модель vision: $DOCKER_CMD exec ollama ollama show $MODEL"
else
echo " ⚠ Неожиданный ответ от API:"
echo "$RESPONSE"
echo ""
echo "Попробуйте проверить через веб-интерфейс Open WebUI"
fi
echo ""
echo "6. Инструкции для тестирования через веб-интерфейс:"
echo ""
echo " Шаг 1: Откройте Open WebUI: https://odo.iieasy.ru"
echo " Шаг 2: Выберите модель: $MODEL"
echo " Шаг 3: Найдите кнопку загрузки изображения в поле ввода (📎 или 📷)"
echo " Шаг 4: Загрузите изображение: $IMAGE_FILE"
echo " Шаг 5: Задайте вопрос: \"Опиши это изображение на русском языке. Что ты видишь?\""
echo ""
echo "Файл изображения: $IMAGE_FILE"