#!/bin/bash # ParentFlow Production Start Script # Starts all production services including backend, frontend, and admin dashboard set -e # Configuration DEPLOY_DIR="/root/parentflow-production" DB_HOST="10.0.0.207" DB_PORT="5432" # Color codes RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" >&2 exit 1 } success() { echo -e "${GREEN}✓${NC} $1" } warning() { echo -e "${YELLOW}⚠${NC} $1" } # Header echo "" echo "==========================================" echo " Starting ParentFlow Production " echo "==========================================" echo "" # Check if we're in the right directory if [ "$PWD" != "$DEPLOY_DIR" ] && [ -d "$DEPLOY_DIR" ]; then cd "$DEPLOY_DIR" fi # Step 1: Check database connectivity log "${CYAN}Step 1: Checking database connectivity...${NC}" PGPASSWORD=a3ppq psql -h $DB_HOST -p $DB_PORT -U postgres -d parentflow \ -c "SELECT version();" > /dev/null 2>&1 if [ $? -eq 0 ]; then success "Database connection successful" else error "Cannot connect to database at $DB_HOST:$DB_PORT" fi # Step 2: Start Docker services log "${CYAN}Step 2: Starting Docker services...${NC}" if [ -f "docker-compose.production.yml" ]; then if docker compose version &> /dev/null; then docker compose -f docker-compose.production.yml up -d else docker-compose -f docker-compose.production.yml up -d fi sleep 5 success "Docker services started (Redis, MongoDB, MinIO)" else warning "Docker compose file not found, skipping..." fi # Step 3: Verify Docker services log "${CYAN}Step 3: Verifying Docker services...${NC}" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "redis|mongo|minio" || warning "Some Docker services may not be running" # Step 4: Start PM2 processes log "${CYAN}Step 4: Starting PM2 application services...${NC}" # Delete any existing PM2 processes pm2 delete all 2>/dev/null || true # Start using ecosystem file if [ -f "ecosystem.config.js" ]; then pm2 start ecosystem.config.js --env production success "PM2 services started from ecosystem config" else warning "PM2 ecosystem config not found, starting services manually..." # Start Backend API log "Starting Backend API..." cd "$DEPLOY_DIR/maternal-app/maternal-app-backend" pm2 start dist/main.js \ --name "parentflow-api" \ --instances 2 \ --exec-mode cluster \ --env production \ --max-memory-restart 500M \ --error /var/log/parentflow/api-error.log \ --output /var/log/parentflow/api-out.log \ --merge-logs \ --time \ -- --port 3020 # Start Frontend log "Starting Frontend..." cd "$DEPLOY_DIR/maternal-web" pm2 start npm \ --name "parentflow-frontend" \ --instances 2 \ --exec-mode cluster \ --max-memory-restart 400M \ --error /var/log/parentflow/frontend-error.log \ --output /var/log/parentflow/frontend-out.log \ --merge-logs \ --time \ -- run start # Start Admin Dashboard log "Starting Admin Dashboard..." cd "$DEPLOY_DIR/parentflow-admin" pm2 start npm \ --name "parentflow-admin" \ --instances 1 \ --max-memory-restart 300M \ --error /var/log/parentflow/admin-error.log \ --output /var/log/parentflow/admin-out.log \ --merge-logs \ --time \ -- run start fi # Save PM2 configuration pm2 save pm2 startup systemd -u root --hp /root || true # Step 5: Wait for services to start log "${CYAN}Step 5: Waiting for services to initialize...${NC}" sleep 10 # Step 6: Verify services are running log "${CYAN}Step 6: Verifying services...${NC}" verify_service() { local name=$1 local port=$2 if lsof -i:$port > /dev/null 2>&1; then success "$name is running on port $port" return 0 else warning "$name is not detected on port $port" return 1 fi } # Check each service ALL_GOOD=true verify_service "Backend API" 3020 || ALL_GOOD=false verify_service "Frontend" 3030 || ALL_GOOD=false verify_service "Admin Dashboard" 3335 || ALL_GOOD=false verify_service "Redis" 6379 || ALL_GOOD=false verify_service "MongoDB" 27017 || ALL_GOOD=false verify_service "MinIO" 9000 || ALL_GOOD=false # Step 7: Show PM2 status log "${CYAN}Step 7: PM2 Process Status${NC}" echo "" pm2 list echo "" # Step 8: Test API health log "${CYAN}Step 8: Testing API health endpoint...${NC}" sleep 3 if curl -s -o /dev/null -w "%{http_code}" http://localhost:3020/health | grep -q "200\|401"; then success "API is responding" else warning "API health check failed - may still be starting" fi # Final summary echo "" echo "==========================================" if [ "$ALL_GOOD" = true ]; then echo -e "${GREEN} All Services Started Successfully! ${NC}" else echo -e "${YELLOW} Services Started (Check Warnings) ${NC}" fi echo "==========================================" echo "" echo "Service URLs:" echo " Backend API: http://localhost:3020" echo " Frontend: http://localhost:3030" echo " Admin Dashboard: http://localhost:3335" echo " MinIO Console: http://localhost:9001" echo "" echo "Management Commands:" echo " View logs: pm2 logs" echo " Monitor: pm2 monit" echo " List processes: pm2 list" echo " Restart all: pm2 restart all" echo " Stop all: ./stop-production.sh" echo "" echo "Log files:" echo " /var/log/parentflow/api-*.log" echo " /var/log/parentflow/frontend-*.log" echo " /var/log/parentflow/admin-*.log" echo "" # Create log directory if it doesn't exist mkdir -p /var/log/parentflow log "Services started at $(date)"