- 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
293 lines
8.5 KiB
Markdown
293 lines
8.5 KiB
Markdown
# 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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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:**
|
|
```bash
|
|
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:**
|
|
```bash
|
|
# 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:**
|
|
```bash
|
|
# 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
|
|
|
|
- [x] No merge conflicts detected
|
|
- [x] Compatibility layer implemented in `database_backup.py`
|
|
- [x] Environment detection for Docker vs Gunicorn
|
|
- [x] Dynamic command selection (mariadb-dump vs mysqldump)
|
|
- [x] Conditional SSL flag handling
|
|
- [x] UI improvements (sticky headers) are purely CSS/JS - no conflicts
|
|
- [x] Quality code display changes are frontend-only - no conflicts
|
|
- [x] New documentation files added - no conflicts
|
|
- [x] 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
|
|
|
|
### Recommended Steps:
|
|
```bash
|
|
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):
|
|
```bash
|
|
# 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 ✅
|