Files
TimeTracker/docker/STARTUP_MIGRATION_CONFIG.md
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

8.6 KiB

Container Startup with Automatic Migration Detection

This document explains how the TimeTracker Docker container automatically detects database state and chooses the correct migration strategy during startup.

🎯 Automatic Migration Detection

The container startup system automatically detects the current state of your database and chooses the appropriate migration strategy:

Database States Detected:

State Description Detection Method Migration Strategy
Fresh No database or empty database No tables exist fresh_init
Migrated Database already uses Flask-Migrate alembic_version table exists check_migrations
Legacy Database with old custom migrations Tables exist but no alembic_version comprehensive_migration
Unknown Cannot determine state Detection failed comprehensive_migration (fallback)

🚀 Migration Strategies

1. Fresh Initialization (fresh_init)

  • When Used: New database, no existing tables
  • Actions:
    • Initialize Flask-Migrate
    • Create initial migration
    • Apply migration to create schema
  • Result: Complete new database with Flask-Migrate

2. Migration Check (check_migrations)

  • When Used: Database already migrated, check for updates
  • Actions:
    • Check current migration revision
    • Apply any pending migrations
    • Verify database integrity
  • Result: Database updated to latest migration

3. Comprehensive Migration (comprehensive_migration)

  • When Used: Legacy database with old custom migrations
  • Actions:
    • Run enhanced startup script (startup_with_migration.py)
    • Fallback to manual migration if script fails
    • Preserve all existing data
    • Create migration baseline
  • Result: Legacy database converted to Flask-Migrate

🔧 Startup Process Flow

Container Start
       ↓
Wait for Database
       ↓
Detect Database State
       ↓
Choose Migration Strategy
       ↓
Execute Migration
       ↓
Verify Database Integrity
       ↓
Start Application

📋 Startup Scripts

Primary Entrypoint: docker/entrypoint.sh

  • Purpose: Main container entrypoint with migration detection
  • Features:
    • Database availability check
    • State detection (PostgreSQL/SQLite)
    • Strategy selection
    • Migration execution
    • Integrity verification
  • Fallbacks: Multiple fallback methods for each step

Enhanced Startup: docker/startup_with_migration.py

  • Purpose: Advanced migration handling for complex scenarios
  • Features:
    • Comprehensive database analysis
    • Automatic backup creation
    • Schema migration
    • Data preservation
    • Error recovery

🛡️ Safety Features

Automatic Protection:

  • Database Wait: Waits for database to be available
  • State Detection: Analyzes existing database structure
  • Strategy Selection: Chooses safest migration approach
  • Fallback Methods: Multiple fallback options for each step
  • Integrity Verification: Confirms database is working after migration

Error Handling:

  • Graceful Failures: Detailed error logging and recovery
  • Retry Logic: Automatic retries for database connections
  • Fallback Strategies: Alternative approaches if primary method fails
  • Logging: Comprehensive logging for troubleshooting

🔍 Detection Methods

PostgreSQL Detection:

# Check if alembic_version table exists
SELECT EXISTS (
    SELECT FROM information_schema.tables 
    WHERE table_name = 'alembic_version'
);

# Get list of existing tables
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'public' 
ORDER BY table_name;

SQLite Detection:

# Check if alembic_version table exists
SELECT name FROM sqlite_master 
WHERE type='table' AND name='alembic_version';

# Get list of existing tables
SELECT name FROM sqlite_master WHERE type='table';

📊 Migration Strategy Selection Logic

def choose_migration_strategy(db_state):
    if db_state == 'fresh':
        return 'fresh_init'           # New database
    elif db_state == 'migrated':
        return 'check_migrations'     # Already migrated
    elif db_state == 'legacy':
        return 'comprehensive_migration'  # Old system
    else:
        return 'comprehensive_migration'   # Fallback

🚀 Usage Examples

Fresh Database:

# Container will automatically:
# 1. Detect no tables exist
# 2. Choose 'fresh_init' strategy
# 3. Initialize Flask-Migrate
# 4. Create and apply initial migration
# 5. Start application

Existing Migrated Database:

# Container will automatically:
# 1. Detect alembic_version table exists
# 2. Choose 'check_migrations' strategy
# 3. Check for pending migrations
# 4. Apply any updates
# 5. Start application

Legacy Database:

# Container will automatically:
# 1. Detect tables exist but no alembic_version
# 2. Choose 'comprehensive_migration' strategy
# 3. Run enhanced migration script
# 4. Preserve all existing data
# 5. Convert to Flask-Migrate
# 6. Start application

🔧 Configuration Options

Environment Variables:

# Required
DATABASE_URL=postgresql://user:pass@host:port/db
# or
DATABASE_URL=sqlite:///path/to/database.db

# Optional
FLASK_APP=/app/app.py
TZ=Europe/Rome

Database Connection Settings:

  • PostgreSQL: Full connection string with credentials
  • SQLite: File path with write permissions
  • Connection Retries: 30 attempts with 2-second delays
  • Timeout: 60 seconds total wait time

📝 Logging and Monitoring

Log Locations:

  • Container Logs: docker logs <container_name>
  • Startup Logs: /var/log/timetracker_startup.log
  • Application Logs: /app/logs/

Log Levels:

  • INFO: Normal operation and progress
  • WARNING: Non-critical issues
  • ERROR: Critical failures and errors

Key Log Messages:

[2025-01-15 10:00:00] === TimeTracker Docker Container Starting ===
[2025-01-15 10:00:01] Waiting for database to be available...
[2025-01-15 10:00:02] ✓ PostgreSQL database is available
[2025-01-15 10:00:03] Analyzing database state...
[2025-01-15 10:00:04] Detected database state: legacy with 8 tables
[2025-01-15 10:00:05] Selected migration strategy: comprehensive_migration
[2025-01-15 10:00:06] Executing migration strategy: comprehensive_migration
[2025-01-15 10:00:10] ✓ Enhanced startup script completed successfully
[2025-01-15 10:00:11] Verifying database integrity...
[2025-01-15 10:00:12] ✓ Database integrity verified
[2025-01-15 10:00:13] === Startup and Migration Complete ===
[2025-01-15 10:00:14] Starting TimeTracker application...

🔍 Troubleshooting

Common Issues:

1. Database Connection Failed:

# Check environment variables
echo $DATABASE_URL

# Check database service
docker-compose ps db

# Check logs
docker logs <container_name>

2. Migration Strategy Failed:

# Check migration logs
docker exec <container_name> cat /var/log/timetracker_startup.log

# Check migration status
docker exec <container_name> flask db current

# Check database state manually
docker exec <container_name> flask db history

3. Database Integrity Check Failed:

# Check if key tables exist
docker exec <container_name> psql $DATABASE_URL -c "\dt"

# Check table structure
docker exec <container_name> psql $DATABASE_URL -c "\d users"

Recovery Options:

  1. Check Logs: Review startup and migration logs
  2. Verify Database: Ensure database is accessible
  3. Check Permissions: Verify database user permissions
  4. Restart Container: Restart with fresh migration attempt
  5. Manual Migration: Use migration scripts manually if needed

🎉 Benefits

Automatic Operation:

  • Zero Configuration: Works with any existing database
  • Smart Detection: Automatically chooses best migration approach
  • Data Preservation: Never loses existing data
  • Error Recovery: Multiple fallback methods

Production Ready:

  • Safe Migration: Automatic backups and verification
  • Rollback Support: Can revert to previous state
  • Monitoring: Comprehensive logging and health checks
  • Scalability: Works with any database size

Result: Your TimeTracker container will automatically handle any database scenario during startup, ensuring a smooth transition to the new Flask-Migrate system regardless of the existing database state! 🚀