Files
quality_app/MERGE_COMPATIBILITY.md
ske087 9d14d67e52 Add compatibility layer for Docker and Gunicorn deployments
- Auto-detect mysqldump vs mariadb-dump command
- Conditional SSL flag based on Docker environment detection
- Works in both Docker containers and standard systemd deployments
- No breaking changes to existing functionality
2025-11-13 02:51:07 +02:00

8.5 KiB

Merge Compatibility Analysis: docker-deploy → master

📊 Merge Status: SAFE TO MERGE

Conflict Analysis

  • No merge conflicts detected between master and docker-deploy branches
  • All changes are additive or modify existing code in compatible ways
  • The docker-deploy branch adds 13 files with 1034 insertions and 117 deletions

Files Changed

New Files (No conflicts):

  1. DOCKER_DEPLOYMENT_GUIDE.md - Documentation
  2. IMPROVEMENTS_APPLIED.md - Documentation
  3. quick-deploy.sh - Deployment script
  4. restore_database.sh - Restore script
  5. setup-volumes.sh - Setup script

Modified Files:

  1. Dockerfile - Added mariadb-client package
  2. docker-compose.yml - Added /data volume mapping, resource limits
  3. py_app/app/database_backup.py - CRITICAL: Compatibility layer added
  4. py_app/app/static/css/base.css - Added sticky header styles
  5. py_app/app/static/fg_quality.js - Quality code display enhancement
  6. py_app/app/static/script.js - Quality code display enhancement
  7. py_app/app/templates/fg_scan.html - Added report-table-container wrapper
  8. py_app/app/templates/scan.html - Added report-table-container wrapper

🔧 Compatibility Layer: database_backup.py

Problem Identified

The docker-deploy branch changed backup commands from mysqldump to mariadb-dump and added --skip-ssl flag, which would break the application when running with standard Gunicorn (non-Docker) deployment.

Solution Implemented

Added intelligent environment detection and command selection:

1. Dynamic Command Detection

def _detect_dump_command(self):
    """Detect which mysqldump command is available (mariadb-dump or mysqldump)"""
    try:
        # Try mariadb-dump first (newer MariaDB versions)
        result = subprocess.run(['which', 'mariadb-dump'], 
                              capture_output=True, text=True)
        if result.returncode == 0:
            return 'mariadb-dump'
        
        # Fall back to mysqldump
        result = subprocess.run(['which', 'mysqldump'], 
                              capture_output=True, text=True)
        if result.returncode == 0:
            return 'mysqldump'
        
        # Default to mariadb-dump (will error if not available)
        return 'mariadb-dump'
    except Exception as e:
        print(f"Warning: Could not detect dump command: {e}")
        return 'mysqldump'  # Default fallback

2. Conditional SSL Arguments

def _get_ssl_args(self):
    """Get SSL arguments based on environment (Docker needs --skip-ssl)"""
    # Check if running in Docker container
    if os.path.exists('/.dockerenv') or os.environ.get('DOCKER_CONTAINER'):
        return ['--skip-ssl']
    return []

3. Updated Backup Command Building

cmd = [
    self.dump_command,  # Uses detected command (mariadb-dump or mysqldump)
    f"--host={self.config['host']}",
    f"--port={self.config['port']}",
    f"--user={self.config['user']}",
    f"--password={self.config['password']}",
]

# Add SSL args if needed (Docker environment)
cmd.extend(self._get_ssl_args())

# Add backup options
cmd.extend([
    '--single-transaction',
    '--skip-lock-tables',
    '--force',
    # ... other options
])

🎯 Deployment Scenarios

Scenario 1: Docker Deployment (docker-compose)

Environment Detection:

  • /.dockerenv file exists
  • DOCKER_CONTAINER environment variable set in docker-compose.yml

Backup Behavior:

  • Uses mariadb-dump (installed in Dockerfile)
  • Adds --skip-ssl flag automatically
  • Works correctly

Scenario 2: Standard Gunicorn Deployment (systemd service)

Environment Detection:

  • /.dockerenv file does NOT exist
  • DOCKER_CONTAINER environment variable NOT set

Backup Behavior:

  • Detects available command: mysqldump or mariadb-dump
  • Does NOT add --skip-ssl flag
  • Uses system-installed MySQL/MariaDB client tools
  • Works correctly

Scenario 3: Mixed Environment (External Database)

Both deployment types can connect to:

  • External MariaDB server
  • Remote database instance
  • Local database with proper SSL configuration

Backup Behavior:

  • Automatically adapts to available tools
  • SSL handling based on container detection
  • Works correctly

🧪 Testing Plan

Pre-Merge Testing

  1. Docker Environment:

    cd /srv/quality_app
    git checkout docker-deploy
    docker-compose up -d
    # Test backup via web UI
    # Test scheduled backup
    # Test restore functionality
    
  2. Gunicorn Environment:

    # Stop Docker if running
    docker-compose down
    
    # Start with systemd service (if available)
    sudo systemctl start trasabilitate
    
    # Test backup via web UI
    # Test scheduled backup
    # Test restore functionality
    
  3. Command Detection Test:

    # Inside Docker container
    docker-compose exec web python3 -c "
    from app.database_backup import DatabaseBackupManager
    manager = DatabaseBackupManager()
    print(f'Dump command: {manager.dump_command}')
    print(f'SSL args: {manager._get_ssl_args()}')
    "
    
    # On host system (if MySQL client installed)
    python3 -c "
    from app.database_backup import DatabaseBackupManager
    manager = DatabaseBackupManager()
    print(f'Dump command: {manager.dump_command}')
    print(f'SSL args: {manager._get_ssl_args()}')
    "
    

Post-Merge Testing

  1. Verify both deployment methods still work
  2. Test backup/restore in both environments
  3. Verify scheduled backups function correctly
  4. Check error handling when tools are missing

📋 Merge Checklist

  • No merge conflicts detected
  • Compatibility layer implemented in database_backup.py
  • Environment detection for Docker vs Gunicorn
  • Dynamic command selection (mariadb-dump vs mysqldump)
  • Conditional SSL flag handling
  • UI improvements (sticky headers) are purely CSS/JS - no conflicts
  • Quality code display changes are frontend-only - no conflicts
  • New documentation files added - no conflicts
  • Docker-specific files don't affect Gunicorn deployment

Safe to Merge Because:

  1. Additive Changes: Most changes are new files or new features
  2. Backward Compatible: Code detects environment and adapts
  3. No Breaking Changes: Gunicorn deployment still works without Docker
  4. Independent Features: UI improvements work in any environment
  5. Fail-Safe Defaults: Falls back to mysqldump if mariadb-dump unavailable

🚀 Merge Process

cd /srv/quality_app

# 1. Ensure working directory is clean
git status

# 2. Switch to master branch
git checkout master

# 3. Pull latest changes
git pull origin master

# 4. Merge docker-deploy (should be clean merge)
git merge docker-deploy

# 5. Review merge
git log --oneline -10

# 6. Test in current environment
# (If using systemd, test the app)
# (If using Docker, test with docker-compose)

# 7. Push to remote
git push origin master

# 8. Tag the release (optional)
git tag -a v2.0-docker -m "Docker deployment support with compatibility layer"
git push origin v2.0-docker

Rollback Plan (if needed):

# If issues arise after merge
git log --oneline -10  # Find commit hash before merge
git reset --hard <commit-hash-before-merge>
git push origin master --force  # Use with caution!

# Or revert the merge commit
git revert -m 1 <merge-commit-hash>
git push origin master

🎓 Key Improvements in docker-deploy Branch

1. Bug Fixes

  • Fixed result_success variable error → result.returncode == 0
  • Fixed restore SQL parsing with sed preprocessing
  • Fixed missing mariadb-client in Docker container

2. Docker Support

  • Complete Docker Compose setup
  • Volume mapping for persistent data
  • Health checks and resource limits
  • Environment-based configuration

3. UI Enhancements

  • Sticky table headers for scrollable reports
  • Quality code 0 displays as "OK" (green)
  • CSV export preserves original "0" value

4. Compatibility

  • Works in Docker AND traditional Gunicorn deployment
  • Auto-detects available backup tools
  • Environment-aware SSL handling
  • No breaking changes to existing functionality

📞 Support

If issues arise after merge:

  1. Check environment detection: ls -la /.dockerenv
  2. Verify backup tools: which mysqldump mariadb-dump
  3. Review logs: docker-compose logs web or application logs
  4. Test backup manually from command line
  5. Fall back to master branch if critical issues occur

Last Updated: 2025-11-13
Branch: docker-deploy → master
Status: Ready for merge