18 KiB
Phase 6: Data Backup & Cleanup Guide
Version: 1.0
Created: January 9, 2026
Purpose: Pre-V1.0 Launch Database Preparation
📋 Table of Contents
- Overview
- What Was Created
- When to Use
- Pre-Execution Checklist
- Command 1: Export System Config
- Command 2: Cleanup User Data
- Complete Workflow
- Safety Measures
- Rollback Procedures
- FAQ
📖 Overview
Phase 6 provides two Django management commands to safely prepare your IGNY8 database for V1.0 production launch:
- Export System Configuration - Backs up all system settings to JSON files
- Cleanup User Data - Removes all test/development user data while preserving system configuration
Why These Commands?
- Clean Start: Launch V1.0 with a pristine database
- Configuration Preservation: Keep all your carefully configured settings
- Safety First: Multiple safety checks and dry-run options
- Audit Trail: Complete metadata and logging
🛠️ What Was Created
File Locations
backend/igny8_core/management/commands/
├── export_system_config.py # System configuration backup
└── cleanup_user_data.py # User data cleanup
Command 1: export_system_config.py
Purpose: Exports all system configuration to JSON files for backup and version control.
What it exports:
- ✅ Subscription Plans (Starter, Growth, Scale)
- ✅ Credit Cost Configurations
- ✅ AI Model Settings (OpenAI, Anthropic, etc.)
- ✅ Global Integration Settings
- ✅ Industries and Sectors
- ✅ Seed Keywords (reference data)
- ✅ Author Profiles
- ✅ AI Prompts and Variables
What it creates:
- Individual JSON files for each data type
export_metadata.jsonwith timestamp and statistics- Organized folder structure in
backups/config/
Command 2: cleanup_user_data.py
Purpose: Safely removes all user-generated test data before production launch.
What it deletes:
- 🗑️ Sites and Site Settings
- 🗑️ Keywords, Clusters, Ideas
- 🗑️ Tasks, Content, Images
- 🗑️ Publishing Records
- 🗑️ WordPress Sync Events
- 🗑️ Credit Transactions and Usage Logs
- 🗑️ Automation Runs
- 🗑️ Notifications
- 🗑️ Orders
What it preserves:
- ✅ User Accounts (admin users)
- ✅ System Configuration (all settings from export)
- ✅ Plans and Pricing
- ✅ AI Models and Prompts
- ✅ Industries and Sectors
⏰ When to Use
Correct Timing
✅ Use these commands when:
- You're preparing for V1.0 production launch
- You've completed all testing and configuration
- You want to start production with clean data
- All system settings (Plans, AI models, prompts) are finalized
❌ Do NOT use these commands when:
- You're still in active development
- You haven't backed up your configurations
- You're unsure about your system settings
- You're in production with live users
Recommended Timeline
Day -7: Final configuration review
Day -5: Export system config (first backup)
Day -3: Test commands in staging
Day -2: Export system config (final backup)
Day -1: Cleanup user data in staging
Day 0: Launch day - cleanup in production
✅ Pre-Execution Checklist
Before running ANY Phase 6 command, complete this checklist:
Environment Verification
- Confirm you're in the correct environment (staging vs production)
- Check
ENVIRONMENTsetting in Django settings - Verify database connection is correct
- Ensure you have full database backup
System State
- All Plans configured and tested
- All AI prompts finalized
- All credit costs verified
- All industries/sectors populated
- Seed keywords imported
Safety Backups
- Full database dump exists
- Previous export exists (if available)
- Media files backed up
- Environment variables documented
Access & Permissions
- You have Django shell access
- You have database backup access
- You have rollback permissions
- Stakeholders notified
📤 Command 1: Export System Config
Basic Usage
cd /data/app/igny8/backend
python manage.py export_system_config
With Custom Output Directory
python manage.py export_system_config --output-dir=/path/to/backup
Step-by-Step Execution
Step 1: Navigate to Backend
cd /data/app/igny8/backend
Step 2: Run Export
python manage.py export_system_config --output-dir=../backups/config/$(date +%Y%m%d)
Step 3: Verify Output
ls -la ../backups/config/$(date +%Y%m%d)/
Expected output:
plans.json # Subscription plans
credit_costs.json # Credit cost configurations
ai_models.json # AI model settings
global_integrations.json # Integration settings
industries.json # Industry master data
sectors.json # Sector master data
seed_keywords.json # Reference keywords
author_profiles.json # Writing style profiles
prompts.json # AI prompts
prompt_variables.json # Prompt variables
export_metadata.json # Export timestamp & stats
Step 4: Verify Data
Check one of the exports:
cat ../backups/config/$(date +%Y%m%d)/plans.json | head -20
Step 5: Commit to Version Control
cd /data/app/igny8
git add backups/config/
git commit -m "Backup: V1.0 system configuration export"
git push
What The Output Looks Like
Exporting system configuration to: /data/app/igny8/backups/config/20260109
✓ Exported 3 Subscription Plans → plans.json
✓ Exported 12 Credit Cost Configurations → credit_costs.json
✓ Exported 4 AI Model Configurations → ai_models.json
✓ Exported 1 Global Integration Settings → global_integrations.json
✓ Exported 15 Industries → industries.json
✓ Exported 47 Sectors → sectors.json
✓ Exported 523 Seed Keywords → seed_keywords.json
✓ Exported 3 Author Profiles → author_profiles.json
✓ Exported 8 AI Prompts → prompts.json
✓ Exported 12 Prompt Variables → prompt_variables.json
✓ Metadata saved to export_metadata.json
======================================================================
System Configuration Export Complete!
Successful: 10 exports
Failed: 0 exports
Location: /data/app/igny8/backups/config/20260109
======================================================================
Troubleshooting
Problem: "No module named 'django'"
# Solution: Activate virtual environment or use Docker
docker-compose exec backend python manage.py export_system_config
Problem: "Permission denied" when writing files
# Solution: Check directory permissions
mkdir -p ../backups/config
chmod 755 ../backups/config
Problem: Empty JSON files
# Solution: Verify data exists in database
python manage.py shell
>>> from igny8_core.modules.billing.models import Plan
>>> Plan.objects.count()
🗑️ Command 2: Cleanup User Data
⚠️ CRITICAL WARNING
THIS COMMAND PERMANENTLY DELETES DATA
- Cannot be undone without database restore
- Removes ALL user-generated content
- Should ONLY be run before production launch
- ALWAYS run
--dry-runfirst
Safety Features
- Dry-Run Mode: Preview deletions without actually deleting
- Confirmation Prompt: Must type "DELETE ALL DATA" to proceed
- Production Protection: Blocked in production environment (unless explicitly allowed)
- Transaction Safety: All deletions in atomic transaction
- Detailed Logging: Shows exactly what was deleted
Usage: Dry Run (Always First!)
cd /data/app/igny8/backend
python manage.py cleanup_user_data --dry-run
Dry Run Output Example
======================================================================
DRY RUN - No data will be deleted
======================================================================
✓ Would delete 1,234 Notifications
✓ Would delete 5,678 Credit Usage Logs
✓ Would delete 456 Credit Transactions
✓ Would delete 23 Orders
✓ Would delete 8,901 WordPress Sync Events
✓ Would delete 234 Publishing Records
✓ Would delete 45 Automation Runs
✓ Would delete 3,456 Images
✓ Would delete 2,345 Content
✓ Would delete 4,567 Tasks
✓ Would delete 5,678 Content Ideas
✓ Would delete 1,234 Clusters
✓ Would delete 9,876 Keywords
✓ Would delete 12 Sites
→ Keeping 3 Users (not deleted)
Total records to delete: 43,739
======================================================================
To proceed with actual deletion, run:
python manage.py cleanup_user_data --confirm
======================================================================
Usage: Actual Cleanup
python manage.py cleanup_user_data --confirm
You will be prompted:
======================================================================
⚠️ DELETING ALL USER DATA - THIS CANNOT BE UNDONE!
======================================================================
Type "DELETE ALL DATA" to proceed:
Type exactly: DELETE ALL DATA
Actual Cleanup Output
Proceeding with deletion...
✓ Deleted 1,234 Notifications
✓ Deleted 5,678 Credit Usage Logs
✓ Deleted 456 Credit Transactions
✓ Deleted 23 Orders
✓ Deleted 8,901 WordPress Sync Events
✓ Deleted 234 Publishing Records
✓ Deleted 45 Automation Runs
✓ Deleted 3,456 Images
✓ Deleted 2,345 Content
✓ Deleted 4,567 Tasks
✓ Deleted 5,678 Content Ideas
✓ Deleted 1,234 Clusters
✓ Deleted 9,876 Keywords
✓ Deleted 12 Sites
======================================================================
User Data Cleanup Complete!
Total records deleted: 43,739
Failed deletions: 0
======================================================================
Production Environment Protection
If you try to run cleanup in production:
⚠️ BLOCKED: Cannot run cleanup in PRODUCTION environment!
To allow this, temporarily set ENVIRONMENT to "staging" in settings.
To override (ONLY if absolutely necessary):
# In settings.py - TEMPORARY
ENVIRONMENT = 'staging' # Change back after cleanup!
🔄 Complete Workflow
Full Pre-Launch Procedure
# ========================================
# STEP 1: FULL DATABASE BACKUP
# ========================================
cd /data/app/igny8/backend
pg_dump -h localhost -U postgres igny8_db > ../backups/$(date +%Y%m%d)_pre_v1_full_backup.sql
# Verify backup exists and has content
ls -lh ../backups/$(date +%Y%m%d)_pre_v1_full_backup.sql
head -50 ../backups/$(date +%Y%m%d)_pre_v1_full_backup.sql
# ========================================
# STEP 2: EXPORT SYSTEM CONFIGURATION
# ========================================
python manage.py export_system_config --output-dir=../backups/config/$(date +%Y%m%d)
# Verify exports
ls -la ../backups/config/$(date +%Y%m%d)/
# Review critical configs
cat ../backups/config/$(date +%Y%m%d)/plans.json | python -m json.tool | head -30
cat ../backups/config/$(date +%Y%m%d)/credit_costs.json | python -m json.tool | head -30
# ========================================
# STEP 3: COMMIT CONFIGS TO GIT
# ========================================
cd /data/app/igny8
git add backups/config/
git commit -m "Pre-V1.0: System configuration backup $(date +%Y%m%d)"
git push
# ========================================
# STEP 4: BACKUP MEDIA FILES
# ========================================
cd /data/app/igny8
tar -czf backups/$(date +%Y%m%d)_media_backup.tar.gz backend/media/
# ========================================
# STEP 5: DRY RUN CLEANUP (REVIEW CAREFULLY)
# ========================================
cd backend
python manage.py cleanup_user_data --dry-run
# Review the counts - make sure they're expected
# ========================================
# STEP 6: ACTUAL CLEANUP (POINT OF NO RETURN)
# ========================================
python manage.py cleanup_user_data --confirm
# Type: DELETE ALL DATA
# ========================================
# STEP 7: VERIFY CLEANUP
# ========================================
python manage.py shell << 'EOF'
from igny8_core.auth.models import Site, CustomUser
from igny8_core.business.planning.models import Keywords
from igny8_core.modules.billing.models import Plan
print(f"Sites: {Site.objects.count()} (should be 0)")
print(f"Keywords: {Keywords.objects.count()} (should be 0)")
print(f"Users: {CustomUser.objects.count()} (admins preserved)")
print(f"Plans: {Plan.objects.count()} (should have your plans)")
EOF
# ========================================
# STEP 8: TEST APPLICATION
# ========================================
python manage.py runserver 0.0.0.0:8000 &
# Visit app and verify:
# - Can login as admin
# - Dashboard loads (empty state)
# - Plans visible in settings
# - Can create new user account
# ========================================
# STEP 9: TAG RELEASE
# ========================================
cd /data/app/igny8
git tag -a v1.0.0-clean -m "V1.0.0 - Clean database ready for launch"
git push origin v1.0.0-clean
🛡️ Safety Measures
Built-in Protections
- Atomic Transactions: All deletions in single transaction - all or nothing
- Production Check: Requires explicit override in production
- Confirmation Prompt: Must type exact phrase
- Dry Run: See exactly what will be deleted
- Detailed Logging: Know what was deleted and any failures
Manual Safety Checklist
Before running cleanup:
- Full database backup exists and verified
- System config export completed and committed to git
- Media files backed up
- Dry run reviewed and counts are expected
- Stakeholders notified of pending cleanup
- Rollback plan documented and tested
- Off-hours execution scheduled (if production)
- Monitoring ready to catch any issues
Additional Recommendations
- Staging First: Always test in staging environment first
- Screenshot Evidence: Take screenshots of dry-run output
- Communication: Notify team before and after
- Timing: Run during low-traffic hours
- Verification: Test application immediately after
🔙 Rollback Procedures
If Something Goes Wrong
During Cleanup (Transaction Failed)
No action needed - atomic transaction will automatically rollback.
After Cleanup (Need to Restore)
# OPTION 1: Restore from PostgreSQL backup
cd /data/app/igny8
psql -U postgres -d igny8_db < backups/20260109_pre_v1_full_backup.sql
# OPTION 2: Restore specific tables (if partial restore needed)
pg_restore -U postgres -d igny8_db -t "specific_table" backups/20260109_pre_v1_full_backup.sql
# OPTION 3: Restore from Docker backup (if using Docker)
docker-compose exec -T db psql -U postgres igny8_db < backups/20260109_pre_v1_full_backup.sql
Restore Media Files
cd /data/app/igny8
tar -xzf backups/20260109_media_backup.tar.gz -C backend/
Verify Restore
cd backend
python manage.py shell << 'EOF'
from igny8_core.auth.models import Site
from igny8_core.business.planning.models import Keywords
print(f"Sites restored: {Site.objects.count()}")
print(f"Keywords restored: {Keywords.objects.count()}")
EOF
❓ FAQ
Q: Can I run these commands multiple times?
A:
- Export Config: Yes, safe to run multiple times. Creates timestamped backups.
- Cleanup: Yes, but after first cleanup there's nothing left to delete (idempotent).
Q: What if I only want to delete some data?
A: These commands are all-or-nothing by design for safety. To delete specific data, use Django admin or write a custom management command.
Q: Can I restore individual items from the export?
A: Yes! The JSON files use Django's standard serialization format. Use python manage.py loaddata <file>.json to restore.
Q: Will this affect my development environment?
A: Only if you run it there. These commands work on whatever database your Django settings point to.
Q: How long does cleanup take?
A: Depends on data volume. Typical ranges:
- Small (< 10k records): 1-5 seconds
- Medium (10k-100k): 5-30 seconds
- Large (> 100k): 30-120 seconds
Q: What if cleanup fails halfway?
A: Can't happen - it's wrapped in an atomic transaction. Either everything deletes or nothing does.
Q: Do I need to stop the application?
A: Recommended but not required. Stopping the app prevents race conditions during cleanup.
Q: Can I schedule these as cron jobs?
A:
- Export: Yes, great for automated backups
- Cleanup: No, should only be run manually with explicit confirmation
Q: What about Django migrations?
A: Cleanup only deletes data, not schema. All tables and migrations remain intact.
Q: How do I know if my system config is complete?
A: Run the export and review the counts in export_metadata.json. Compare with your documentation.
📞 Support
If You Need Help
- Check this guide thoroughly first
- Review error messages carefully
- Test in staging before production
- Contact team if unsure about any step
Emergency Contacts
- Database Issues: DBA team
- Application Issues: Backend team
- Configuration Questions: System admin
- Rollback Needed: All hands on deck!
✅ Success Criteria
After completing Phase 6, you should have:
- ✅ Multiple timestamped config exports in
backups/config/ - ✅ Full database SQL backup in
backups/ - ✅ Media files backup in
backups/ - ✅ Zero user-generated data in database
- ✅ All system configurations intact
- ✅ Application starts and loads empty state
- ✅ Admin can log in
- ✅ New users can sign up
- ✅ Plans visible and functional
- ✅ Git tag created for v1.0.0-clean
Document Version: 1.0
Last Updated: January 9, 2026
Next Review: After V1.0 Launch
This guide is part of the IGNY8 Pre-Launch Preparation (Phase 6)