Initial commit: Werkzeuge-Sammlung
Enthält: - rdp_client.py: RDP Client mit GUI und Monitor-Auswahl - rdp.sh: Bash-basierter RDP Client - teamleader_test/: Network Scanner Fullstack-App - teamleader_test2/: Network Mapper CLI Subdirectories mit eigenem Repo wurden ausgeschlossen. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
478
teamleader_test/docs/guides/troubleshooting.md
Normal file
478
teamleader_test/docs/guides/troubleshooting.md
Normal file
@@ -0,0 +1,478 @@
|
||||
# Troubleshooting Guide
|
||||
|
||||
Common errors, solutions, and debugging procedures for the Network Scanner Tool.
|
||||
|
||||
---
|
||||
|
||||
## Quick Diagnostics
|
||||
|
||||
### Health Check
|
||||
```bash
|
||||
# Check if services are running
|
||||
docker compose ps
|
||||
|
||||
# Test backend health
|
||||
curl http://localhost/health
|
||||
|
||||
# Check logs
|
||||
docker compose logs backend --tail=50
|
||||
docker compose logs frontend --tail=50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Errors & Solutions
|
||||
|
||||
### Backend Errors
|
||||
|
||||
#### ❌ `500 Internal Server Error` on API calls
|
||||
|
||||
**Symptoms**: API returns 500 error, backend logs show exceptions
|
||||
|
||||
**Common Causes**:
|
||||
1. **Schema mismatch** between backend (Pydantic) and frontend (TypeScript)
|
||||
2. **Database constraint violation** (NOT NULL, UNIQUE, etc.)
|
||||
3. **SQLAlchemy DetachedInstanceError** in background tasks
|
||||
|
||||
**Solutions**:
|
||||
|
||||
**Schema Mismatch**:
|
||||
```bash
|
||||
# Check if frontend/src/types/api.ts matches app/schemas.py
|
||||
# Example: Backend returns "network_range" but frontend expects "target"
|
||||
|
||||
# Fix: Update TypeScript interface
|
||||
# frontend/src/types/api.ts
|
||||
export interface Scan {
|
||||
network_range: string; // ← Must match backend exactly
|
||||
// not: target: string;
|
||||
}
|
||||
```
|
||||
|
||||
**Database Constraint**:
|
||||
```python
|
||||
# Error: NOT NULL constraint failed: services.host_id
|
||||
# Cause: Services added before host committed
|
||||
|
||||
# Fix: Commit and refresh host BEFORE adding services
|
||||
host = self._get_or_create_host(ip)
|
||||
self.db.commit() # ← CRITICAL: Ensure host.id is set
|
||||
self.db.refresh(host)
|
||||
|
||||
# NOW safe to add services
|
||||
service = Service(host_id=host.id, port=80)
|
||||
self.db.add(service)
|
||||
```
|
||||
|
||||
**DetachedInstanceError**:
|
||||
```python
|
||||
# Error: Instance is not bound to a Session
|
||||
# Cause: Using request session in background task
|
||||
|
||||
# Fix: Create new session in background task
|
||||
def scan_wrapper(scan_id: int):
|
||||
db = SessionLocal() # ← New session
|
||||
try:
|
||||
scan_service.execute_scan(scan_id, db)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
background_tasks.add_task(scan_wrapper, scan_id)
|
||||
```
|
||||
|
||||
#### ❌ `TopologyNode object has no field "position"`
|
||||
|
||||
**Symptoms**: `/api/topology` returns 500, logs show Pydantic validation error
|
||||
|
||||
**Cause**: Code trying to set field that doesn't exist in schema
|
||||
|
||||
**Solution**:
|
||||
```python
|
||||
# Check app/schemas.py - ensure TopologyNode has required fields
|
||||
class TopologyNode(BaseModel):
|
||||
id: str
|
||||
ip: str
|
||||
hostname: Optional[str]
|
||||
type: str
|
||||
status: str
|
||||
service_count: int
|
||||
connections: int
|
||||
# NOTE: No "position" field in simplified schema
|
||||
|
||||
# Remove any code that sets node.position
|
||||
# Don't use _calculate_layout() if it sets positions
|
||||
```
|
||||
|
||||
#### ❌ `Database is locked`
|
||||
|
||||
**Symptoms**: SQLite database errors, operations timeout
|
||||
|
||||
**Cause**: SQLite only allows one writer at a time
|
||||
|
||||
**Solutions**:
|
||||
1. Close other database connections
|
||||
2. Wait for running scans to complete
|
||||
3. Restart backend: `docker compose restart backend`
|
||||
4. For production with high concurrency, use PostgreSQL
|
||||
|
||||
---
|
||||
|
||||
### Frontend Errors
|
||||
|
||||
#### ❌ Blank page / White screen
|
||||
|
||||
**Symptoms**: Frontend loads but shows nothing
|
||||
|
||||
**Debugging**:
|
||||
```bash
|
||||
# 1. Open browser console (F12)
|
||||
# 2. Check for JavaScript errors
|
||||
|
||||
# Common errors:
|
||||
# - "Cannot read property 'X' of undefined" → API returned unexpected structure
|
||||
# - "Network Error" → Backend not running or wrong URL
|
||||
# - "TypeError: X is not a function" → Missing dependency or wrong import
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Check VITE_API_URL environment variable
|
||||
# frontend/.env
|
||||
VITE_API_URL=http://localhost:8000
|
||||
|
||||
# Verify backend is running
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# Rebuild frontend
|
||||
docker compose up -d --build frontend
|
||||
```
|
||||
|
||||
#### ❌ TypeScript build errors
|
||||
|
||||
**Symptoms**: `docker compose up --build` fails with TS errors
|
||||
|
||||
**Common Errors**:
|
||||
```typescript
|
||||
// Error: Type X is not assignable to type Y
|
||||
// Fix: Check frontend/src/types/api.ts matches backend response
|
||||
|
||||
// Error: Property 'X' does not exist on type 'Y'
|
||||
// Fix: Add missing property to interface or use optional chaining
|
||||
|
||||
// Error: 'X' is declared but its value is never read
|
||||
// Fix: Remove unused variable or use underscore: _unused
|
||||
```
|
||||
|
||||
#### ❌ Network map crashes or doesn't display
|
||||
|
||||
**Symptoms**: Network page loads but map is blank or crashes
|
||||
|
||||
**Debugging**:
|
||||
```bash
|
||||
# Check topology API response structure
|
||||
curl -s http://localhost:8000/api/topology | jq .
|
||||
|
||||
# Should return:
|
||||
{
|
||||
"nodes": [{"id": "1", "ip": "...", ...}],
|
||||
"edges": [{"source": "1", "target": "2", ...}],
|
||||
"statistics": {...}
|
||||
}
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
- Verify `topology.nodes` is an array
|
||||
- Check node objects have required fields: `id`, `ip`, `type`, `status`
|
||||
- Ensure edge objects have: `source`, `target`, `type`
|
||||
- Run a scan first to populate data
|
||||
|
||||
---
|
||||
|
||||
### Docker & Deployment Errors
|
||||
|
||||
#### ❌ `Cannot start service backend: Ports are not available`
|
||||
|
||||
**Symptoms**: Docker Compose fails to start, port 8000 or 80 in use
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Find process using port
|
||||
lsof -ti:8000
|
||||
lsof -ti:80
|
||||
|
||||
# Kill process or stop conflicting container
|
||||
docker stop $(docker ps -q)
|
||||
|
||||
# Or change ports in docker-compose.yml
|
||||
services:
|
||||
backend:
|
||||
ports:
|
||||
- "8001:8000" # Use different host port
|
||||
```
|
||||
|
||||
#### ❌ `no such file or directory: ./data/network_scanner.db`
|
||||
|
||||
**Symptoms**: Backend can't access database
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Create data directory
|
||||
mkdir -p /home/rwiegand/Nextcloud/entwicklung/Werkzeuge/teamleader_test/data
|
||||
|
||||
# Check volume mounting in docker-compose.yml
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
|
||||
# Restart containers
|
||||
docker compose down && docker compose up -d
|
||||
```
|
||||
|
||||
#### ❌ Container keeps restarting
|
||||
|
||||
**Symptoms**: `docker compose ps` shows container constantly restarting
|
||||
|
||||
**Debugging**:
|
||||
```bash
|
||||
# Check container logs
|
||||
docker compose logs backend --tail=100
|
||||
|
||||
# Common issues:
|
||||
# - Missing environment variables
|
||||
# - Failed database initialization
|
||||
# - Port conflicts
|
||||
# - Import errors (missing dependencies)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scanning Errors
|
||||
|
||||
#### ❌ Scan starts but nothing is discovered
|
||||
|
||||
**Symptoms**: Scan completes but finds 0 hosts
|
||||
|
||||
**Causes**:
|
||||
1. Network range is wrong or unreachable
|
||||
2. Firewall blocking outgoing connections
|
||||
3. Hosts are actually offline
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Test network connectivity manually
|
||||
ping 192.168.1.1
|
||||
|
||||
# Verify network range syntax
|
||||
# Correct: "192.168.1.0/24"
|
||||
# Wrong: "192.168.1.0-255", "192.168.1.*"
|
||||
|
||||
# Check if you're on the correct network
|
||||
ip addr show
|
||||
|
||||
# Try scanning your own machine
|
||||
curl -X POST http://localhost:8000/api/scans/start \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"network_range":"127.0.0.1/32","scan_type":"quick"}'
|
||||
```
|
||||
|
||||
#### ❌ Scan never completes / hangs
|
||||
|
||||
**Symptoms**: Scan status stays "running" indefinitely
|
||||
|
||||
**Debugging**:
|
||||
```bash
|
||||
# Check backend logs for errors
|
||||
docker compose logs backend --tail=100 | grep -i error
|
||||
|
||||
# Check if scan is actually running
|
||||
curl http://localhost:8000/api/scans/1/status
|
||||
|
||||
# Look for exceptions in logs
|
||||
docker compose logs backend | grep -i "exception\|traceback"
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Cancel stuck scan
|
||||
curl -X DELETE http://localhost:8000/api/scans/1/cancel
|
||||
|
||||
# Restart backend
|
||||
docker compose restart backend
|
||||
|
||||
# If persists, check for:
|
||||
# - Deadlocks (check cancel_requested flag)
|
||||
# - Infinite loops in scan logic
|
||||
# - Background task not properly yielding
|
||||
```
|
||||
|
||||
#### ❌ Progress bar doesn't update
|
||||
|
||||
**Symptoms**: Scan starts but progress stays at 0%
|
||||
|
||||
**Cause**: WebSocket not connected or not receiving updates
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Check WebSocket connection in browser console (F12)
|
||||
# Should see: "WebSocket connected. Total connections: 1"
|
||||
|
||||
# Verify WebSocket endpoint
|
||||
curl --include \
|
||||
--no-buffer \
|
||||
--header "Connection: Upgrade" \
|
||||
--header "Upgrade: websocket" \
|
||||
--header "Sec-WebSocket-Version: 13" \
|
||||
--header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" \
|
||||
http://localhost:8000/api/ws
|
||||
|
||||
# Check backend WebSocket handler
|
||||
# app/api/endpoints/websocket.py should broadcast progress
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Database Errors
|
||||
|
||||
#### ❌ `PendingRollbackError`
|
||||
|
||||
**Symptoms**: Operations fail with "can't reconnect until invalid transaction is rolled back"
|
||||
|
||||
**Cause**: Exception occurred but transaction wasn't rolled back
|
||||
|
||||
**Solution**:
|
||||
```python
|
||||
# Wrap operations in try/except with rollback
|
||||
try:
|
||||
# Database operations
|
||||
self.db.commit()
|
||||
except Exception as e:
|
||||
self.db.rollback() # ← CRITICAL
|
||||
logger.error(f"Error: {e}")
|
||||
raise
|
||||
```
|
||||
|
||||
#### ❌ Column doesn't exist after schema change
|
||||
|
||||
**Symptoms**: `no such column: connections.extra_data`
|
||||
|
||||
**Cause**: Database schema doesn't match models
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# For development: Delete and recreate database
|
||||
rm data/network_scanner.db
|
||||
docker compose restart backend
|
||||
|
||||
# For production: Create migration
|
||||
# (Requires alembic setup - TODO)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Debugging Procedures
|
||||
|
||||
### Backend Debugging
|
||||
|
||||
```bash
|
||||
# 1. Enable debug logging
|
||||
# Edit .env
|
||||
DEBUG=True
|
||||
LOG_LEVEL=DEBUG
|
||||
|
||||
# 2. Restart backend
|
||||
docker compose restart backend
|
||||
|
||||
# 3. Watch logs in real-time
|
||||
docker compose logs -f backend
|
||||
|
||||
# 4. Test specific endpoint
|
||||
curl -v http://localhost:8000/api/hosts
|
||||
|
||||
# 5. Check database state
|
||||
docker compose exec backend python -c "
|
||||
from app.database import SessionLocal
|
||||
from app.models import Host
|
||||
db = SessionLocal()
|
||||
print('Hosts:', db.query(Host).count())
|
||||
"
|
||||
```
|
||||
|
||||
### Frontend Debugging
|
||||
|
||||
```bash
|
||||
# 1. Open browser DevTools (F12)
|
||||
# 2. Check Console tab for errors
|
||||
# 3. Check Network tab for failed API calls
|
||||
# 4. Use React DevTools extension
|
||||
|
||||
# Test API directly
|
||||
curl http://localhost:8000/api/topology
|
||||
|
||||
# Check if response matches TypeScript types
|
||||
# Compare with frontend/src/types/api.ts
|
||||
```
|
||||
|
||||
### Network Issues
|
||||
|
||||
```bash
|
||||
# Test backend API from host
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# Test from inside frontend container
|
||||
docker compose exec frontend wget -O- http://backend:8000/health
|
||||
|
||||
# Check DNS resolution
|
||||
docker compose exec frontend nslookup backend
|
||||
|
||||
# Verify network connectivity
|
||||
docker network inspect teamleader_test_scanner-network
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Issues
|
||||
|
||||
### Slow Scans
|
||||
|
||||
**Symptoms**: Scans take much longer than expected
|
||||
|
||||
**Solutions**:
|
||||
1. **Reduce concurrency**: Edit `app/config.py`, set `MAX_CONCURRENT_SCANS = 25`
|
||||
2. **Increase timeout**: Set `DEFAULT_SCAN_TIMEOUT = 5`
|
||||
3. **Use quick scan**: Only scan common ports
|
||||
4. **Reduce network range**: Scan /28 instead of /24
|
||||
|
||||
### High Memory Usage
|
||||
|
||||
**Symptoms**: Docker containers using excessive memory
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Limit container memory
|
||||
# docker-compose.yml
|
||||
services:
|
||||
backend:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
|
||||
# Reduce concurrent scans
|
||||
# app/config.py
|
||||
MAX_CONCURRENT_SCANS = 25
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
If issues persist:
|
||||
|
||||
1. **Check logs**: `docker compose logs backend --tail=100`
|
||||
2. **Review this guide**: Common solutions above
|
||||
3. **Check copilot instructions**: [.github/copilot-instructions.md](../.github/copilot-instructions.md)
|
||||
4. **Review code review archive**: [archive/review-2025-12-04/](../archive/review-2025-12-04/)
|
||||
5. **Verify project status**: [docs/project-status.md](project-status.md)
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 4, 2025
|
||||
Reference in New Issue
Block a user