Files
TimeTracker/docker/debug_startup.sh
Dries Peeters d9dab3a49c feat: enhance README with comprehensive screenshot showcase
- Add organized screenshot sections for better visual presentation
- Include all 12 available screenshots from assets/screenshots/
- Group screenshots into logical categories:
  * Core Application Views (Dashboard, Projects, Tasks, Clients)
  * Management & Analytics (Reports, Visual Analytics, Task Management, Admin)
  * Data Entry & Creation (Log Time, New Task, New Client, New Project)
- Improve visual layout with proper spacing and responsive design
- Enhance user experience by showcasing full application capabilities
2025-09-02 14:42:54 +02:00

287 lines
7.9 KiB
Bash

#!/bin/bash
set -e
# TimeTracker Startup Debug Script
# This script helps debug startup issues step by step
echo "=== TimeTracker Startup Debug Script ==="
echo "Timestamp: $(date)"
echo "Container ID: $(hostname)"
echo
# Function to log messages with timestamp
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Function to check if a command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to test basic connectivity
test_basic_connectivity() {
log "=== Testing Basic Connectivity ==="
# Test if we can resolve the database hostname
if ping -c 1 db >/dev/null 2>&1; then
log "✓ Can ping database host 'db'"
else
log "✗ Cannot ping database host 'db'"
return 1
fi
# Test if database port is accessible
if command_exists nc; then
if nc -zv db 5432 2>/dev/null; then
log "✓ Database port 5432 is accessible"
else
log "✗ Database port 5432 is not accessible"
return 1
fi
else
log "⚠ netcat not available, skipping port test"
fi
return 0
}
# Function to test environment variables
test_environment() {
log "=== Testing Environment Variables ==="
# Check if DATABASE_URL is set
if [[ -n "${DATABASE_URL}" ]]; then
log "✓ DATABASE_URL is set: ${DATABASE_URL}"
# Check if it's a valid PostgreSQL URL
if [[ "${DATABASE_URL}" == postgresql* ]]; then
log "✓ DATABASE_URL format is valid PostgreSQL"
else
log "✗ DATABASE_URL format is not valid PostgreSQL"
return 1
fi
else
log "✗ DATABASE_URL is not set"
return 1
fi
# Check other important variables
if [[ -n "${FLASK_APP}" ]]; then
log "✓ FLASK_APP is set: ${FLASK_APP}"
else
log "⚠ FLASK_APP is not set"
fi
return 0
}
# Function to test Python dependencies
test_python_dependencies() {
log "=== Testing Python Dependencies ==="
# Check if psycopg2 is available
if python -c "import psycopg2; print('✓ psycopg2 is available')" 2>/dev/null; then
log "✓ psycopg2 is available"
else
log "✗ psycopg2 is not available"
return 1
fi
# Check if Flask is available
if python -c "import flask; print('✓ Flask is available')" 2>/dev/null; then
log "✓ Flask is available"
else
log "✗ Flask is not available"
return 1
fi
# Check if Flask-Migrate is available
if python -c "import flask_migrate; print('✓ Flask-Migrate is available')" 2>/dev/null; then
log "✓ Flask-Migrate is available"
else
log "✗ Flask-Migrate is not available"
return 1
fi
return 0
}
# Function to test database connection
test_database_connection() {
log "=== Testing Database Connection ==="
# Run the connection test script
if [[ -f "/app/docker/test_db_connection.py" ]]; then
log "Running database connection test..."
if python /app/docker/test_db_connection.py; then
log "✓ Database connection test successful"
return 0
else
log "✗ Database connection test failed"
return 1
fi
else
log "⚠ Database connection test script not found"
# Fallback: test connection manually
log "Testing connection manually..."
if python -c "
import psycopg2
import sys
try:
# Parse connection string to remove +psycopg2 if present
conn_str = '${DATABASE_URL}'.replace('+psycopg2://', 'postgresql://')
print(f'Trying to connect to: {conn_str}')
conn = psycopg2.connect(conn_str)
cursor = conn.cursor()
cursor.execute('SELECT 1')
result = cursor.fetchone()
print(f'✓ Connection successful, test query result: {result}')
conn.close()
sys.exit(0)
except Exception as e:
print(f'✗ Connection failed: {e}')
sys.exit(1)
"; then
log "✓ Manual connection test successful"
return 0
else
log "✗ Manual connection test failed"
return 1
fi
fi
}
# Function to test Flask-Migrate commands
test_flask_migrate() {
log "=== Testing Flask-Migrate Commands ==="
# Check if flask db command is available
if flask db --help >/dev/null 2>&1; then
log "✓ Flask-Migrate commands are available"
# Test current command
if flask db current >/dev/null 2>&1; then
current_revision=$(flask db current 2>/dev/null | tr -d '\n' || echo "unknown")
log "✓ Current migration revision: $current_revision"
else
log "⚠ Could not get current migration revision"
fi
else
log "✗ Flask-Migrate commands are not available"
return 1
fi
return 0
}
# Function to show system information
show_system_info() {
log "=== System Information ==="
log "Python version: $(python --version)"
log "Flask version: $(flask --version 2>/dev/null || echo 'Flask CLI not available')"
log "Working directory: $(pwd)"
log "Current user: $(whoami)"
log "Environment: $(env | grep -E '(FLASK|DATABASE|PYTHON)' | sort)"
# Check if we're in a container
if [[ -f /.dockerenv ]]; then
log "✓ Running in Docker container"
else
log "⚠ Not running in Docker container"
fi
# Check if we can access the app directory
if [[ -d "/app" ]]; then
log "✓ /app directory is accessible"
log " Contents: $(ls -la /app | head -5)"
else
log "✗ /app directory is not accessible"
fi
}
# Main execution
main() {
log "Starting TimeTracker startup debug..."
# Show system information
show_system_info
echo
# Test basic connectivity
if ! test_basic_connectivity; then
log "❌ Basic connectivity test failed"
echo
log "Troubleshooting connectivity issues:"
log "1. Check if database container is running: docker-compose ps db"
log "2. Check database logs: docker-compose logs db"
log "3. Check network: docker network ls"
echo
return 1
fi
echo
# Test environment variables
if ! test_environment; then
log "❌ Environment test failed"
echo
log "Troubleshooting environment issues:"
log "1. Check .env file exists and has correct values"
log "2. Verify DATABASE_URL format"
log "3. Check docker-compose environment section"
echo
return 1
fi
echo
# Test Python dependencies
if ! test_python_dependencies; then
log "❌ Python dependencies test failed"
echo
log "Troubleshooting dependency issues:"
log "1. Check requirements.txt is installed"
log "2. Verify Python packages are available"
log "3. Check container build process"
echo
return 1
fi
echo
# Test database connection
if ! test_database_connection; then
log "❌ Database connection test failed"
echo
log "Troubleshooting connection issues:"
log "1. Check database container health: docker-compose ps db"
log "2. Verify database credentials"
log "3. Check database initialization"
log "4. See: docker/TROUBLESHOOTING_DB_CONNECTION.md"
echo
return 1
fi
echo
# Test Flask-Migrate
if ! test_flask_migrate; then
log "❌ Flask-Migrate test failed"
echo
log "Troubleshooting Flask-Migrate issues:"
log "1. Check if migrations directory exists"
log "2. Verify Flask-Migrate is properly installed"
log "3. Check application configuration"
echo
return 1
fi
echo
log "🎉 All tests passed! System appears to be ready."
log "You can now try starting the application normally."
return 0
}
# Run main function
main "$@"