9.3 KiB
File Path Migration Guide
Overview
This guide covers the database migration scripts created to convert absolute file paths to relative paths in the VFX Project Management System. This migration addresses the issue where absolute paths stored in the database become invalid when deploying to different environments, particularly Linux.
Problem Statement
The system previously stored absolute file paths like:
D:\Repo\LinkDesk\backend\uploads\submissions\98\v001_render.jpg/home/user/vfx-system/backend/uploads/attachments/123/reference.pdf
These paths become invalid when:
- Deploying to different operating systems
- Moving the backend directory
- Running in containerized environments
Solution
Convert all absolute paths to relative paths:
uploads/submissions/98/v001_render.jpguploads/attachments/123/reference.pdfuploads/project_thumbnails/project_1_thumbnail.jpg
Migration Scripts
1. migrate_file_paths_to_relative.py
Purpose: Basic migration script for development use.
Features:
- Converts absolute paths to relative paths in all three tables
- Basic validation and error handling
- Interactive confirmation prompt
- Detailed logging
Usage:
cd backend
python migrate_file_paths_to_relative.py
2. migrate_file_paths_production.py
Purpose: Production-ready migration script with comprehensive validation.
Features:
- Automatic database backup creation
- Pre-migration analysis of problematic paths
- Enhanced error handling and recovery
- Comprehensive validation of results
- Detailed logging with timestamps
- Support for multiple absolute path patterns
Usage:
cd backend
python migrate_file_paths_production.py
3. validate_migration_results.py
Purpose: Validation script to verify migration success.
Features:
- Validates all paths are now relative
- Checks file accessibility
- Verifies path format consistency
- Comprehensive reporting
Usage:
cd backend
python validate_migration_results.py
Tables Affected
1. submissions table
- Column:
file_path - Purpose: Stores paths to user-submitted work files
- Example conversion:
- Before:
D:\Repo\LinkDesk\backend\uploads\submissions\98\v001_render.jpg - After:
uploads/submissions/98/v001_render.jpg
- Before:
2. task_attachments table
- Column:
file_path - Purpose: Stores paths to task attachment files
- Example conversion:
- Before:
D:\Repo\LinkDesk\backend\uploads\attachments\98\reference.pdf - After:
uploads/attachments/98/reference.pdf
- Before:
3. projects table
- Column:
thumbnail_path - Purpose: Stores paths to project thumbnail images
- Example conversion:
- Before:
D:\Repo\LinkDesk\backend\uploads\project_thumbnails\project_1_thumb.jpg - After:
uploads/project_thumbnails/project_1_thumb.jpg
- Before:
Migration Process
Pre-Migration Steps
-
Backup Database:
cp database.db database_backup_$(date +%Y%m%d_%H%M%S).db -
Verify Current State:
python validate_migration_results.py
Running Migration
-
Development Environment:
python migrate_file_paths_to_relative.py -
Production Environment:
python migrate_file_paths_production.py
Post-Migration Validation
-
Validate Results:
python validate_migration_results.py -
Test File Serving:
- Start the backend server
- Test thumbnail URLs in the frontend
- Verify file downloads work correctly
Error Handling
Common Issues and Solutions
-
File Not Found:
- Issue: Original file doesn't exist at expected location
- Solution: Migration logs the issue but continues processing
- Action: Review log files and manually fix missing files
-
Path Conversion Failure:
- Issue: Cannot determine relative path from absolute path
- Solution: Migration attempts multiple conversion strategies
- Action: Review problematic paths in log files
-
Database Transaction Failure:
- Issue: Database error during migration
- Solution: Automatic rollback preserves data integrity
- Action: Fix underlying issue and re-run migration
Recovery Procedures
-
Restore from Backup:
cp database_backup_YYYYMMDD_HHMMSS.db database.db -
Partial Migration Recovery:
- Migration is transactional per table
- Individual table failures don't affect other tables
- Re-run migration to complete partial migrations
Validation Criteria
Success Criteria
- All paths are relative: No absolute paths remain in database
- Files are accessible: All relative paths resolve to existing files
- Format consistency: All paths follow expected format patterns
- No data loss: All original file references are preserved
Validation Checks
-
Path Format Validation:
- Submissions:
uploads/submissions/[task_id]/[filename] - Attachments:
uploads/attachments/[task_id]/[filename] - Projects:
uploads/project_thumbnails/[filename]
- Submissions:
-
File Accessibility:
- All relative paths resolve to existing files
- File permissions allow read access
-
Database Integrity:
- No NULL values introduced
- All foreign key relationships preserved
- No duplicate entries created
Logging and Monitoring
Log Files
- Development:
migration_file_paths.log - Production:
migration_file_paths_YYYYMMDD_HHMMSS.log
Log Levels
- INFO: Normal migration progress
- WARNING: Non-critical issues (missing files, etc.)
- ERROR: Critical issues that prevent migration
Monitoring Points
-
Conversion Statistics:
- Total files processed
- Files successfully converted
- Files skipped (already relative)
- Errors encountered
-
Validation Results:
- Path format compliance
- File accessibility
- Database integrity
Integration with FileHandler
Updated FileHandler Behavior
After migration, the FileHandler class should be updated to:
- Store only relative paths in database
- Resolve relative paths to absolute paths for file operations
- Handle both formats during transition period
Code Changes Required
# Before migration
file_path = "/absolute/path/to/file.jpg"
# After migration
file_path = "uploads/submissions/123/file.jpg"
absolute_path = file_handler.resolve_absolute_path(file_path)
Testing
Test Scenarios
- File Upload: Verify new uploads store relative paths
- File Serving: Verify existing files serve correctly
- Thumbnail Generation: Verify thumbnails work with relative paths
- Cross-Platform: Test on different operating systems
Test Commands
# Test file serving endpoints
curl http://localhost:8000/files/submissions/98/v001_render.jpg
# Test thumbnail URLs
curl http://localhost:8000/files/thumbnails/v001_render_thumb.jpg
# Test project thumbnails
curl http://localhost:8000/files/project_thumbnails/project_1_thumb.jpg
Deployment Checklist
Pre-Deployment
- Database backup created
- Migration scripts tested in staging
- Validation scripts ready
- Rollback procedure documented
During Deployment
- Stop application services
- Run migration script
- Validate migration results
- Update FileHandler code
- Start application services
Post-Deployment
- Test file serving endpoints
- Verify thumbnail URLs work
- Monitor application logs
- Confirm no absolute paths in new uploads
Troubleshooting
Common Problems
-
Migration appears to do nothing:
- Check if paths are already relative
- Review log files for details
-
Files not accessible after migration:
- Verify file permissions
- Check if files were moved or deleted
- Validate relative path resolution
-
Thumbnails not displaying:
- Check thumbnail file existence
- Verify thumbnail path format
- Test thumbnail serving endpoints
Debug Commands
# Check current path formats
python -c "
from models.task import Submission
from database import SessionLocal
db = SessionLocal()
for s in db.query(Submission).limit(5):
print(f'ID: {s.id}, Path: {s.file_path}')
"
# Test path resolution
python -c "
from utils.file_handler import file_handler
from pathlib import Path
backend_dir = Path(__file__).parent
test_path = 'uploads/submissions/98/test.jpg'
resolved = backend_dir / test_path
print(f'Resolved: {resolved}')
print(f'Exists: {resolved.exists()}')
"
Requirements Addressed
This migration addresses the following requirements from the specification:
- 1.1: Convert absolute paths to relative paths in submissions table
- 1.2: Convert absolute paths to relative paths in task_attachments table
- 1.3: Convert absolute paths to relative paths in projects table (thumbnail_path)
- 1.4: Add validation and error handling for problematic paths
- 1.5: Ensure all file paths in database are relative to backend directory
Conclusion
The file path migration scripts provide a comprehensive solution for converting absolute file paths to relative paths, ensuring cross-platform compatibility and system portability. The migration includes robust error handling, validation, and recovery procedures suitable for both development and production environments.