# Production Database Cleanup Task ## Purpose Clean the production database so you can load **new real data** that will reflect across the system at all levels. This removes existing (e.g. test/demo) data and leaves the database in a state where: - Schema and migrations are unchanged - One System Administrator user remains for configuration - All business data (contacts, deals, quotes, projects, etc.) is removed so you can enter new real data manually ## ⚠️ Important - **Back up the production database** before running any cleanup. - Run this **only on the production server** (or a copy of it) when you are ready to wipe current data. - After cleanup, the seed will recreate **default login users** (see credentials at the end of this doc). Change their passwords after first login if needed. --- ## Option 1: Clean + Re-seed (Recommended) This truncates all tables and then runs the seed so you get: - Empty business data (contacts, deals, quotes, projects, inventory, etc.) - One System Administrator user (admin@system.local) with full access to all modules ### Steps on production server **Option A – One script (backup + clean + seed)** From the repo root on the production server: ```bash bash backend/scripts/run-production-clean-and-seed.sh ``` This will prompt for `YES`, create a backup under `backups/`, then run clean-and-seed. Restart the app after. **Option B – Manual steps** 1. **Back up the database** ```bash pg_dump $DATABASE_URL > backup_before_cleanup_$(date +%Y%m%d_%H%M%S).sql ``` 2. **Go to backend and run the cleanup script** ```bash cd backend npm run db:clean-and-seed ``` 3. **Restart the application** so it uses the cleaned DB. 4. Log in with one of the default users and start entering real data (contacts, deals, etc.). --- ## Option 2: Full reset (drop and recreate database) Use only if you want to **drop the entire database** and recreate it from migrations (e.g. to fix schema drift). 1. **Back up the database** (see above). 2. **Reset and seed** ```bash cd backend npx prisma migrate reset --force ``` This will: - Drop the database - Recreate it from migrations - Run the seed 3. **Restart the application.** --- ## What gets removed (Option 1) All rows are removed from every table, including: - Contacts, contact relationships, contact categories links - Deals, quotes, cost sheets, contracts, invoices - Projects, tasks, project members, expenses - Inventory, products, warehouses, movements, assets - Campaigns, activities, notes, attachments - HR data: attendances, leaves, salaries, evaluations, etc. - Audit logs, notifications, approvals - Users, employees, departments, positions, permissions Then the **seed** recreates only the base data (one System Administrator user with full access). No categories, pipelines, or warehouses—you configure these manually. --- ## Default user after re-seed | Role | Email | Password | Access | |-------------------|----------------------|-----------|-------------| | System Administrator | admin@system.local | Admin@123 | Full system | Change the password after first login in production. --- ## If you use Docker Run the cleanup inside the backend container or against the same `DATABASE_URL` your app uses: ```bash # Example: run inside backend container docker compose exec backend npm run db:clean-and-seed ``` Or run the script from your host with `DATABASE_URL` set to the production DB connection string. --- ## Troubleshooting - **"Cannot truncate because of foreign key"** – The script uses `CASCADE`; if you see this, ensure you’re on PostgreSQL and using the provided script. - **Seed fails (e.g. duplicate key)** – Ensure the cleanup step completed; run the script again (cleanup is idempotent, then seed runs once). - **App still shows old data** – Restart the backend/API and clear browser cache; ensure `DATABASE_URL` points to the database you cleaned.