navidocs/docs/TROUBLESHOOTING.md
ggq-admin 4b91896838 feat: Add image extraction design, database schema, and migration
- Comprehensive image extraction architecture design
- Database schema for document_images table
- Migration 004: Add document_images table with indexes
- Migration runner script
- Design and status documentation

Prepares foundation for image extraction feature with OCR on images.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 19:47:30 +02:00

2579 lines
57 KiB
Markdown

# NaviDocs Troubleshooting Guide
**Last Updated:** 2025-10-19
**Version:** 1.0
This guide covers common issues, diagnosis steps, and solutions for NaviDocs deployment and operation.
---
## Table of Contents
1. [Common Issues](#1-common-issues)
2. [Service-Specific Troubleshooting](#2-service-specific-troubleshooting)
3. [Network & WSL2 Issues](#3-network--wsl2-issues)
4. [Performance Issues](#4-performance-issues)
5. [Data Issues](#5-data-issues)
6. [Quick Reference Commands](#6-quick-reference-commands)
---
## 1. Common Issues
### 1.1 Services Won't Start
#### Symptoms
- Start script exits with errors
- Services immediately crash after starting
- "Address already in use" errors
- Services start but become unresponsive
#### Diagnosis Steps
**Step 1: Check if ports are already in use**
```bash
# Check all NaviDocs ports
ss -tlnp | grep -E ":(6379|7700|8001|8080)"
# Or use lsof (more detailed)
lsof -i :6379 # Redis
lsof -i :7700 # Meilisearch
lsof -i :8001 # Backend API
lsof -i :8080 # Frontend
```
**Step 2: Check if services are running**
```bash
# Check all node processes
ps aux | grep node
# Check Docker containers
docker ps -a | grep meilisearch
# Check Redis
redis-cli ping
```
**Step 3: Review log files**
```bash
# Check recent backend logs
tail -50 /tmp/navidocs-backend.log
# Check OCR worker logs
tail -50 /tmp/navidocs-ocr-worker.log
# Check frontend logs
tail -50 /tmp/navidocs-frontend.log
```
#### Solutions
**Solution 1: Kill conflicting processes**
```bash
# Kill backend
pkill -f "navidocs.*index.js"
# Kill OCR worker
pkill -f "ocr-worker"
# Kill frontend
pkill -f "vite.*8080"
# Kill process on specific port
lsof -ti:8001 | xargs kill -9
```
**Solution 2: Clean restart**
```bash
# Stop everything
/home/setup/navidocs/stop-all.sh
# Wait 5 seconds
sleep 5
# Verify all processes stopped
ps aux | grep -E "navidocs|vite|ocr-worker"
# Start fresh
/home/setup/navidocs/start-all.sh
```
**Solution 3: Check environment variables**
```bash
# Verify .env file exists
cat /home/setup/navidocs/server/.env
# Verify critical variables are set
grep -E "PORT|MEILISEARCH|REDIS|DATABASE" /home/setup/navidocs/server/.env
```
**Solution 4: Check file permissions**
```bash
# Ensure upload directory exists and is writable
ls -ld /home/setup/navidocs/server/uploads
mkdir -p /home/setup/navidocs/server/uploads
chmod 755 /home/setup/navidocs/server/uploads
# Ensure database directory is writable
ls -ld /home/setup/navidocs/server/db
chmod 755 /home/setup/navidocs/server/db
```
#### Prevention Tips
- Always use `stop-all.sh` before starting services again
- Monitor disk space regularly
- Review logs after each startup
- Use `ss -tlnp` before starting to verify ports are free
#### Related Logs
- `/tmp/navidocs-backend.log` - Backend startup errors
- `/tmp/navidocs-ocr-worker.log` - Worker initialization errors
- `/tmp/navidocs-frontend.log` - Vite dev server errors
---
### 1.2 Port Conflicts
#### Symptoms
- Error: "EADDRINUSE: address already in use"
- Services fail to bind to ports
- Multiple instances running simultaneously
#### Diagnosis Steps
```bash
# Identify what's using the port
lsof -i :8001
netstat -tlnp | grep 8001
# Check all NaviDocs ports
ss -tlnp | grep -E ":(6379|7700|8001|8080)"
```
#### Solutions
**Solution 1: Kill the conflicting process**
```bash
# Find and kill by port
lsof -ti:8001 | xargs kill -9
# Or kill by process name
pkill -f "navidocs.*index.js"
```
**Solution 2: Change the port in .env**
```bash
# Edit the .env file
nano /home/setup/navidocs/server/.env
# Change PORT to a free port (e.g., 8002)
PORT=8002
# Update Vite proxy config
nano /home/setup/navidocs/client/vite.config.js
# Change target: 'http://localhost:8002'
```
**Solution 3: Stop all Node processes (nuclear option)**
```bash
# Warning: This will kill ALL Node.js processes on the system
pkill node
# Verify all stopped
ps aux | grep node
# Restart only NaviDocs
/home/setup/navidocs/start-all.sh
```
#### Prevention Tips
- Use consistent start/stop scripts
- Avoid Ctrl+C on start-all.sh (let it complete)
- Check ports before starting: `ss -tlnp | grep -E ":(6379|7700|8001|8080)"`
#### Related Logs
- `/tmp/navidocs-backend.log` - Look for "EADDRINUSE" errors
- `/tmp/navidocs-frontend.log` - Vite port binding errors
---
### 1.3 Database Locked
#### Symptoms
- "database is locked" errors
- Uploads fail with database errors
- Job status updates fail
- Long-running queries timeout
#### Diagnosis Steps
**Step 1: Check for active connections**
```bash
# Check if backend/worker are running
ps aux | grep -E "navidocs|ocr-worker"
# Check SQLite WAL files (indicates active writes)
ls -lh /home/setup/navidocs/server/db/*.wal
ls -lh /home/setup/navidocs/server/db/*.shm
```
**Step 2: Check database integrity**
```bash
# Open database and check
sqlite3 /home/setup/navidocs/server/db/navidocs.db "PRAGMA integrity_check;"
# Check for locks
sqlite3 /home/setup/navidocs/server/db/navidocs.db "PRAGMA locking_mode;"
```
**Step 3: Review error logs**
```bash
# Look for database errors
grep -i "database" /tmp/navidocs-backend.log
grep -i "locked" /tmp/navidocs-*.log
```
#### Solutions
**Solution 1: Close all connections and restart**
```bash
# Stop all services
/home/setup/navidocs/stop-all.sh
# Wait for connections to close
sleep 5
# Verify WAL files are gone or small
ls -lh /home/setup/navidocs/server/db/
# Restart services
/home/setup/navidocs/start-all.sh
```
**Solution 2: Checkpoint the WAL file**
```bash
# Stop services first
/home/setup/navidocs/stop-all.sh
# Checkpoint the WAL
sqlite3 /home/setup/navidocs/server/db/navidocs.db "PRAGMA wal_checkpoint(TRUNCATE);"
# Restart services
/home/setup/navidocs/start-all.sh
```
**Solution 3: Increase timeout (for long-running operations)**
```bash
# Edit db/db.js to increase busy timeout
# The default is usually 5000ms (5 seconds)
# Temporary workaround: reduce concurrent OCR jobs
nano /home/setup/navidocs/server/.env
# Add or modify:
OCR_CONCURRENCY=1
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 4: Recover from corrupted database (last resort)**
```bash
# Stop all services
/home/setup/navidocs/stop-all.sh
# Backup current database
cp /home/setup/navidocs/server/db/navidocs.db \
/home/setup/navidocs/server/db/navidocs-backup-$(date +%Y%m%d-%H%M%S).db
# Try to repair
sqlite3 /home/setup/navidocs/server/db/navidocs.db ".recover" | \
sqlite3 /home/setup/navidocs/server/db/navidocs-recovered.db
# If successful, replace
mv /home/setup/navidocs/server/db/navidocs.db \
/home/setup/navidocs/server/db/navidocs-corrupted.db
mv /home/setup/navidocs/server/db/navidocs-recovered.db \
/home/setup/navidocs/server/db/navidocs.db
# Restart services
/home/setup/navidocs/start-all.sh
```
#### Prevention Tips
- Don't run multiple backend instances
- Set `OCR_CONCURRENCY=2` or lower for large documents
- Enable WAL mode (should be default): `PRAGMA journal_mode=WAL;`
- Regular database backups
- Monitor database file size
#### Related Logs
- `/tmp/navidocs-backend.log` - Database lock errors during API calls
- `/tmp/navidocs-ocr-worker.log` - Database lock errors during OCR processing
---
### 1.4 Meilisearch Authentication Errors
#### Symptoms
- "Invalid API key" errors
- Search returns 401/403 errors
- Token generation fails
- Frontend can't connect to search
#### Diagnosis Steps
**Step 1: Verify Meilisearch is running**
```bash
# Check Docker container
docker ps | grep meilisearch
# Check health endpoint
curl http://localhost:7700/health
```
**Step 2: Test authentication**
```bash
# Test with master key from .env
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes
```
**Step 3: Check environment configuration**
```bash
# Verify master key matches in .env and Docker
grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env
# Check what key Docker container is using
docker inspect boat-manuals-meilisearch | grep MEILI_MASTER_KEY
```
#### Solutions
**Solution 1: Verify and sync keys**
```bash
# Get key from .env
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Test it works
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes
# If not, check Docker container environment
docker inspect boat-manuals-meilisearch | grep MEILI_MASTER_KEY
```
**Solution 2: Recreate Meilisearch container with correct key**
```bash
# Stop and remove existing container
docker stop boat-manuals-meilisearch
docker rm boat-manuals-meilisearch
# Get master key from .env
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Create new container with correct key
docker run -d \
--name boat-manuals-meilisearch \
-p 7700:7700 \
-e MEILI_MASTER_KEY="$MASTER_KEY" \
-e MEILI_ENV=development \
-e MEILI_NO_ANALYTICS=true \
-v meilisearch_data:/meili_data \
getmeili/meilisearch:v1.6
# Wait for it to start
sleep 3
# Restart backend to reinitialize index
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
```
**Solution 3: Generate new master key and update everywhere**
```bash
# Generate new key
NEW_KEY=$(openssl rand -base64 32)
echo "New master key: $NEW_KEY"
# Update .env
nano /home/setup/navidocs/server/.env
# Change MEILISEARCH_MASTER_KEY=<new-key>
# Recreate container
docker stop boat-manuals-meilisearch
docker rm boat-manuals-meilisearch
docker run -d \
--name boat-manuals-meilisearch \
-p 7700:7700 \
-e MEILI_MASTER_KEY="$NEW_KEY" \
-e MEILI_ENV=development \
-e MEILI_NO_ANALYTICS=true \
-v meilisearch_data:/meili_data \
getmeili/meilisearch:v1.6
# Restart backend
/home/setup/navidocs/stop-all.sh
/home/setup/navidocs/start-all.sh
```
**Solution 4: Check for tenant token generation issues**
```bash
# Test search token endpoint
curl -X POST http://localhost:8001/api/search/token \
-H "Content-Type: application/json" \
-d '{"expiresIn": 3600}'
# Check backend logs for token generation errors
grep -i "tenant.*token" /tmp/navidocs-backend.log
```
#### Prevention Tips
- Keep master key consistent between .env and Docker
- Never expose master key in client-side code
- Use tenant tokens for frontend search
- Regularly rotate keys in production
- Document key rotation procedure
#### Related Logs
- `/tmp/navidocs-backend.log` - Token generation errors, Meilisearch connection errors
- Docker logs: `docker logs boat-manuals-meilisearch`
---
### 1.5 Search Not Working
#### Symptoms
- Search returns no results
- Search returns 404 or 500 errors
- Index not found errors
- Results don't match expected documents
#### Diagnosis Steps
**Step 1: Verify Meilisearch is accessible**
```bash
# Check health
curl http://localhost:7700/health
# Check indexes exist
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes
```
**Step 2: Check if documents are indexed**
```bash
# Get document count in index
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/stats
# List some documents
curl -H "Authorization: Bearer $MASTER_KEY" \
"http://localhost:7700/indexes/navidocs-pages/documents?limit=5"
```
**Step 3: Test search directly**
```bash
# Test search with master key
curl -X POST \
-H "Authorization: Bearer $MASTER_KEY" \
-H "Content-Type: application/json" \
http://localhost:7700/indexes/navidocs-pages/search \
-d '{"q":"test","limit":5}'
```
**Step 4: Check database for indexed pages**
```bash
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT COUNT(*) as indexed_pages FROM document_pages WHERE search_indexed_at IS NOT NULL;"
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT COUNT(*) as total_pages FROM document_pages;"
```
#### Solutions
**Solution 1: Reindex all documents**
```bash
# This requires creating a reindexing script or doing it manually
# Check which documents are indexed
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT d.id, d.title, d.status, COUNT(p.id) as pages
FROM documents d
LEFT JOIN document_pages p ON d.id = p.document_id
GROUP BY d.id;"
# If pages exist but aren't in Meilisearch, you may need to reprocess OCR jobs
# or trigger re-indexing via the API
```
**Solution 2: Recreate the index**
```bash
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Delete existing index
curl -X DELETE \
-H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages
# Restart backend to auto-create and configure index
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
# Wait for index creation
sleep 3
# Check logs
tail -20 /tmp/navidocs-backend.log
```
**Solution 3: Check index configuration**
```bash
# Get current settings
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/settings
# Verify searchable attributes include 'text', 'title'
# Verify filterable attributes include 'userId', 'organizationId'
```
**Solution 4: Test with backend API endpoint**
```bash
# Use the backend search endpoint (server-side)
curl -X POST http://localhost:8001/api/search \
-H "Content-Type: application/json" \
-d '{
"q": "test",
"limit": 10
}'
```
#### Prevention Tips
- Monitor index stats after uploads
- Set up health checks for search endpoint
- Test search after each upload
- Keep Meilisearch version consistent
- Back up Meilisearch data volume
#### Related Logs
- `/tmp/navidocs-backend.log` - Search API errors
- `/tmp/navidocs-ocr-worker.log` - Indexing errors during OCR
- Docker logs: `docker logs boat-manuals-meilisearch`
---
### 1.6 Upload Failures
#### Symptoms
- File upload returns 400/500 errors
- Upload progress stalls
- Files uploaded but not processed
- "No file uploaded" error despite selecting file
#### Diagnosis Steps
**Step 1: Check file and request validity**
```bash
# Test upload with curl
curl -X POST http://localhost:8001/api/upload \
-F "file=@/path/to/test.pdf" \
-F "title=Test Document" \
-F "documentType=owner-manual" \
-F "organizationId=test-org-id"
```
**Step 2: Check upload directory**
```bash
# Verify directory exists and is writable
ls -ld /home/setup/navidocs/server/uploads
ls -lh /home/setup/navidocs/server/uploads
# Check disk space
df -h /home/setup/navidocs/server/uploads
```
**Step 3: Check file size limits**
```bash
# Check max file size in .env
grep MAX_FILE_SIZE /home/setup/navidocs/server/.env
# Check actual file size
ls -lh your-file.pdf
```
**Step 4: Review upload logs**
```bash
# Check backend logs for upload errors
grep -i "upload" /tmp/navidocs-backend.log | tail -20
# Look for specific error messages
grep -E "Upload error|file.*error|validation.*failed" /tmp/navidocs-backend.log
```
#### Solutions
**Solution 1: Fix upload directory permissions**
```bash
# Ensure directory exists
mkdir -p /home/setup/navidocs/server/uploads
# Set correct permissions
chmod 755 /home/setup/navidocs/server/uploads
chown -R $USER:$USER /home/setup/navidocs/server/uploads
# Verify
ls -ld /home/setup/navidocs/server/uploads
```
**Solution 2: Increase file size limit**
```bash
# Edit .env
nano /home/setup/navidocs/server/.env
# Change or add:
MAX_FILE_SIZE=104857600 # 100MB
# Also check Express body limit in index.js (default is 10mb)
# You may need to increase it for very large files
# Restart backend
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
```
**Solution 3: Verify file type and validation**
```bash
# Check if file is actually a PDF
file your-document.pdf
# Should output: "PDF document, version X.X"
# If file is corrupted, try opening with PDF viewer first
# Valid file types in .env:
grep ALLOWED_MIME_TYPES /home/setup/navidocs/server/.env
```
**Solution 4: Check database connectivity**
```bash
# Ensure database is accessible
sqlite3 /home/setup/navidocs/server/db/navidocs.db "SELECT COUNT(*) FROM documents;"
# Check if database is locked
sqlite3 /home/setup/navidocs/server/db/navidocs.db "PRAGMA integrity_check;"
```
**Solution 5: Clear failed uploads**
```bash
# Remove orphaned files from uploads directory
cd /home/setup/navidocs/server/uploads
# List files
ls -lh
# Compare with database
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT file_name FROM documents WHERE status != 'deleted';"
# Remove orphaned files (manually review first!)
```
#### Prevention Tips
- Monitor disk space: `df -h`
- Set appropriate file size limits
- Validate files before upload (client-side)
- Test with small PDFs first
- Keep upload directory clean
- Monitor for failed uploads and clean up
#### Related Logs
- `/tmp/navidocs-backend.log` - Upload endpoint errors, validation failures
- Check line 165-180 of routes/upload.js for error handling
---
### 1.7 OCR Job Failures
#### Symptoms
- Jobs stuck in "processing" status
- Jobs marked as "failed" with errors
- OCR worker crashes
- No text extracted from PDFs
#### Diagnosis Steps
**Step 1: Check job status in database**
```bash
# List recent jobs
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, status, progress, error, created_at
FROM ocr_jobs
ORDER BY created_at DESC
LIMIT 10;"
# Check specific job
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT * FROM ocr_jobs WHERE id='<job-id>';"
```
**Step 2: Check worker status**
```bash
# Check if worker is running
ps aux | grep ocr-worker
# Check worker logs
tail -50 /tmp/navidocs-ocr-worker.log
```
**Step 3: Check Redis queue**
```bash
# Connect to Redis
redis-cli
# Check queue length
LLEN bull:ocr-processing:wait
# Check failed jobs
LLEN bull:ocr-processing:failed
# Exit Redis
exit
```
**Step 4: Check if PDF files exist**
```bash
# Get file path from database
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, file_path, status FROM documents WHERE id='<document-id>';"
# Check if file exists
ls -lh /home/setup/navidocs/server/uploads/<document-id>.pdf
```
#### Solutions
**Solution 1: Restart OCR worker**
```bash
# Kill existing worker
pkill -f "ocr-worker"
# Start new worker
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
# Monitor logs
tail -f /tmp/navidocs-ocr-worker.log
```
**Solution 2: Clear stuck jobs from Redis**
```bash
redis-cli
# List failed jobs
LRANGE bull:ocr-processing:failed 0 -1
# Clear failed jobs (WARNING: This removes all failed jobs)
DEL bull:ocr-processing:failed
# Clear waiting jobs if stuck
DEL bull:ocr-processing:wait
exit
```
**Solution 3: Reset job status and retry**
```bash
# Update job status to pending
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE ocr_jobs
SET status='pending', progress=0, error=NULL, started_at=NULL
WHERE id='<job-id>';"
# Update document status
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE documents
SET status='processing'
WHERE id='<document-id>';"
# Restart worker to pick up pending jobs
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 4: Check Tesseract installation (if using Tesseract OCR)**
```bash
# Check if Tesseract is installed
tesseract --version
# Check language data
tesseract --list-langs
# If English not listed, install:
# Ubuntu/Debian: sudo apt-get install tesseract-ocr-eng
# macOS: brew install tesseract-lang
```
**Solution 5: Reduce concurrency for problematic PDFs**
```bash
# Edit .env
nano /home/setup/navidocs/server/.env
# Set lower concurrency
OCR_CONCURRENCY=1
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 6: Manual job debugging**
```bash
# Get job details
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT j.id as job_id, j.status, j.error, d.id as doc_id, d.file_path, d.page_count
FROM ocr_jobs j
JOIN documents d ON j.document_id = d.id
WHERE j.id='<job-id>';"
# Check if file is readable
file <file-path>
# Try to process manually (advanced)
# This would require running OCR extraction code directly
```
#### Prevention Tips
- Monitor worker health regularly
- Set reasonable concurrency limits
- Test with small PDFs first
- Monitor Redis queue depth
- Keep Tesseract/OCR dependencies updated
- Set job timeout limits
- Implement retry logic with exponential backoff
#### Related Logs
- `/tmp/navidocs-ocr-worker.log` - Worker processing errors, OCR failures
- Redis logs (if configured)
- Check worker code: `/home/setup/navidocs/server/workers/ocr-worker.js`
---
### 1.8 PDF Viewing Issues
#### Symptoms
- PDF viewer shows blank page
- "Failed to load PDF" error
- PDF downloads instead of viewing inline
- Viewer freezes or crashes
#### Diagnosis Steps
**Step 1: Verify PDF file exists and is accessible**
```bash
# Get document info
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, file_path, file_name, status FROM documents WHERE id='<document-id>';"
# Check if file exists
ls -lh <file-path>
# Verify it's a valid PDF
file <file-path>
```
**Step 2: Test PDF endpoint directly**
```bash
# Test PDF serving endpoint
curl -I http://localhost:8001/api/documents/<document-id>/pdf
# Should return 200 with Content-Type: application/pdf
# Download to test
curl http://localhost:8001/api/documents/<document-id>/pdf > test.pdf
# Try to open test.pdf
```
**Step 3: Check browser console**
```
# Open browser DevTools (F12)
# Look for:
# - CORS errors
# - 404/403 errors
# - PDF.js errors
# - Network errors
```
**Step 4: Check Content-Security-Policy**
```bash
# Check if CSP is blocking PDF
curl -I http://localhost:8001/api/documents/<document-id>/pdf
# Look for Content-Security-Policy header
```
#### Solutions
**Solution 1: Verify file path and permissions**
```bash
# Get file path from database
FILE_PATH=$(sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT file_path FROM documents WHERE id='<document-id>';" | tr -d '\n')
echo "File path: $FILE_PATH"
# Check if file exists and is readable
ls -lh "$FILE_PATH"
# Make readable if needed
chmod 644 "$FILE_PATH"
```
**Solution 2: Fix CORS for PDF serving**
```bash
# CORS should already be configured in index.js
# But verify frontend can access backend
# Test from browser console:
# fetch('http://localhost:8001/api/documents/<id>/pdf')
# .then(r => console.log(r.status))
```
**Solution 3: Check PDF.js worker configuration**
```bash
# In frontend, verify PDF.js worker is loaded
# Check: client/src/components/DocumentViewer.vue or similar
# Worker should be configured like:
# import * as pdfjsLib from 'pdfjs-dist'
# pdfjsLib.GlobalWorkerOptions.workerSrc = ...
```
**Solution 4: Verify Content-Disposition header**
```bash
# Check that PDF is served inline, not as attachment
curl -I http://localhost:8001/api/documents/<document-id>/pdf | grep Content-Disposition
# Should show: Content-Disposition: inline; filename="..."
# NOT: Content-Disposition: attachment
```
**Solution 5: Test with simple PDF**
```bash
# Create a minimal test PDF
echo "Test" | ps2pdf - test.pdf
# Upload it and try viewing
# If this works, original PDF may be corrupted or too complex
```
**Solution 6: Clear browser cache**
```
# In browser:
# 1. Open DevTools (F12)
# 2. Right-click refresh button
# 3. Select "Empty Cache and Hard Reload"
# Or clear all cached data for localhost:8080
```
#### Prevention Tips
- Test PDFs in multiple browsers
- Validate PDFs before upload
- Monitor PDF file sizes
- Keep PDF.js library updated
- Test with various PDF versions (1.4, 1.5, 1.6, 1.7)
- Implement progressive loading for large PDFs
#### Related Logs
- `/tmp/navidocs-backend.log` - PDF serving errors
- Browser DevTools Console - Client-side rendering errors
- Browser DevTools Network tab - PDF loading issues
---
## 2. Service-Specific Troubleshooting
### 2.1 Redis Issues
#### Common Problems
**Problem 1: Redis not running**
**Symptoms:**
- "Error: connect ECONNREFUSED 127.0.0.1:6379"
- Job queue fails to initialize
- OCR worker won't start
**Diagnosis:**
```bash
# Check if Redis is running
redis-cli ping
# Check process
ps aux | grep redis
# Check if port 6379 is listening
ss -tlnp | grep 6379
```
**Solution:**
```bash
# Start Redis
redis-server --daemonize yes
# Or via systemctl (if installed as service)
sudo systemctl start redis-server
sudo systemctl enable redis-server
# Verify
redis-cli ping
# Should return: PONG
```
---
**Problem 2: Redis memory issues**
**Symptoms:**
- "OOM command not allowed when used memory > 'maxmemory'"
- Jobs fail to queue
- Slow performance
**Diagnosis:**
```bash
# Check memory usage
redis-cli INFO memory
# Check max memory setting
redis-cli CONFIG GET maxmemory
```
**Solution:**
```bash
# Increase max memory (example: 256MB)
redis-cli CONFIG SET maxmemory 256mb
# Or clear all data (WARNING: Clears all queues!)
redis-cli FLUSHALL
# Set eviction policy
redis-cli CONFIG SET maxmemory-policy allkeys-lru
```
---
**Problem 3: Too many pending jobs**
**Diagnosis:**
```bash
redis-cli
# Check queue lengths
LLEN bull:ocr-processing:wait
LLEN bull:ocr-processing:active
LLEN bull:ocr-processing:completed
LLEN bull:ocr-processing:failed
exit
```
**Solution:**
```bash
redis-cli
# Clear completed jobs
DEL bull:ocr-processing:completed
# Clear failed jobs (review first!)
DEL bull:ocr-processing:failed
# Clear waiting jobs (only if you want to cancel them!)
DEL bull:ocr-processing:wait
exit
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
---
### 2.2 Meilisearch Issues
#### Common Problems
**Problem 1: Container won't start**
**Symptoms:**
- `docker start boat-manuals-meilisearch` fails
- Port 7700 not accessible
- Container exits immediately
**Diagnosis:**
```bash
# Check container status
docker ps -a | grep meilisearch
# Check container logs
docker logs boat-manuals-meilisearch
# Check if port is in use
lsof -i :7700
```
**Solution:**
```bash
# Stop and remove container
docker stop boat-manuals-meilisearch
docker rm boat-manuals-meilisearch
# Get master key
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Recreate container
docker run -d \
--name boat-manuals-meilisearch \
-p 7700:7700 \
-e MEILI_MASTER_KEY="$MASTER_KEY" \
-e MEILI_ENV=development \
-e MEILI_NO_ANALYTICS=true \
-v meilisearch_data:/meili_data \
getmeili/meilisearch:v1.6
# Wait and verify
sleep 3
curl http://localhost:7700/health
```
---
**Problem 2: Index configuration lost**
**Symptoms:**
- Search doesn't filter correctly
- Can't search on expected fields
- Wrong ranking results
**Diagnosis:**
```bash
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Check current settings
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/settings
```
**Solution:**
```bash
# Restart backend to reconfigure index
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
# Check logs for "Meilisearch index configured"
grep -i "meilisearch.*configured" /tmp/navidocs-backend.log
# Or manually apply configuration from
# /home/setup/navidocs/docs/architecture/meilisearch-config.json
```
---
**Problem 3: Data volume issues**
**Diagnosis:**
```bash
# Check Docker volumes
docker volume ls | grep meilisearch
# Inspect volume
docker volume inspect meilisearch_data
```
**Solution (Backup and reset):**
```bash
# Stop container
docker stop boat-manuals-meilisearch
# Backup volume
docker run --rm \
-v meilisearch_data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/meilisearch-backup-$(date +%Y%m%d).tar.gz /data
# Remove and recreate (if corrupted)
docker rm boat-manuals-meilisearch
docker volume rm meilisearch_data
# Start fresh
/home/setup/navidocs/start-all.sh
```
---
### 2.3 Backend API Issues
#### Common Problems
**Problem 1: API returns 500 errors**
**Diagnosis:**
```bash
# Check if backend is running
ps aux | grep "navidocs.*index.js"
# Check recent logs
tail -50 /tmp/navidocs-backend.log
# Test health endpoint
curl http://localhost:8001/health
```
**Solution:**
```bash
# Restart backend
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
# Monitor startup
tail -f /tmp/navidocs-backend.log
# Verify health
curl http://localhost:8001/health
```
---
**Problem 2: CORS errors from frontend**
**Symptoms:**
- Browser console shows CORS errors
- API calls blocked by browser
- "Access-Control-Allow-Origin" errors
**Diagnosis:**
```bash
# Test CORS headers
curl -I -H "Origin: http://localhost:8080" \
http://localhost:8001/health
# Look for Access-Control-Allow-Origin header
```
**Solution:**
```bash
# CORS is configured in server/index.js
# For development, it should allow all origins
# Verify .env has development mode
grep NODE_ENV /home/setup/navidocs/server/.env
# Should be: NODE_ENV=development
# If changed, restart backend
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
```
---
**Problem 3: Rate limiting blocking requests**
**Symptoms:**
- "Too many requests" errors
- 429 status codes
- Legitimate requests blocked
**Diagnosis:**
```bash
# Check rate limit settings
grep RATE_LIMIT /home/setup/navidocs/server/.env
```
**Solution:**
```bash
# Temporarily increase limits (for development)
nano /home/setup/navidocs/server/.env
# Modify:
RATE_LIMIT_WINDOW_MS=900000 # 15 minutes
RATE_LIMIT_MAX_REQUESTS=1000 # Increase from 100 to 1000
# Restart backend
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
```
---
### 2.4 OCR Worker Issues
#### Common Problems
**Problem 1: Worker exits immediately**
**Diagnosis:**
```bash
# Check if worker process exists
ps aux | grep ocr-worker
# Check recent logs
tail -50 /tmp/navidocs-ocr-worker.log
# Look for initialization errors
grep -i error /tmp/navidocs-ocr-worker.log
```
**Solution:**
```bash
# Check Redis connection
redis-cli ping
# Restart worker with verbose logging
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
# Monitor logs
tail -f /tmp/navidocs-ocr-worker.log
```
---
**Problem 2: Worker processes jobs slowly**
**Diagnosis:**
```bash
# Check concurrency setting
grep OCR_CONCURRENCY /home/setup/navidocs/server/.env
# Monitor job progress
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, status, progress FROM ocr_jobs WHERE status='processing';"
```
**Solution:**
```bash
# Increase concurrency (if system has resources)
nano /home/setup/navidocs/server/.env
# Modify:
OCR_CONCURRENCY=4 # Increase from 2 to 4
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
---
### 2.5 Frontend Issues
#### Common Problems
**Problem 1: Vite dev server won't start**
**Diagnosis:**
```bash
# Check if port 8080 is in use
lsof -i :8080
# Check logs
tail -50 /tmp/navidocs-frontend.log
# Try starting manually
cd /home/setup/navidocs/client
npm run dev
```
**Solution:**
```bash
# Kill existing process
pkill -f "vite.*8080"
# Clear node_modules cache (if needed)
cd /home/setup/navidocs/client
rm -rf node_modules/.vite
# Restart
npm run dev > /tmp/navidocs-frontend.log 2>&1 &
```
---
**Problem 2: Frontend can't connect to backend**
**Diagnosis:**
```bash
# Check Vite proxy configuration
cat /home/setup/navidocs/client/vite.config.js
# Test backend directly
curl http://localhost:8001/health
# Test from frontend
curl http://localhost:8080/api/health
```
**Solution:**
```bash
# Verify proxy is configured correctly in vite.config.js
# Should have:
# proxy: {
# '/api': {
# target: 'http://localhost:8001',
# changeOrigin: true
# }
# }
# If changed, restart frontend
pkill -f "vite.*8080"
cd /home/setup/navidocs/client
npm run dev > /tmp/navidocs-frontend.log 2>&1 &
```
---
**Problem 3: Hot module reload not working**
**Solution:**
```bash
# This is common in WSL2
# Check Vite is watching files properly
# Increase file watch limit
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Restart frontend
pkill -f "vite.*8080"
cd /home/setup/navidocs/client
npm run dev > /tmp/navidocs-frontend.log 2>&1 &
```
---
## 3. Network & WSL2 Issues
### 3.1 Can't Access from Windows
#### Symptoms
- Frontend/backend not accessible from Windows browser
- Connection refused errors
- Timeouts when accessing http://172.x.x.x:8080
#### Diagnosis Steps
**Step 1: Verify services are running on 0.0.0.0**
```bash
# Check what addresses services are bound to
ss -tlnp | grep -E ":(8001|8080|7700)"
# Should show 0.0.0.0:8001, NOT 127.0.0.1:8001
```
**Step 2: Get current WSL2 IP**
```bash
# Get WSL IP
hostname -I | awk '{print $1}'
# Or
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
```
**Step 3: Test from Windows**
```powershell
# In Windows PowerShell
# Get WSL IP from Windows side
wsl hostname -I
# Test connectivity
Test-NetConnection -ComputerName <WSL-IP> -Port 8080
Test-NetConnection -ComputerName <WSL-IP> -Port 8001
```
#### Solutions
**Solution 1: Verify server binds to 0.0.0.0**
```bash
# Backend should bind to 0.0.0.0 (check server/index.js)
# It should use:
# app.listen(PORT, '0.0.0.0', ...)
# Frontend vite.config.js should have:
# server: { host: '0.0.0.0', port: 8080 }
# Restart services
/home/setup/navidocs/stop-all.sh
/home/setup/navidocs/start-all.sh
```
**Solution 2: Create port forwarding (if needed)**
```powershell
# In Windows PowerShell as Administrator
# Get WSL IP
$wslIp = (wsl hostname -I).Trim()
# Forward port
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=$wslIp
netsh interface portproxy add v4tov4 listenport=8001 listenaddress=0.0.0.0 connectport=8001 connectaddress=$wslIp
# Show current forwards
netsh interface portproxy show v4tov4
```
**Solution 3: Check Windows Firewall**
```powershell
# In Windows PowerShell as Administrator
# Allow incoming connections on ports
New-NetFirewallRule -DisplayName "NaviDocs Frontend" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "NaviDocs Backend" -Direction Inbound -LocalPort 8001 -Protocol TCP -Action Allow
```
**Solution 4: Access using localhost (Windows 11 22H2+)**
```
# In newer Windows 11, you can access WSL services via localhost directly
http://localhost:8080
http://localhost:8001/health
# If this doesn't work, use the WSL IP address
```
#### Prevention Tips
- Document current WSL IP in a visible place
- Always bind services to 0.0.0.0 in WSL
- Test from Windows after every restart
- Consider using .local DNS if available
---
### 3.2 Dynamic IP Changes
#### Symptoms
- Services accessible after WSL start, then stop working
- IP address changed after Windows restart
- Bookmarks with IP no longer work
#### Diagnosis
```bash
# Check current IP
hostname -I | awk '{print $1}'
# Compare with documented IP in PATHS_AND_CREDENTIALS.md
grep "Current IP" /home/setup/navidocs/docs/handover/PATHS_AND_CREDENTIALS.md
```
#### Solutions
**Solution 1: Update documentation**
```bash
# Get new IP
NEW_IP=$(hostname -I | awk '{print $1}')
echo "New WSL2 IP: $NEW_IP"
# Update PATHS_AND_CREDENTIALS.md manually
nano /home/setup/navidocs/docs/handover/PATHS_AND_CREDENTIALS.md
```
**Solution 2: Create IP monitoring script**
```bash
# Create script to show current access URLs
cat > /home/setup/navidocs/show-urls.sh << 'EOF'
#!/bin/bash
WSL_IP=$(hostname -I | awk '{print $1}')
echo "==================================="
echo "NaviDocs Access URLs"
echo "==================================="
echo ""
echo "Frontend (WSL): http://localhost:8080"
echo "Frontend (Windows): http://$WSL_IP:8080"
echo ""
echo "Backend (WSL): http://localhost:8001"
echo "Backend (Windows): http://$WSL_IP:8001"
echo ""
echo "Meilisearch (WSL): http://localhost:7700"
echo "Meilisearch (Windows): http://$WSL_IP:7700"
echo "==================================="
EOF
chmod +x /home/setup/navidocs/show-urls.sh
# Run anytime
/home/setup/navidocs/show-urls.sh
```
**Solution 3: Use localhost on Windows 11 22H2+**
```
# Windows 11 22H2 and newer support accessing WSL via localhost
# No need to track IP changes!
http://localhost:8080 # Frontend
http://localhost:8001 # Backend
http://localhost:7700 # Meilisearch
```
**Solution 4: Set static IP for WSL (advanced)**
```bash
# Edit /etc/wsl.conf in WSL
sudo nano /etc/wsl.conf
# Add:
# [network]
# generateResolvConf = false
# In Windows, edit .wslconfig
# C:\Users\<YourUser>\.wslconfig
# [wsl2]
# networkingMode=bridged
# Note: This requires Windows restart and may have other implications
```
#### Prevention Tips
- Use `localhost` when possible (Windows 11 22H2+)
- Run `show-urls.sh` after Windows restart
- Document IP changes
- Test connectivity after Windows updates
---
### 3.3 Port Binding Issues
#### Symptoms
- "EADDRINUSE" errors
- Services can't bind to ports
- Port conflicts with other applications
#### Diagnosis
```bash
# Check what's using each port
lsof -i :6379 # Redis
lsof -i :7700 # Meilisearch
lsof -i :8001 # Backend
lsof -i :8080 # Frontend
# Or use netstat
netstat -tlnp | grep -E ":(6379|7700|8001|8080)"
```
#### Solutions
**Solution 1: Kill conflicting processes**
```bash
# Kill by port
lsof -ti:8001 | xargs kill -9
# Or kill all NaviDocs processes
/home/setup/navidocs/stop-all.sh
```
**Solution 2: Change ports**
```bash
# Backend port
nano /home/setup/navidocs/server/.env
# Change PORT=8002
# Frontend port
nano /home/setup/navidocs/client/vite.config.js
# Change port: 8081
# Also update proxy target if backend port changed
# Restart services
/home/setup/navidocs/stop-all.sh
/home/setup/navidocs/start-all.sh
```
**Solution 3: Find and stop other applications**
```bash
# Identify process
lsof -i :8080
# If it's another dev server, stop it
# If it's a system service, choose different port for NaviDocs
```
---
## 4. Performance Issues
### 4.1 Slow Uploads
#### Symptoms
- Upload takes minutes for small files
- Upload progress bar freezes
- Timeouts during upload
#### Diagnosis
```bash
# Check disk I/O
iostat -x 1 5
# Check available disk space
df -h /home/setup/navidocs/server/uploads
# Check if database is slow
time sqlite3 /home/setup/navidocs/server/db/navidocs.db "SELECT COUNT(*) FROM documents;"
# Monitor backend during upload
tail -f /tmp/navidocs-backend.log
```
#### Solutions
**Solution 1: Check disk space**
```bash
# Free up space
df -h
# Remove old logs
rm /tmp/navidocs-*.log
# Remove old backups
rm /home/setup/navidocs/server/db/*backup*.db
```
**Solution 2: Optimize database**
```bash
# Stop services
/home/setup/navidocs/stop-all.sh
# Vacuum database
sqlite3 /home/setup/navidocs/server/db/navidocs.db "VACUUM;"
# Restart
/home/setup/navidocs/start-all.sh
```
**Solution 3: Increase timeouts**
```bash
# Edit backend server if needed
# Check Express timeout settings in server/index.js
# For Vite, increase timeout in vite.config.js:
# server: {
# proxy: {
# '/api': {
# timeout: 120000 // 2 minutes
# }
# }
# }
```
**Solution 4: Check network (for remote access)**
```bash
# If uploading from Windows browser to WSL backend
# Test network speed
# In WSL:
iperf3 -s
# In Windows:
# iperf3 -c <WSL-IP>
```
---
### 4.2 Slow Search
#### Symptoms
- Search takes several seconds
- Search results timeout
- Meilisearch uses high CPU
#### Diagnosis
```bash
# Check Meilisearch stats
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/stats
# Check number of documents
# Large indexes (>100k documents) may be slower
# Check Docker container resources
docker stats boat-manuals-meilisearch
# Test search performance
time curl -X POST \
-H "Authorization: Bearer $MASTER_KEY" \
-H "Content-Type: application/json" \
http://localhost:7700/indexes/navidocs-pages/search \
-d '{"q":"test","limit":10}'
```
#### Solutions
**Solution 1: Optimize Meilisearch settings**
```bash
# Reduce crop length for faster results
# This is done in the search query:
# cropLength: 100 (instead of 200)
# Limit number of results
# limit: 10 (instead of 20 or more)
```
**Solution 2: Increase Docker container resources**
```bash
# Stop container
docker stop boat-manuals-meilisearch
# Remove container
docker rm boat-manuals-meilisearch
# Recreate with more resources
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
docker run -d \
--name boat-manuals-meilisearch \
-p 7700:7700 \
--memory="2g" \
--cpus="2" \
-e MEILI_MASTER_KEY="$MASTER_KEY" \
-e MEILI_ENV=development \
-e MEILI_NO_ANALYTICS=true \
-v meilisearch_data:/meili_data \
getmeili/meilisearch:v1.6
```
**Solution 3: Reduce index size**
```bash
# Remove deleted documents from index
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# Delete documents where status='deleted' from Meilisearch
# This would require a script to query database and delete from index
# Or recreate index from scratch (see Section 1.5)
```
---
### 4.3 High Memory Usage
#### Symptoms
- System becomes sluggish
- Services crash with "out of memory"
- Swap usage high
#### Diagnosis
```bash
# Check overall memory
free -h
# Check per-process memory
ps aux --sort=-%mem | head -10
# Check Docker memory
docker stats boat-manuals-meilisearch
# Check Node.js processes
ps aux | grep node
```
#### Solutions
**Solution 1: Limit Node.js memory**
```bash
# Edit start-all.sh to limit backend memory
node --max-old-space-size=512 index.js > /tmp/navidocs-backend.log 2>&1 &
# Limit OCR worker
node --max-old-space-size=512 workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 2: Reduce OCR concurrency**
```bash
nano /home/setup/navidocs/server/.env
# Set:
OCR_CONCURRENCY=1
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 3: Limit Docker container memory**
```bash
# See Solution 2 in Section 4.2 above
```
**Solution 4: Clear Redis memory**
```bash
# Clear completed jobs
redis-cli
DEL bull:ocr-processing:completed
DEL bull:ocr-processing:failed
exit
```
---
### 4.4 Disk Space Issues
#### Symptoms
- "No space left on device" errors
- Uploads fail
- Database writes fail
#### Diagnosis
```bash
# Check disk usage
df -h
# Check NaviDocs directories
du -sh /home/setup/navidocs/server/uploads
du -sh /home/setup/navidocs/server/db
# Check Docker volumes
docker system df
# Find large files
find /home/setup/navidocs -type f -size +100M -exec ls -lh {} \;
```
#### Solutions
**Solution 1: Clean up old files**
```bash
# Remove old logs
rm /tmp/navidocs-*.log
# Remove old database backups
rm /home/setup/navidocs/server/db/*backup*.db
# Clean up node_modules cache
cd /home/setup/navidocs/server
npm cache clean --force
cd /home/setup/navidocs/client
npm cache clean --force
```
**Solution 2: Remove deleted documents**
```bash
# Find deleted documents still on disk
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT file_path FROM documents WHERE status='deleted';"
# Manually remove these files (review first!)
```
**Solution 3: Clean Docker**
```bash
# Remove unused Docker images
docker image prune -a
# Remove unused volumes (CAREFUL!)
docker volume prune
# Check space saved
docker system df
```
**Solution 4: Implement file rotation**
```bash
# Set up log rotation for NaviDocs logs
sudo nano /etc/logrotate.d/navidocs
# Add:
# /tmp/navidocs-*.log {
# daily
# rotate 7
# compress
# missingok
# notifempty
# }
# Test
sudo logrotate -f /etc/logrotate.d/navidocs
```
---
## 5. Data Issues
### 5.1 Documents Not Indexing
#### Symptoms
- Documents uploaded but not searchable
- OCR job completes but search returns no results
- `search_indexed_at` is NULL in database
#### Diagnosis
```bash
# Check if pages were created
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT COUNT(*) FROM document_pages WHERE document_id='<document-id>';"
# Check if indexed
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT page_number, search_indexed_at
FROM document_pages
WHERE document_id='<document-id>'
ORDER BY page_number;"
# Check OCR worker logs
grep -i "index" /tmp/navidocs-ocr-worker.log | tail -20
# Check Meilisearch for document
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
"http://localhost:7700/indexes/navidocs-pages/documents?filter=documentId=<document-id>"
```
#### Solutions
**Solution 1: Check Meilisearch connectivity from worker**
```bash
# Test from worker context
cd /home/setup/navidocs/server
# Test Meilisearch connection
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY .env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/health
# If this fails, Meilisearch is not accessible
# Restart Meilisearch
docker restart boat-manuals-meilisearch
```
**Solution 2: Re-run indexing for specific document**
```bash
# This would require a manual script or function
# You can trigger re-indexing by:
# 1. Update job status to pending
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE ocr_jobs SET status='pending', progress=0 WHERE document_id='<document-id>';"
# 2. Update document status
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE documents SET status='processing' WHERE id='<document-id>';"
# 3. Restart worker to pick up job
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
# Monitor
tail -f /tmp/navidocs-ocr-worker.log
```
**Solution 3: Check index configuration**
```bash
# Verify index exists and is configured
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/settings
# Should have searchableAttributes including 'text'
# If not, restart backend to reconfigure
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
```
---
### 5.2 Search Results Missing
#### Symptoms
- Some documents don't appear in search results
- Search finds some pages but not all
- Recent uploads not searchable
#### Diagnosis
```bash
# Check document status
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, title, status, page_count
FROM documents
WHERE title LIKE '%<search-term>%';"
# Check if pages are indexed
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT d.id, d.title, COUNT(p.id) as total_pages,
SUM(CASE WHEN p.search_indexed_at IS NOT NULL THEN 1 ELSE 0 END) as indexed_pages
FROM documents d
LEFT JOIN document_pages p ON d.id = p.document_id
GROUP BY d.id;"
# Check Meilisearch document count
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/stats
# Compare counts
```
#### Solutions
**Solution 1: Check filter rules**
```bash
# Verify user has access to organization
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT * FROM user_organizations WHERE user_id='test-user-id';"
# Test search without filters
curl -X POST \
-H "Authorization: Bearer $MASTER_KEY" \
-H "Content-Type: application/json" \
http://localhost:7700/indexes/navidocs-pages/search \
-d '{"q":"<term>","limit":100}'
```
**Solution 2: Rebuild index from database**
```bash
# Export pages from database
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT
'page_' || d.id || '_' || p.page_number as id,
d.id as documentId,
d.organization_id as organizationId,
d.uploaded_by as userId,
p.page_number as pageNumber,
p.ocr_text as text,
d.title,
d.document_type as documentType,
p.ocr_confidence as confidence
FROM document_pages p
JOIN documents d ON p.document_id = d.id
WHERE p.search_indexed_at IS NOT NULL AND d.status != 'deleted';" \
-json > pages_export.json
# This would need to be imported to Meilisearch
# (Requires custom script or manual import)
```
**Solution 3: Force reindex all documents**
```bash
# Reset all jobs to pending (CAUTION: This will reprocess everything)
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE ocr_jobs
SET status='pending', progress=0, error=NULL, started_at=NULL, completed_at=NULL
WHERE status='completed';"
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE documents SET status='processing' WHERE status='indexed';"
# Restart worker
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
---
### 5.3 Corrupt Uploads
#### Symptoms
- PDF won't open
- OCR fails with "invalid PDF" errors
- File size is 0 or suspiciously small
#### Diagnosis
```bash
# Get file info from database
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, file_path, file_size, status FROM documents WHERE id='<document-id>';"
# Check actual file
FILE_PATH="<file-path-from-query>"
ls -lh "$FILE_PATH"
file "$FILE_PATH"
# Try to open with pdfinfo (if installed)
pdfinfo "$FILE_PATH"
# Check file hash
sha256sum "$FILE_PATH"
```
#### Solutions
**Solution 1: Mark as failed and remove**
```bash
# Update document status
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE documents SET status='failed' WHERE id='<document-id>';"
# Remove corrupted file
rm "<file-path>"
# User can re-upload
```
**Solution 2: Attempt PDF repair (if recoverable)**
```bash
# Try using pdftk or gs to repair
# Install if needed: sudo apt-get install pdftk
pdftk "$FILE_PATH" output repaired.pdf
# Or use Ghostscript
gs -o repaired.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress "$FILE_PATH"
# If successful, replace
mv repaired.pdf "$FILE_PATH"
# Retry OCR
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"UPDATE ocr_jobs SET status='pending', progress=0 WHERE document_id='<document-id>';"
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
```
**Solution 3: Check upload validation**
```bash
# Review file validation in routes/upload.js
# Ensure magic number check is working
# Test upload with a known good PDF
curl -X POST http://localhost:8001/api/upload \
-F "file=@/path/to/good-test.pdf" \
-F "title=Test" \
-F "documentType=owner-manual" \
-F "organizationId=test-org-id"
```
---
## 6. Quick Reference Commands
### Health Checks
```bash
# Check all services
ss -tlnp | grep -E ":(6379|7700|8001|8080)"
# Backend health
curl http://localhost:8001/health
# Meilisearch health
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
curl -H "Authorization: Bearer $MASTER_KEY" http://localhost:7700/health
# Redis ping
redis-cli ping
# Check processes
ps aux | grep -E "navidocs|ocr-worker|vite"
```
### Log Viewing
```bash
# Tail all logs
tail -f /tmp/navidocs-*.log
# Backend only
tail -f /tmp/navidocs-backend.log
# OCR worker only
tail -f /tmp/navidocs-ocr-worker.log
# Search for errors
grep -i error /tmp/navidocs-*.log
# Last 50 lines of all logs
tail -50 /tmp/navidocs-backend.log
tail -50 /tmp/navidocs-ocr-worker.log
tail -50 /tmp/navidocs-frontend.log
```
### Service Control
```bash
# Start all
/home/setup/navidocs/start-all.sh
# Stop all
/home/setup/navidocs/stop-all.sh
# Restart backend only
pkill -f "navidocs.*index.js"
cd /home/setup/navidocs/server
node index.js > /tmp/navidocs-backend.log 2>&1 &
# Restart OCR worker only
pkill -f "ocr-worker"
cd /home/setup/navidocs/server
node workers/ocr-worker.js > /tmp/navidocs-ocr-worker.log 2>&1 &
# Restart frontend only
pkill -f "vite.*8080"
cd /home/setup/navidocs/client
npm run dev > /tmp/navidocs-frontend.log 2>&1 &
# Restart Meilisearch
docker restart boat-manuals-meilisearch
```
### Database Queries
```bash
# Document count
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT COUNT(*) FROM documents WHERE status != 'deleted';"
# Job statuses
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT status, COUNT(*) FROM ocr_jobs GROUP BY status;"
# Recent uploads
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT id, title, status, created_at FROM documents ORDER BY created_at DESC LIMIT 10;"
# Pages indexed
sqlite3 /home/setup/navidocs/server/db/navidocs.db \
"SELECT COUNT(*) FROM document_pages WHERE search_indexed_at IS NOT NULL;"
# Database size
ls -lh /home/setup/navidocs/server/db/navidocs.db
```
### Redis Commands
```bash
redis-cli
# Queue lengths
LLEN bull:ocr-processing:wait
LLEN bull:ocr-processing:active
LLEN bull:ocr-processing:completed
LLEN bull:ocr-processing:failed
# Memory usage
INFO memory
# Clear queues (CAREFUL!)
DEL bull:ocr-processing:completed
DEL bull:ocr-processing:failed
# Exit
exit
```
### Meilisearch Commands
```bash
MASTER_KEY=$(grep MEILISEARCH_MASTER_KEY /home/setup/navidocs/server/.env | cut -d'=' -f2)
# List indexes
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes
# Index stats
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/stats
# Search test
curl -X POST \
-H "Authorization: Bearer $MASTER_KEY" \
-H "Content-Type: application/json" \
http://localhost:7700/indexes/navidocs-pages/search \
-d '{"q":"test","limit":5}'
# Get index settings
curl -H "Authorization: Bearer $MASTER_KEY" \
http://localhost:7700/indexes/navidocs-pages/settings
```
### Network & WSL
```bash
# Get WSL IP
hostname -I | awk '{print $1}'
# Check port bindings
ss -tlnp | grep -E ":(6379|7700|8001|8080)"
# Show access URLs
cat << EOF
Frontend (WSL): http://localhost:8080
Frontend (Windows): http://$(hostname -I | awk '{print $1}'):8080
Backend (WSL): http://localhost:8001
Backend (Windows): http://$(hostname -I | awk '{print $1}'):8001
EOF
```
### Cleanup & Maintenance
```bash
# Stop all services
/home/setup/navidocs/stop-all.sh
# Vacuum database
sqlite3 /home/setup/navidocs/server/db/navidocs.db "VACUUM;"
# Clear Redis completed jobs
redis-cli DEL bull:ocr-processing:completed
# Remove old logs
rm /tmp/navidocs-*.log
# Docker cleanup
docker system prune -f
# Restart everything
/home/setup/navidocs/start-all.sh
```
---
## Additional Resources
### Documentation
- Main README: `/home/setup/navidocs/README.md`
- Architecture Docs: `/home/setup/navidocs/docs/architecture/`
- Paths & Credentials: `/home/setup/navidocs/docs/handover/PATHS_AND_CREDENTIALS.md`
- Database Schema: `/home/setup/navidocs/server/db/schema.sql`
### External Documentation
- Meilisearch: https://docs.meilisearch.com/
- BullMQ: https://docs.bullmq.io/
- Vue 3: https://vuejs.org/
- Vite: https://vitejs.dev/
- SQLite: https://www.sqlite.org/docs.html
- Redis: https://redis.io/docs/
### Log Locations
- Backend: `/tmp/navidocs-backend.log`
- OCR Worker: `/tmp/navidocs-ocr-worker.log`
- Frontend: `/tmp/navidocs-frontend.log`
- Meilisearch: `docker logs boat-manuals-meilisearch`
---
## Troubleshooting Checklist
When encountering issues, work through this checklist:
1. **Verify all services are running**
```bash
ss -tlnp | grep -E ":(6379|7700|8001|8080)"
ps aux | grep -E "navidocs|ocr-worker|vite"
docker ps | grep meilisearch
```
2. **Check logs for errors**
```bash
tail -50 /tmp/navidocs-backend.log
tail -50 /tmp/navidocs-ocr-worker.log
grep -i error /tmp/navidocs-*.log
```
3. **Test connectivity**
```bash
curl http://localhost:8001/health
curl http://localhost:7700/health
redis-cli ping
```
4. **Verify environment configuration**
```bash
cat /home/setup/navidocs/server/.env
```
5. **Check disk space**
```bash
df -h
```
6. **Try clean restart**
```bash
/home/setup/navidocs/stop-all.sh
sleep 5
/home/setup/navidocs/start-all.sh
```
7. **Review recent changes**
- Did you modify configuration files?
- Did Windows restart?
- Were there system updates?
---
## Getting Help
If issues persist after trying these troubleshooting steps:
1. **Gather diagnostic information**
```bash
# Create diagnostic report
echo "=== NaviDocs Diagnostic Report ===" > /tmp/navidocs-diagnostics.txt
echo "Date: $(date)" >> /tmp/navidocs-diagnostics.txt
echo "" >> /tmp/navidocs-diagnostics.txt
echo "=== Port Status ===" >> /tmp/navidocs-diagnostics.txt
ss -tlnp | grep -E ":(6379|7700|8001|8080)" >> /tmp/navidocs-diagnostics.txt
echo "" >> /tmp/navidocs-diagnostics.txt
echo "=== Process Status ===" >> /tmp/navidocs-diagnostics.txt
ps aux | grep -E "navidocs|ocr-worker|vite" >> /tmp/navidocs-diagnostics.txt
echo "" >> /tmp/navidocs-diagnostics.txt
echo "=== Backend Logs (last 50 lines) ===" >> /tmp/navidocs-diagnostics.txt
tail -50 /tmp/navidocs-backend.log >> /tmp/navidocs-diagnostics.txt
echo "" >> /tmp/navidocs-diagnostics.txt
echo "=== OCR Worker Logs (last 50 lines) ===" >> /tmp/navidocs-diagnostics.txt
tail -50 /tmp/navidocs-ocr-worker.log >> /tmp/navidocs-diagnostics.txt
cat /tmp/navidocs-diagnostics.txt
```
2. **Document the issue**
- What were you trying to do?
- What error messages did you see?
- What troubleshooting steps did you already try?
- Include relevant log snippets
3. **Check GitHub Issues** (if applicable)
- Search for similar issues
- Review closed issues for solutions
---
**Last Updated:** 2025-10-19
**Maintainer:** Project Administrator
**Next Review:** Before production deployment