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
- Replaced old production script with PM2-based deployment - Created start-production.sh: automated startup script - Starts Docker containers for databases - Waits for database health checks - Runs migrations automatically - Builds backend/frontend if needed - Starts PM2 processes with ecosystem.config.js - Verifies all services are running - Created stop-production.sh: graceful shutdown script - Stops PM2 processes - Stops Docker containers - Verifies shutdown - Created PRODUCTION_DEPLOYMENT.md: comprehensive deployment guide - Prerequisites and installation steps - Configuration instructions - Nginx reverse proxy setup - SSL certificate setup with Certbot - Management commands for PM2 and Docker - Backup strategy - Troubleshooting guide - Security checklist Production setup: - Backend: Port 3020 → api.parentflowapp.com - Frontend: Port 3030 → web.parentflowapp.com - Docker: PostgreSQL, Redis, MongoDB, MinIO - PM2: Backend and Frontend applications - Target: Server 10.0.0.240 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
10 KiB
10 KiB
ParentFlow Production Deployment Guide
Target Server: 10.0.0.240 Deployment Method: PM2 + Docker Last Updated: October 6, 2025
Overview
Production deployment uses a hybrid approach:
- Docker Compose: For databases (PostgreSQL, Redis, MongoDB, MinIO)
- PM2: For application services (Backend, Frontend)
Architecture
┌─────────────────────────────────────────────┐
│ Server: 10.0.0.240 │
├─────────────────────────────────────────────┤
│ PM2 Processes: │
│ - Backend: Port 3020 (Node.js/NestJS) │
│ - Frontend: Port 3030 (Next.js) │
├─────────────────────────────────────────────┤
│ Docker Containers: │
│ - PostgreSQL: Port 5432 │
│ - Redis: Port 6379 │
│ - MongoDB: Port 27017 │
│ - MinIO: Port 9000 (API) │
│ Port 9001 (Console) │
└─────────────────────────────────────────────┘
↓ ↓
api.parentflowapp.com web.parentflowapp.com
Prerequisites
1. Install Required Software
# Install Node.js 18+ and npm
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Install PM2 globally
sudo npm install -g pm2
# Install Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. Clone Repository
cd /root
git clone https://git.noru1.ro/andrei/maternal-app.git
cd maternal-app
3. Install Dependencies
# Backend dependencies
cd maternal-app/maternal-app-backend
npm install
# Frontend dependencies
cd ../../maternal-web
npm install
cd ../..
Configuration
1. Environment Variables
Copy the example environment file and update with production values:
cp .env.production.example .env.production
nano .env.production
Critical variables to update:
POSTGRES_PASSWORD: Strong password for PostgreSQLREDIS_PASSWORD: Strong password for RedisMONGO_PASSWORD: Strong password for MongoDBJWT_SECRET: 64-character random stringJWT_REFRESH_SECRET: Different 64-character random stringOPENAI_API_KEY: Your OpenAI API key (for AI features)
Generate secure secrets:
# Generate JWT secrets
openssl rand -base64 64
openssl rand -base64 64
2. Update ecosystem.config.js
Ensure the production environment variables in ecosystem.config.js match your .env.production file.
3. Configure Nginx (Reverse Proxy)
Create Nginx configuration for domain routing:
# /etc/nginx/sites-available/parentflow
# Backend API
server {
listen 80;
server_name api.parentflowapp.com;
location / {
proxy_pass http://localhost:3020;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Frontend
server {
listen 80;
server_name web.parentflowapp.com;
location / {
proxy_pass http://localhost:3030;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Enable the site:
sudo ln -s /etc/nginx/sites-available/parentflow /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4. SSL Certificates (Optional but Recommended)
# Install Certbot
sudo apt-get install certbot python3-certbot-nginx
# Obtain certificates
sudo certbot --nginx -d api.parentflowapp.com -d web.parentflowapp.com
Deployment
First-Time Deployment
cd /root/maternal-app
# Start production environment
./start-production.sh
The script will:
- ✅ Start Docker containers (databases)
- ✅ Wait for databases to be healthy
- ✅ Run database migrations
- ✅ Build backend (if needed)
- ✅ Build frontend (if needed)
- ✅ Start PM2 processes
- ✅ Verify all services
Subsequent Deployments
cd /root/maternal-app
# Pull latest changes
git pull origin main
# Rebuild applications
cd maternal-app/maternal-app-backend
npm install
npm run build
cd ../../maternal-web
npm install
npm run build
cd ../..
# Restart PM2 processes
pm2 restart all
# Or use the full restart script
./stop-production.sh
./start-production.sh
Management Commands
PM2 Commands
# View process status
pm2 status
# View logs
pm2 logs
# View specific service logs
pm2 logs parentflow-backend
pm2 logs parentflow-frontend
# Restart services
pm2 restart all
pm2 restart parentflow-backend
pm2 restart parentflow-frontend
# Stop services
pm2 stop all
# Delete processes
pm2 delete all
# Save PM2 process list
pm2 save
# Setup PM2 to start on system boot
pm2 startup
pm2 save
Docker Commands
# View running containers
docker ps
# View logs
docker logs parentflow-postgres-prod
docker logs parentflow-redis-prod
docker logs parentflow-mongodb-prod
docker logs parentflow-minio-prod
# Follow logs in real-time
docker logs -f parentflow-postgres-prod
# Access database shell
docker exec -it parentflow-postgres-prod psql -U parentflow_user -d parentflow_production
# Access Redis CLI
docker exec -it parentflow-redis-prod redis-cli -a parentflow_redis_password_2024
# Access MongoDB shell
docker exec -it parentflow-mongodb-prod mongo -u parentflow_admin -p parentflow_mongo_password_2024
# Stop all containers
docker-compose -f docker-compose.production.yml down
# Stop and remove volumes (WARNING: deletes data)
docker-compose -f docker-compose.production.yml down -v
Application Management
# Start production
./start-production.sh
# Stop production
./stop-production.sh
# Check migration status
cd maternal-app/maternal-app-backend
./scripts/check-migrations.sh
# Run migrations manually
./scripts/master-migration.sh
Monitoring
Health Checks
- Backend: http://localhost:3020/api/health
- Frontend: http://localhost:3030
- MinIO Console: http://localhost:9001
Log Files
PM2 logs are stored in:
~/.pm2/logs/parentflow-backend-out.log~/.pm2/logs/parentflow-backend-error.log~/.pm2/logs/parentflow-frontend-out.log~/.pm2/logs/parentflow-frontend-error.log
Docker logs via:
docker logs <container-name>
System Resources
# Monitor PM2 processes
pm2 monit
# Monitor Docker containers
docker stats
# System resources
htop
Backup Strategy
Database Backups
# PostgreSQL backup
docker exec parentflow-postgres-prod pg_dump -U parentflow_user parentflow_production > backup-$(date +%Y%m%d).sql
# Restore PostgreSQL
cat backup-20251006.sql | docker exec -i parentflow-postgres-prod psql -U parentflow_user -d parentflow_production
# MongoDB backup
docker exec parentflow-mongodb-prod mongodump --username parentflow_admin --password parentflow_mongo_password_2024 --out /data/backup
# Redis backup (automatic with AOF persistence)
docker exec parentflow-redis-prod redis-cli -a parentflow_redis_password_2024 BGSAVE
Automated Backups
Add to crontab:
# Daily database backup at 2 AM
0 2 * * * /root/maternal-app/scripts/backup-database.sh
Troubleshooting
Backend Won't Start
# Check logs
pm2 logs parentflow-backend --err
# Check if port is already in use
lsof -i:3020
# Verify database connection
docker exec -it parentflow-postgres-prod psql -U parentflow_user -d parentflow_production -c "SELECT version();"
Frontend Won't Start
# Check logs
pm2 logs parentflow-frontend --err
# Rebuild frontend
cd maternal-web
rm -rf .next
npm run build
Database Connection Issues
# Check if containers are running
docker ps
# Check container health
docker inspect parentflow-postgres-prod --format='{{.State.Health.Status}}'
# View container logs
docker logs parentflow-postgres-prod
Migrations Failed
# Check migration status
cd maternal-app/maternal-app-backend
./scripts/check-migrations.sh
# Manually run specific migration
PGPASSWORD=parentflow_secure_password_2024 psql -h localhost -p 5432 -U parentflow_user -d parentflow_production -f src/database/migrations/V001_create_core_auth.sql
Security Checklist
- Updated all default passwords in
.env.production - Generated secure JWT secrets
- Configured firewall (ufw/iptables) to restrict database ports
- Enabled SSL certificates with Certbot
- Configured Nginx rate limiting
- Set up PM2 with non-root user (recommended)
- Enabled Docker container resource limits
- Configured backup strategy
- Set up monitoring/alerting
Performance Optimization
PM2 Cluster Mode
For better performance, run backend in cluster mode:
// ecosystem.config.js
{
name: 'parentflow-backend',
instances: 'max', // Use all CPU cores
exec_mode: 'cluster',
// ... other settings
}
Database Optimization
- Enable PostgreSQL connection pooling (already configured)
- Monitor slow queries
- Add indexes for frequently queried fields
- Configure Redis maxmemory policy
CI/CD Integration
See docs/REMAINING_FEATURES.md for Gitea Actions workflow setup for automated deployments to 10.0.0.240.
Support
For issues or questions:
- Check logs:
pm2 logsanddocker logs - Review documentation:
/root/maternal-app/docs/ - Check migration status:
./scripts/check-migrations.sh
Last Updated: October 6, 2025 Deployment Version: 1.0.0