Files
maternal-app/PRODUCTION_DEPLOYMENT_CHECKLIST.md
Andrei c22fa82521
Some checks failed
ParentFlow CI/CD Pipeline / Backend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Frontend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Security Scanning (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-app/maternal-app-backend dockerfile:Dockerfile.production name:backend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-web dockerfile:Dockerfile.production name:frontend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Development (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Lint and Test (push) Has been cancelled
CI/CD Pipeline / E2E Tests (push) Has been cancelled
CI/CD Pipeline / Build Application (push) Has been cancelled
feat: Implement comprehensive error handling and production deployment pipeline
## Error Handling System
- Add centralized error handling utilities (errorHandler.ts)
- Create reusable error components (ErrorMessage, ErrorToast)
- Implement multilingual error support (preserves backend error messages in 5 languages)
- Update 15+ forms and components with consistent error handling
  - Auth forms: login, register, forgot-password
  - Family management: family page, join family dialog
  - Child management: child dialog
  - All tracking forms: feeding, sleep, diaper, medicine, growth, activity

## Production Build Fixes
- Fix backend TypeScript errors: InviteCode.uses → InviteCode.useCount (5 instances)
- Remove non-existent savedFamily variable from registration response
- Fix admin panel TypeScript errors: SimpleMDE toolbar type, PieChart label type

## User Experience Improvements
- Auto-uppercase invite code and share code inputs
- Visual feedback for case conversion with helper text
- Improved form validation with error codes

## CI/CD Pipeline
- Create comprehensive production deployment checklist (PRODUCTION_DEPLOYMENT_CHECKLIST.md)
- Add automated pre-deployment check script (pre-deploy-check.sh)
  - Validates frontend, backend, and admin panel builds
  - Checks git status, branch, and sync state
  - Verifies environment files and migrations
- Add quick start deployment guide (DEPLOYMENT_QUICK_START.md)
- Add production deployment automation template (deploy-production.sh)

## Cleanup
- Remove outdated push notifications documentation files
- Remove outdated PWA implementation plan

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 21:27:39 +00:00

16 KiB

Production Deployment Checklist & CI/CD Pipeline

Project: Maternal App (ParentFlow) Last Updated: October 9, 2025 Environment: Development → Production


Table of Contents

  1. Pre-Deployment Checklist
  2. Development Server Steps
  3. Production Server Steps
  4. Database Sync Strategy
  5. Deployment Automation Scripts
  6. Rollback Procedure
  7. Post-Deployment Verification

Pre-Deployment Checklist

Code Quality & Testing

  • All TypeScript compilation errors resolved
  • All ESLint warnings resolved
  • Frontend production build succeeds (npm run build in maternal-web)
  • Backend production build succeeds (npm run build in maternal-app-backend)
  • Admin panel production build succeeds (npm run build in parentflow-admin)
  • All unit tests pass
  • Critical user flows manually tested
  • No console errors in browser
  • API endpoints tested with Postman/curl

Database

  • All migrations created and tested locally
  • Database schema documented
  • Backup of production database created
  • Migration rollback scripts ready
  • Seed data scripts updated (if needed)

Configuration

  • Environment variables reviewed (.env.production)
  • API URLs point to production endpoints
  • Database connection strings verified
  • Redis/cache configuration verified
  • Email service configuration verified
  • File upload paths/S3 buckets verified
  • SSL certificates valid and not expiring soon

Security

  • No sensitive data in git history
  • No API keys in source code
  • Rate limiting configured
  • CORS settings reviewed
  • CSP headers configured
  • Authentication flows tested
  • Permission checks verified

Performance

  • Images optimized
  • Code splitting implemented
  • Lazy loading configured
  • Database indexes reviewed
  • Cache strategy implemented
  • CDN configured (if applicable)

Development Server Steps

Location: /root/maternal-app/ on development server

Step 1: Clean Production Build (Frontend)

cd /root/maternal-app/maternal-web

# Clean previous builds
rm -rf .next
rm -rf node_modules/.cache

# Production build
npm run build

# Check for errors
# Expected: "✓ Compiled successfully" message
# Expected: No TypeScript or ESLint errors

Expected Output:

✓ Compiled successfully
✓ Generating static pages (39/39)
Route (app)                                 Size  First Load JS
...

Step 2: Production Build (Backend)

cd /root/maternal-app/maternal-app/maternal-app-backend

# Clean build directory
rm -rf dist

# Production build
npm run build

# Check for errors
# Expected: "Successfully compiled X files" message

Expected Output:

Successfully compiled XX files with swc

Step 2.5: Production Build (Admin Panel)

cd /root/maternal-app/parentflow-admin

# Clean previous builds
rm -rf .next
rm -rf node_modules/.cache

# Production build
npm run build

# Check for errors
# Expected: "✓ Compiled successfully" message

Expected Output:

✓ Compiled successfully
✓ Generating static pages (13/13)
Route (app)                                 Size  First Load JS
...

Step 3: Fix Any Build Errors

If errors occur:

  1. TypeScript errors: Fix type issues, missing imports
  2. Dependency errors: Run npm install
  3. Environment errors: Check .env files

Common Issues:

  • Missing @types/* packages
  • Incorrect import paths
  • Environment variable references
  • Missing database entities/columns

Step 4: Database Migration Dry Run

cd /root/maternal-app/maternal-app/maternal-app-backend

# Check pending migrations
npm run migration:show

# Generate SQL for review (don't run yet)
npm run migration:generate -- -n ReviewChanges

# Review generated migration file in src/database/migrations/

Step 5: Commit to Git

cd /root/maternal-app

# Review changes
git status
git diff

# Stage changes
git add .

# Commit with descriptive message
git commit -m "feat: [Description of features/fixes]

- Feature 1 description
- Feature 2 description
- Bug fixes
- Database migrations: [List migration files]

Deployment: Ready for production"

# Push to repository
git push origin main

Step 6: Tag Release

# Create version tag
git tag -a v1.x.x -m "Release v1.x.x - [Brief description]"
git push origin v1.x.x

Production Server Steps

Location: Production server

Step 1: Backup Current State

# Backup database
pg_dump -U postgres -d parentflowprod -F c -f /backup/parentflowprod_$(date +%Y%m%d_%H%M%S).dump

# Backup application directory
tar -czf /backup/maternal-app_$(date +%Y%m%d_%H%M%S).tar.gz /var/www/maternal-app

# Verify backups
ls -lh /backup/

Step 2: Pull Latest Code

cd /var/www/maternal-app

# Stash any local changes (shouldn't be any)
git stash

# Pull latest code
git fetch origin
git pull origin main

# Or checkout specific tag
# git checkout v1.x.x

# Verify correct version
git log -1 --oneline

Step 3: Install Dependencies

# Frontend
cd /var/www/maternal-app/maternal-web
npm ci --production

# Backend
cd /var/www/maternal-app/maternal-app/maternal-app-backend
npm ci --production

Step 4: Run Database Migrations

cd /var/www/maternal-app/maternal-app/maternal-app-backend

# Check pending migrations
npm run migration:show

# Run migrations
npm run migration:run

# Verify migrations applied
npm run migration:show

Step 5: Build Applications

# Build frontend
cd /var/www/maternal-app/maternal-web
npm run build

# Build backend
cd /var/www/maternal-app/maternal-app/maternal-app-backend
npm run build

Step 6: Restart Services

# Restart backend (PM2)
pm2 restart maternal-app-backend

# Restart frontend (PM2)
pm2 restart maternal-web

# Or restart all
pm2 restart all

# Check status
pm2 status
pm2 logs --lines 50

Step 7: Clear Caches

# Clear Redis cache
redis-cli FLUSHDB

# Clear Next.js cache (if needed)
cd /var/www/maternal-app/maternal-web
rm -rf .next/cache

Database Sync Strategy

Database Comparison Script

#!/bin/bash
# File: scripts/compare-databases.sh

DEV_DB="parentflowdev"
PROD_DB="parentflowprod"
DEV_HOST="10.0.0.207"
PROD_HOST="production-db-host"

echo "Comparing database schemas..."

# Export schemas
pg_dump -h $DEV_HOST -U postgres -d $DEV_DB --schema-only > /tmp/dev_schema.sql
pg_dump -h $PROD_HOST -U postgres -d $PROD_DB --schema-only > /tmp/prod_schema.sql

# Compare
diff /tmp/dev_schema.sql /tmp/prod_schema.sql > /tmp/schema_diff.txt

if [ -s /tmp/schema_diff.txt ]; then
  echo "⚠️  Schemas differ! Review /tmp/schema_diff.txt"
  cat /tmp/schema_diff.txt
else
  echo "✅ Schemas are identical"
fi

Migration Workflow

Development → Production:

  1. Create Migration (Dev):

    npm run migration:generate -- -n DescriptiveName
    
  2. Test Migration (Dev):

    npm run migration:run
    npm run migration:revert  # Test rollback
    npm run migration:run     # Re-apply
    
  3. Commit Migration (Dev):

    git add src/database/migrations/*
    git commit -m "feat: Add [description] migration"
    
  4. Apply to Production (Prod):

    git pull origin main
    npm run migration:run
    

Manual Database Sync

If migrations are out of sync:

-- Check migration history
SELECT * FROM migrations ORDER BY executed_at DESC LIMIT 10;

-- Compare tables
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;

-- Compare columns for specific table
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'users'
ORDER BY ordinal_position;

Deployment Automation Scripts

Auto-Deploy Script (Production Server)

Create: /var/www/maternal-app/deploy.sh

#!/bin/bash
set -e  # Exit on error

echo "======================================"
echo "🚀 Starting Production Deployment"
echo "======================================"

# Configuration
APP_DIR="/var/www/maternal-app"
BACKUP_DIR="/backup"
BRANCH="main"
LOG_FILE="/var/log/maternal-app-deploy-$(date +%Y%m%d_%H%M%S).log"

# Redirect output to log
exec 1> >(tee -a "$LOG_FILE")
exec 2>&1

echo "[$(date)] Deployment started"

# Step 1: Backup
echo "📦 Creating backup..."
pg_dump -U postgres -d parentflowprod -F c -f "$BACKUP_DIR/parentflowprod_$(date +%Y%m%d_%H%M%S).dump"
tar -czf "$BACKUP_DIR/maternal-app_$(date +%Y%m%d_%H%M%S).tar.gz" "$APP_DIR" --exclude node_modules --exclude .next --exclude dist
echo "✅ Backup complete"

# Step 2: Pull code
echo "📥 Pulling latest code..."
cd "$APP_DIR"
git stash
git fetch origin
git pull origin "$BRANCH"
COMMIT=$(git log -1 --oneline)
echo "✅ Updated to: $COMMIT"

# Step 3: Install dependencies
echo "📦 Installing dependencies..."
cd "$APP_DIR/maternal-web"
npm ci --production
cd "$APP_DIR/maternal-app/maternal-app-backend"
npm ci --production
echo "✅ Dependencies installed"

# Step 4: Run migrations
echo "🗄️  Running database migrations..."
cd "$APP_DIR/maternal-app/maternal-app-backend"
npm run migration:run
echo "✅ Migrations complete"

# Step 5: Build applications
echo "🔨 Building applications..."
cd "$APP_DIR/maternal-web"
npm run build
cd "$APP_DIR/maternal-app/maternal-app-backend"
npm run build
echo "✅ Build complete"

# Step 6: Restart services
echo "🔄 Restarting services..."
pm2 restart all
pm2 save
echo "✅ Services restarted"

# Step 7: Health check
echo "🏥 Running health checks..."
sleep 5
BACKEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3020/api/v1/health || echo "000")
FRONTEND_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3030 || echo "000")

if [ "$BACKEND_STATUS" = "200" ] && [ "$FRONTEND_STATUS" = "200" ]; then
  echo "✅ Health checks passed"
  echo "[$(date)] Deployment successful!"
  echo "======================================"
  echo "🎉 Deployment Complete"
  echo "======================================"
else
  echo "❌ Health checks failed! Backend: $BACKEND_STATUS, Frontend: $FRONTEND_STATUS"
  echo "⚠️  Consider rollback if issues persist"
fi

# Send notification (optional)
# curl -X POST https://your-webhook-url -d "Deployment complete: $COMMIT"

Make executable:

chmod +x /var/www/maternal-app/deploy.sh

Usage:

/var/www/maternal-app/deploy.sh

Pre-Deploy Check Script (Development Server)

Create: /root/maternal-app/pre-deploy-check.sh

#!/bin/bash
set -e

echo "======================================"
echo "🔍 Pre-Deployment Checks"
echo "======================================"

ERRORS=0

# Check 1: Frontend build
echo "Checking frontend build..."
cd /root/maternal-app/maternal-web
if npm run build; then
  echo "✅ Frontend build successful"
else
  echo "❌ Frontend build failed"
  ERRORS=$((ERRORS + 1))
fi

# Check 2: Backend build
echo "Checking backend build..."
cd /root/maternal-app/maternal-app/maternal-app-backend
if npm run build; then
  echo "✅ Backend build successful"
else
  echo "❌ Backend build failed"
  ERRORS=$((ERRORS + 1))
fi

# Check 3: Uncommitted changes
echo "Checking for uncommitted changes..."
cd /root/maternal-app
if [ -z "$(git status --porcelain)" ]; then
  echo "✅ No uncommitted changes"
else
  echo "⚠️  Uncommitted changes detected:"
  git status --short
fi

# Check 4: Pending migrations
echo "Checking for pending migrations..."
cd /root/maternal-app/maternal-app/maternal-app-backend
PENDING=$(npm run migration:show 2>&1 | grep "pending" | wc -l)
if [ "$PENDING" -gt 0 ]; then
  echo "⚠️  $PENDING pending migrations found"
else
  echo "✅ No pending migrations"
fi

# Summary
echo "======================================"
if [ $ERRORS -eq 0 ]; then
  echo "✅ All checks passed! Ready to deploy."
  echo "Next steps:"
  echo "  1. git add ."
  echo "  2. git commit -m 'your message'"
  echo "  3. git push origin main"
  echo "  4. Run deploy.sh on production server"
else
  echo "❌ $ERRORS check(s) failed. Fix issues before deploying."
  exit 1
fi
echo "======================================"

Make executable:

chmod +x /root/maternal-app/pre-deploy-check.sh

Usage:

cd /root/maternal-app
./pre-deploy-check.sh

Rollback Procedure

Quick Rollback (if deployment fails)

# 1. Restore previous code
cd /var/www/maternal-app
git log -5 --oneline  # Find previous commit
git reset --hard <previous-commit-hash>

# 2. Restore database (if migrations ran)
pg_restore -U postgres -d parentflowprod -c /backup/parentflowprod_YYYYMMDD_HHMMSS.dump

# 3. Rebuild
cd /var/www/maternal-app/maternal-web && npm run build
cd /var/www/maternal-app/maternal-app/maternal-app-backend && npm run build

# 4. Restart services
pm2 restart all

Migration Rollback

cd /var/www/maternal-app/maternal-app/maternal-app-backend

# Rollback last migration
npm run migration:revert

# Rollback multiple migrations
npm run migration:revert  # Repeat N times

Post-Deployment Verification

Checklist

  • Application accessible at production URL
  • Login functionality works
  • API endpoints responding
  • Database queries working
  • File uploads working
  • Email sending working
  • WebSocket connections working
  • No JavaScript errors in console
  • PM2 processes healthy (pm2 status)
  • Database connections stable
  • SSL certificate valid
  • Logs clean (no critical errors)

Health Check Commands

# Backend health
curl https://api.maternal.noru1.ro/api/v1/health

# Frontend accessibility
curl https://maternal.noru1.ro

# Check PM2 status
pm2 status
pm2 logs --lines 100

# Check database connections
psql -U postgres -d parentflowprod -c "SELECT COUNT(*) FROM users;"

# Monitor logs
tail -f /var/log/maternal-app/*.log
pm2 logs --lines 100 --raw

Monitoring

# CPU/Memory usage
pm2 monit

# Database size
psql -U postgres -c "SELECT pg_size_pretty(pg_database_size('parentflowprod'));"

# Active connections
psql -U postgres -d parentflowprod -c "SELECT count(*) FROM pg_stat_activity;"

Deployment Frequency

Recommended Schedule:

  • Hotfixes: As needed (critical bugs)
  • Minor Updates: Weekly (Friday afternoons)
  • Major Releases: Bi-weekly or monthly
  • Database Migrations: Bundle with releases

Best Practices:

  • Deploy during low-traffic hours
  • Have team member available for 1 hour post-deployment
  • Test in staging environment first (if available)
  • Communicate deployment to users (if user-facing changes)

Environment Variables

Development (.env.local)

DATABASE_HOST=10.0.0.207
DATABASE_NAME=parentflowdev
NODE_ENV=development
API_URL=http://localhost:3020

Production (.env.production)

DATABASE_HOST=production-db-host
DATABASE_NAME=parentflowprod
NODE_ENV=production
API_URL=https://api.maternal.noru1.ro

Security Note: Never commit .env files to git!


Emergency Contacts

  • Developer: [Your contact]
  • DevOps: [DevOps contact]
  • Database Admin: [DBA contact]
  • Server Access: [Server details]

Changelog Template

# Release v1.x.x - YYYY-MM-DD

## New Features
- Feature 1
- Feature 2

## Improvements
- Improvement 1
- Improvement 2

## Bug Fixes
- Fix 1
- Fix 2

## Database Changes
- Migration 1: Description
- Migration 2: Description

## Breaking Changes
- None / List breaking changes

## Deployment Notes
- Special instructions if any

Last Updated: October 9, 2025 Version: 1.0 Maintained By: Development Team