mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-12-09 00:05:21 +01:00
196 lines
5.8 KiB
Bash
196 lines
5.8 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Test script for IntelliDocs new features in Docker
|
||
|
|
# This script verifies that all ML/OCR dependencies and features are working
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
echo "=========================================="
|
||
|
|
echo "IntelliDocs Feature Test Script"
|
||
|
|
echo "=========================================="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Colors for output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
# Check if docker compose is available
|
||
|
|
if ! command -v docker &> /dev/null; then
|
||
|
|
echo -e "${RED}✗ Docker is not installed${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "${GREEN}✓ Docker is installed${NC}"
|
||
|
|
|
||
|
|
# Check if compose file exists
|
||
|
|
COMPOSE_FILE="compose/docker-compose.intellidocs.yml"
|
||
|
|
if [ ! -f "$COMPOSE_FILE" ]; then
|
||
|
|
echo -e "${RED}✗ Compose file not found: $COMPOSE_FILE${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "${GREEN}✓ Docker compose file found${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 1: Check if containers are running
|
||
|
|
echo "Test 1: Checking if containers are running..."
|
||
|
|
if docker compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
|
||
|
|
echo -e "${GREEN}✓ Containers are running${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}! Containers are not running. Starting them...${NC}"
|
||
|
|
docker compose -f "$COMPOSE_FILE" up -d
|
||
|
|
echo "Waiting 60 seconds for containers to initialize..."
|
||
|
|
sleep 60
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 2: Check Python dependencies
|
||
|
|
echo "Test 2: Checking ML/OCR Python dependencies..."
|
||
|
|
docker compose -f "$COMPOSE_FILE" exec -T webserver python3 << 'PYTHON_EOF'
|
||
|
|
import sys
|
||
|
|
|
||
|
|
errors = []
|
||
|
|
success = []
|
||
|
|
|
||
|
|
# Test torch
|
||
|
|
try:
|
||
|
|
import torch
|
||
|
|
success.append(f"torch {torch.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"torch: {str(e)}")
|
||
|
|
|
||
|
|
# Test transformers
|
||
|
|
try:
|
||
|
|
import transformers
|
||
|
|
success.append(f"transformers {transformers.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"transformers: {str(e)}")
|
||
|
|
|
||
|
|
# Test OpenCV
|
||
|
|
try:
|
||
|
|
import cv2
|
||
|
|
success.append(f"opencv {cv2.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"opencv: {str(e)}")
|
||
|
|
|
||
|
|
# Test sentence-transformers
|
||
|
|
try:
|
||
|
|
import sentence_transformers
|
||
|
|
success.append(f"sentence-transformers {sentence_transformers.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"sentence-transformers: {str(e)}")
|
||
|
|
|
||
|
|
# Test pandas
|
||
|
|
try:
|
||
|
|
import pandas
|
||
|
|
success.append(f"pandas {pandas.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"pandas: {str(e)}")
|
||
|
|
|
||
|
|
# Test numpy
|
||
|
|
try:
|
||
|
|
import numpy
|
||
|
|
success.append(f"numpy {numpy.__version__}")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"numpy: {str(e)}")
|
||
|
|
|
||
|
|
# Test PIL
|
||
|
|
try:
|
||
|
|
from PIL import Image
|
||
|
|
success.append("pillow (PIL)")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"pillow: {str(e)}")
|
||
|
|
|
||
|
|
# Test pytesseract
|
||
|
|
try:
|
||
|
|
import pytesseract
|
||
|
|
success.append("pytesseract")
|
||
|
|
except ImportError as e:
|
||
|
|
errors.append(f"pytesseract: {str(e)}")
|
||
|
|
|
||
|
|
for s in success:
|
||
|
|
print(f"✓ {s}")
|
||
|
|
|
||
|
|
if errors:
|
||
|
|
print("\nErrors:")
|
||
|
|
for e in errors:
|
||
|
|
print(f"✗ {e}")
|
||
|
|
sys.exit(1)
|
||
|
|
else:
|
||
|
|
print("\n✓ All dependencies installed correctly!")
|
||
|
|
sys.exit(0)
|
||
|
|
PYTHON_EOF
|
||
|
|
|
||
|
|
if [ $? -eq 0 ]; then
|
||
|
|
echo -e "${GREEN}✓ All Python dependencies are available${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}✗ Some Python dependencies are missing${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 3: Check if ML modules exist
|
||
|
|
echo "Test 3: Checking ML/OCR module files..."
|
||
|
|
for module in "documents/ml/classifier.py" "documents/ml/ner.py" "documents/ml/semantic_search.py" "documents/ocr/table_extractor.py" "documents/ocr/handwriting.py" "documents/ocr/form_detector.py"; do
|
||
|
|
if docker compose -f "$COMPOSE_FILE" exec -T webserver test -f "/usr/src/paperless/src/$module"; then
|
||
|
|
echo -e "${GREEN}✓ $module exists${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}✗ $module not found${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 4: Check Redis connection
|
||
|
|
echo "Test 4: Checking Redis connection..."
|
||
|
|
if docker compose -f "$COMPOSE_FILE" exec -T broker redis-cli ping | grep -q "PONG"; then
|
||
|
|
echo -e "${GREEN}✓ Redis is responding${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}✗ Redis is not responding${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 5: Check if webserver is responding
|
||
|
|
echo "Test 5: Checking if webserver is responding..."
|
||
|
|
if docker compose -f "$COMPOSE_FILE" exec -T webserver curl -f -s http://localhost:8000 > /dev/null; then
|
||
|
|
echo -e "${GREEN}✓ Webserver is responding${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}! Webserver is not responding yet (may still be initializing)${NC}"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 6: Check environment variables
|
||
|
|
echo "Test 6: Checking ML/OCR environment variables..."
|
||
|
|
docker compose -f "$COMPOSE_FILE" exec -T webserver bash << 'BASH_EOF'
|
||
|
|
echo "PAPERLESS_ENABLE_ML_FEATURES=${PAPERLESS_ENABLE_ML_FEATURES:-not set}"
|
||
|
|
echo "PAPERLESS_ENABLE_ADVANCED_OCR=${PAPERLESS_ENABLE_ADVANCED_OCR:-not set}"
|
||
|
|
echo "PAPERLESS_ML_CLASSIFIER_MODEL=${PAPERLESS_ML_CLASSIFIER_MODEL:-not set}"
|
||
|
|
echo "PAPERLESS_USE_GPU=${PAPERLESS_USE_GPU:-not set}"
|
||
|
|
BASH_EOF
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 7: Check ML model cache
|
||
|
|
echo "Test 7: Checking ML model cache..."
|
||
|
|
docker compose -f "$COMPOSE_FILE" exec -T webserver ls -lah /usr/src/paperless/.cache/ || echo -e "${YELLOW}! ML cache directory may not be initialized yet${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test 8: Check system resources
|
||
|
|
echo "Test 8: Checking system resources..."
|
||
|
|
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" $(docker compose -f "$COMPOSE_FILE" ps -q)
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo "=========================================="
|
||
|
|
echo -e "${GREEN}✓ All tests completed successfully!${NC}"
|
||
|
|
echo "=========================================="
|
||
|
|
echo ""
|
||
|
|
echo "Next steps:"
|
||
|
|
echo "1. Access IntelliDocs at: http://localhost:8000"
|
||
|
|
echo "2. Create a superuser: docker compose -f $COMPOSE_FILE exec webserver python manage.py createsuperuser"
|
||
|
|
echo "3. Upload a test document to try the new ML/OCR features"
|
||
|
|
echo "4. Check logs: docker compose -f $COMPOSE_FILE logs -f webserver"
|
||
|
|
echo ""
|
||
|
|
echo "For more information, see: DOCKER_SETUP_INTELLIDOCS.md"
|
||
|
|
echo ""
|