220 lines
5.6 KiB
Markdown
220 lines
5.6 KiB
Markdown
# Complete Migration Reset Plan - Backup, Recreate, Restore
|
|
|
|
## Overview
|
|
This plan will:
|
|
1. Backup all database data
|
|
2. Remove WorkflowState from migrations
|
|
3. Delete all migration files
|
|
4. Generate fresh 0001_initial.py migrations
|
|
5. Recreate database
|
|
6. Restore data
|
|
|
|
## Database Detection
|
|
- **Primary**: PostgreSQL (from DATABASE_URL or DB_* env vars)
|
|
- **Fallback**: SQLite (if no PostgreSQL config)
|
|
- **Detection**: Check DATABASE_URL or DB_ENGINE env vars
|
|
|
|
---
|
|
|
|
## Step-by-Step Execution Plan
|
|
|
|
### PHASE 1: PREPARATION & BACKUP
|
|
|
|
#### Step 1.1: Detect Database Type
|
|
- Read `settings.py` to determine database engine
|
|
- Check environment variables: `DATABASE_URL`, `DB_ENGINE`, `DB_HOST`, etc.
|
|
- Determine if PostgreSQL or SQLite
|
|
|
|
#### Step 1.2: Create Backup Script
|
|
**For PostgreSQL:**
|
|
```bash
|
|
# Backup script: backup_db.sh
|
|
pg_dump -h $DB_HOST -U $DB_USER -d $DB_NAME -F c -f backup_$(date +%Y%m%d_%H%M%S).dump
|
|
```
|
|
|
|
**For SQLite:**
|
|
```bash
|
|
# Backup script: backup_db.sh
|
|
cp $DB_PATH backup_$(date +%Y%m%d_%H%M%S).sqlite3
|
|
```
|
|
|
|
#### Step 1.3: Execute Backup
|
|
- Run backup script
|
|
- Verify backup file created
|
|
- Store backup path for restore
|
|
|
|
---
|
|
|
|
### PHASE 2: MIGRATION CLEANUP
|
|
|
|
#### Step 2.1: Remove WorkflowState from Migration 0003
|
|
**File**: `backend/igny8_core/business/site_building/migrations/0003_workflow_and_taxonomies.py`
|
|
|
|
**Actions:**
|
|
- Remove `CreateModel` for WorkflowState (lines 37-59)
|
|
- Remove 3 `AddIndex` operations for WorkflowState (lines 98-109)
|
|
- Keep: SiteBlueprintCluster, SiteBlueprintTaxonomy, and their indexes
|
|
|
|
#### Step 2.2: Identify All Apps with Migrations
|
|
Apps to process:
|
|
1. `igny8_core.auth` (label: `igny8_core_auth`)
|
|
2. `igny8_core.modules.planner` (label: `planner`)
|
|
3. `igny8_core.modules.writer` (label: `writer`)
|
|
4. `igny8_core.modules.system` (label: `system`)
|
|
5. `igny8_core.modules.billing` (label: `billing`)
|
|
6. `igny8_core.business.site_building` (label: `site_building`)
|
|
7. `igny8_core.business.optimization` (label: `optimization`)
|
|
8. `igny8_core.business.publishing` (label: `publishing`)
|
|
9. `igny8_core.business.integration` (label: `integration`)
|
|
10. `igny8_core.modules.automation` (label: `automation`)
|
|
11. `igny8_core.business.automation` (label: `automation`)
|
|
|
|
#### Step 2.3: Delete All Migration Files
|
|
**For each app:**
|
|
- List all files in `*/migrations/` directory
|
|
- Delete all `*.py` files EXCEPT `__init__.py`
|
|
- Keep `__pycache__/` directory (will be regenerated)
|
|
|
|
**Files to delete:**
|
|
- `0001_initial.py`
|
|
- `0002_*.py`
|
|
- `0003_*.py`
|
|
- ... (all numbered migrations)
|
|
|
|
---
|
|
|
|
### PHASE 3: GENERATE NEW MIGRATIONS
|
|
|
|
#### Step 3.1: Generate Fresh Migrations
|
|
**Command:**
|
|
```bash
|
|
cd backend
|
|
python manage.py makemigrations
|
|
```
|
|
|
|
This will create new `0001_initial.py` for each app based on current models.
|
|
|
|
#### Step 3.2: Verify New Migrations
|
|
- Check each app has new `0001_initial.py`
|
|
- Verify WorkflowState is NOT in site_building migration
|
|
- Verify all other models are present
|
|
|
|
---
|
|
|
|
### PHASE 4: DATABASE RECREATION
|
|
|
|
#### Step 4.1: Drop Database
|
|
**For PostgreSQL:**
|
|
```bash
|
|
# Connect to postgres database (not app database)
|
|
psql -h $DB_HOST -U postgres -c "DROP DATABASE IF EXISTS $DB_NAME;"
|
|
psql -h $DB_HOST -U postgres -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;"
|
|
```
|
|
|
|
**For SQLite:**
|
|
```bash
|
|
rm $DB_PATH # Delete SQLite file
|
|
```
|
|
|
|
#### Step 4.2: Run New Migrations
|
|
```bash
|
|
cd backend
|
|
python manage.py migrate
|
|
```
|
|
|
|
This creates all tables with new structure (no WorkflowState table).
|
|
|
|
---
|
|
|
|
### PHASE 5: DATA RESTORATION
|
|
|
|
#### Step 5.1: Restore Data
|
|
**For PostgreSQL:**
|
|
```bash
|
|
pg_restore -h $DB_HOST -U $DB_USER -d $DB_NAME -c backup_*.dump
|
|
```
|
|
|
|
**For SQLite:**
|
|
```bash
|
|
# SQLite backup is just a copy, so:
|
|
cp backup_*.sqlite3 $DB_PATH
|
|
```
|
|
|
|
#### Step 5.2: Handle WorkflowState Data
|
|
**Important**: The backup contains WorkflowState table data, but new schema doesn't have it.
|
|
|
|
**Options:**
|
|
- **Option A**: Restore will fail on WorkflowState table - ignore error (table doesn't exist)
|
|
- **Option B**: Use `pg_restore --exclude-table=igny8_site_blueprint_workflow_states` to skip it
|
|
- **Option C**: Manually edit backup to remove WorkflowState data before restore
|
|
|
|
**Recommended**: Option B - exclude WorkflowState table during restore
|
|
|
|
#### Step 5.3: Verify Data Restored
|
|
- Check row counts match original
|
|
- Verify critical tables have data
|
|
- Test application functionality
|
|
|
|
---
|
|
|
|
## Execution Script Structure
|
|
|
|
```python
|
|
# reset_migrations.py
|
|
1. detect_database_type()
|
|
2. backup_database()
|
|
3. remove_workflowstate_from_migration()
|
|
4. delete_all_migration_files()
|
|
5. generate_new_migrations()
|
|
6. drop_and_recreate_database()
|
|
7. run_migrations()
|
|
8. restore_data(exclude_workflowstate=True)
|
|
9. verify_restoration()
|
|
```
|
|
|
|
---
|
|
|
|
## Safety Checks
|
|
|
|
### Before Starting:
|
|
- [ ] Verify database connection works
|
|
- [ ] Check disk space for backup
|
|
- [ ] Confirm backup location is writable
|
|
- [ ] Document current migration state
|
|
|
|
### After Each Phase:
|
|
- [ ] Verify backup file exists and is valid
|
|
- [ ] Confirm migrations deleted correctly
|
|
- [ ] Verify new migrations generated
|
|
- [ ] Check database recreated successfully
|
|
- [ ] Validate data restored
|
|
|
|
---
|
|
|
|
## Rollback Plan
|
|
|
|
If something goes wrong:
|
|
1. **Stop immediately**
|
|
2. **Restore from backup**: Use backup file to restore original database
|
|
3. **Restore migrations**: Git checkout original migration files
|
|
4. **Verify**: Test application works
|
|
|
|
---
|
|
|
|
## Estimated Time
|
|
- Backup: 1-5 minutes (depends on data size)
|
|
- Migration cleanup: 2-3 minutes
|
|
- Generate migrations: 1-2 minutes
|
|
- Database recreation: 1-2 minutes
|
|
- Data restoration: 2-10 minutes (depends on data size)
|
|
- **Total**: ~10-25 minutes
|
|
|
|
---
|
|
|
|
## Notes
|
|
- WorkflowState table data will be lost (intentional)
|
|
- All other data preserved
|
|
- Migration history reset to clean state
|
|
- All apps start with fresh 0001_initial.py
|
|
|