#!/bin/bash # ParentFlow Production Startup Script # Uses PM2 for frontend/backend, Docker for databases # Ports: Backend 3020, Frontend 3030 # Server: 10.0.0.240 (or localhost for local production testing) set -e # Exit on any error # Color codes RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo "==========================================" echo "ParentFlow Production Startup" echo "==========================================" echo "" # Check if PM2 is installed if ! command -v pm2 &> /dev/null; then echo -e "${RED}ERROR: PM2 is not installed!${NC}" echo "Install PM2 globally with: npm install -g pm2" exit 1 fi # Check if Docker is installed if ! command -v docker &> /dev/null; then echo -e "${RED}ERROR: Docker is not installed!${NC}" exit 1 fi # Check if docker-compose is installed if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then echo -e "${RED}ERROR: Docker Compose is not installed!${NC}" exit 1 fi # Step 1: Start Docker services (databases) echo -e "${BLUE}Step 1: Starting Docker services (databases)...${NC}" 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 if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Docker services started${NC}" else echo -e "${RED}✗ Failed to start Docker services${NC}" exit 1 fi # Wait for databases to be ready echo -e "${YELLOW}Waiting for databases to be healthy...${NC}" sleep 10 # Check PostgreSQL connectivity (dedicated server) echo -e "${BLUE}Checking PostgreSQL connectivity on 10.0.0.207...${NC}" PGPASSWORD=a3ppq psql -h 10.0.0.207 -p 5432 -U postgres -d parentflow -c "SELECT version();" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo -e "${GREEN}✓ PostgreSQL connection successful${NC}" else echo -e "${RED}✗ Cannot connect to PostgreSQL on 10.0.0.207${NC}" echo "Please ensure PostgreSQL is running and accessible" exit 1 fi # Check Docker services health echo -e "${BLUE}Checking Docker services health...${NC}" MAX_RETRIES=30 RETRY_COUNT=0 while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do REDIS_HEALTHY=$(docker inspect parentflow-redis-prod --format='{{.State.Health.Status}}' 2>/dev/null || echo "starting") MONGO_HEALTHY=$(docker inspect parentflow-mongodb-prod --format='{{.State.Health.Status}}' 2>/dev/null || echo "starting") MINIO_HEALTHY=$(docker inspect parentflow-minio-prod --format='{{.State.Health.Status}}' 2>/dev/null || echo "starting") if [ "$REDIS_HEALTHY" = "healthy" ] && [ "$MONGO_HEALTHY" = "healthy" ] && [ "$MINIO_HEALTHY" = "healthy" ]; then echo -e "${GREEN}✓ All Docker services are healthy${NC}" break fi echo -e "${YELLOW}Waiting for Docker services... ($RETRY_COUNT/$MAX_RETRIES)${NC}" sleep 2 ((RETRY_COUNT++)) done if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then echo -e "${RED}✗ Docker services failed to become healthy${NC}" echo "Check Docker logs with: docker logs parentflow-redis-prod" exit 1 fi # Step 2: Run database migrations echo "" echo -e "${BLUE}Step 2: Running database migrations...${NC}" cd /root/maternal-app/maternal-app/maternal-app-backend # Check if migration script exists if [ -f "./scripts/master-migration.sh" ]; then echo -e "${YELLOW}Running master migration script...${NC}" DATABASE_HOST=10.0.0.207 \ DATABASE_PORT=5432 \ DATABASE_NAME=parentflow \ DATABASE_USER=postgres \ DATABASE_PASSWORD=a3ppq \ ./scripts/master-migration.sh || { echo -e "${YELLOW}Warning: Migrations may have partially failed. Continuing...${NC}" } else echo -e "${YELLOW}Warning: Migration script not found. Skipping migrations.${NC}" fi # Step 3: Build backend (if needed) echo "" echo -e "${BLUE}Step 3: Building backend...${NC}" cd /root/maternal-app/maternal-app/maternal-app-backend if [ ! -d "dist" ]; then echo -e "${YELLOW}Building backend for the first time...${NC}" npm run build if [ $? -ne 0 ]; then echo -e "${RED}✗ Backend build failed${NC}" exit 1 fi echo -e "${GREEN}✓ Backend built successfully${NC}" else echo -e "${GREEN}✓ Backend dist directory exists${NC}" fi # Step 4: Build frontend (if needed) echo "" echo -e "${BLUE}Step 4: Building frontend...${NC}" cd /root/maternal-app/maternal-web if [ ! -d ".next" ]; then echo -e "${YELLOW}Building frontend for the first time...${NC}" npm run build if [ $? -ne 0 ]; then echo -e "${RED}✗ Frontend build failed${NC}" exit 1 fi echo -e "${GREEN}✓ Frontend built successfully${NC}" else echo -e "${GREEN}✓ Frontend .next directory exists${NC}" fi # Step 5: Start PM2 processes echo "" echo -e "${BLUE}Step 5: Starting PM2 processes...${NC}" # Check if ecosystem.config.js exists if [ ! -f "/root/maternal-app/ecosystem.config.js" ]; then echo -e "${RED}✗ ecosystem.config.js not found${NC}" exit 1 fi # Stop any existing PM2 processes echo -e "${YELLOW}Stopping any existing PM2 processes...${NC}" pm2 delete all 2>/dev/null || true # Start PM2 with ecosystem config (production environment) cd /root/maternal-app pm2 start ecosystem.config.js --env production if [ $? -eq 0 ]; then echo -e "${GREEN}✓ PM2 processes started${NC}" else echo -e "${RED}✗ Failed to start PM2 processes${NC}" exit 1 fi # Save PM2 process list pm2 save # Step 6: Verify services are running echo "" echo -e "${BLUE}Step 6: Verifying services...${NC}" sleep 5 # Check PM2 status echo -e "${YELLOW}PM2 Status:${NC}" pm2 list # Check if ports are listening echo "" echo -e "${YELLOW}Port Status:${NC}" if lsof -i:3020 > /dev/null 2>&1; then echo -e "${GREEN}✓ Backend is running on port 3020${NC}" else echo -e "${RED}✗ Backend not detected on port 3020${NC}" fi if lsof -i:3030 > /dev/null 2>&1; then echo -e "${GREEN}✓ Frontend is running on port 3030${NC}" else echo -e "${RED}✗ Frontend not detected on port 3030${NC}" fi # Check Docker containers echo "" echo -e "${YELLOW}Docker Containers:${NC}" docker ps --filter name=parentflow --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # Summary echo "" echo "==========================================" echo -e "${GREEN}Production Environment Started!${NC}" echo "==========================================" echo "" echo "Services:" echo " Backend API: http://localhost:3020" echo " Frontend: http://localhost:3030" echo " PostgreSQL: localhost:5432" echo " Redis: localhost:6379" echo " MongoDB: localhost:27017" echo " MinIO: localhost:9000" echo " MinIO Console: localhost:9001" echo "" echo "Management Commands:" echo " PM2 status: pm2 status" echo " PM2 logs: pm2 logs" echo " PM2 restart: pm2 restart all" echo " PM2 stop: pm2 stop all" echo " Docker logs: docker logs parentflow-postgres-prod" echo " Stop all: pm2 stop all && docker-compose -f docker-compose.production.yml down" echo "" echo "Domains (configure in Nginx/DNS):" echo " Frontend: web.parentflowapp.com → localhost:3030" echo " Backend: api.parentflowapp.com → localhost:3020" echo "" echo -e "${GREEN}✓ Startup complete!${NC}"