#!/bin/bash # ============================================================================= # Life OS - Step 1: DEV Database Setup # Applies R1 schema to lifeos_dev, migrates data from lifeos_prod (R0) # Run on: defiant-01 as root # ============================================================================= set -e DB_CONTAINER="lifeos-db" DB_USER="postgres" DEV_DB="lifeos_dev" PROD_DB="lifeos_prod" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" section() { echo "" echo "==============================================" echo " $1" echo "==============================================" } # ============================================================================= # 1. Verify prerequisites # ============================================================================= section "1. Verifying prerequisites" echo "Checking lifeos-db container..." if ! docker ps | grep -q "$DB_CONTAINER"; then echo "ERROR: $DB_CONTAINER is not running" exit 1 fi echo "OK: $DB_CONTAINER is running" echo "Checking lifeos_dev database exists..." DEV_EXISTS=$(docker exec $DB_CONTAINER psql -U $DB_USER -tc "SELECT 1 FROM pg_database WHERE datname='$DEV_DB'" | tr -d ' ') if [ "$DEV_EXISTS" != "1" ]; then echo "ERROR: $DEV_DB database does not exist" exit 1 fi echo "OK: $DEV_DB exists" echo "Checking lifeos_prod database exists..." PROD_EXISTS=$(docker exec $DB_CONTAINER psql -U $DB_USER -tc "SELECT 1 FROM pg_database WHERE datname='$PROD_DB'" | tr -d ' ') if [ "$PROD_EXISTS" != "1" ]; then echo "ERROR: $PROD_DB database does not exist" exit 1 fi echo "OK: $PROD_DB exists" echo "Checking R0 data in lifeos_prod..." R0_DOMAINS=$(docker exec $DB_CONTAINER psql -U $DB_USER -d $PROD_DB -tc "SELECT count(*) FROM domains" 2>/dev/null | tr -d ' ') echo "R0 domains count: $R0_DOMAINS" if [ "$R0_DOMAINS" = "0" ] || [ -z "$R0_DOMAINS" ]; then echo "WARNING: No domains found in lifeos_prod. Migration will produce empty tables." fi # ============================================================================= # 2. Drop existing R1 tables in lifeos_dev (clean slate) # ============================================================================= section "2. Cleaning lifeos_dev (drop all tables)" docker exec $DB_CONTAINER psql -U $DB_USER -d $DEV_DB -c " DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO $DB_USER; GRANT ALL ON SCHEMA public TO public; " echo "OK: lifeos_dev schema reset" # ============================================================================= # 3. Apply R1 schema # ============================================================================= section "3. Applying R1 schema to lifeos_dev" docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DEV_DB < "$SCRIPT_DIR/lifeos_r1_full_schema.sql" echo "OK: R1 schema applied" # Verify table count TABLE_COUNT=$(docker exec $DB_CONTAINER psql -U $DB_USER -d $DEV_DB -tc " SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' " | tr -d ' ') echo "Tables created: $TABLE_COUNT" # ============================================================================= # 4. Run data migration (R0 -> R1) # ============================================================================= section "4. Migrating data from lifeos_prod (R0) to lifeos_dev (R1)" docker exec -i $DB_CONTAINER psql -U $DB_USER -d $DEV_DB < "$SCRIPT_DIR/lifeos_r0_to_r1_migration.sql" echo "OK: Data migration complete" # ============================================================================= # 5. Final verification # ============================================================================= section "5. Final verification" echo "R1 table row counts:" docker exec $DB_CONTAINER psql -U $DB_USER -d $DEV_DB -c " SELECT 'domains' as table_name, count(*) FROM domains UNION ALL SELECT 'areas', count(*) FROM areas UNION ALL SELECT 'projects', count(*) FROM projects UNION ALL SELECT 'tasks', count(*) FROM tasks UNION ALL SELECT 'notes', count(*) FROM notes UNION ALL SELECT 'links', count(*) FROM links UNION ALL SELECT 'daily_focus', count(*) FROM daily_focus UNION ALL SELECT 'capture', count(*) FROM capture UNION ALL SELECT 'context_types', count(*) FROM context_types UNION ALL SELECT 'contacts', count(*) FROM contacts UNION ALL SELECT 'meetings', count(*) FROM meetings UNION ALL SELECT 'decisions', count(*) FROM decisions UNION ALL SELECT 'releases', count(*) FROM releases UNION ALL SELECT 'processes', count(*) FROM processes ORDER BY table_name; " echo "" echo "==============================================" echo " DEV database setup complete." echo " lifeos_dev has R1 schema + migrated R0 data." echo " lifeos_prod R0 data is UNTOUCHED." echo "=============================================="