10 KiB
10 KiB
PM2 Management Guide
Complete guide for managing the Redmine-Gitea Sync Server with PM2.
Quick Start
Install PM2
npm install -g pm2
Start Application
pm2 start ecosystem.config.cjs
pm2 save
pm2 startup
Essential Commands
Process Management
# Start the application
pm2 start ecosystem.config.cjs
# Start in development mode
pm2 start ecosystem.config.cjs --env development
# Stop the application
pm2 stop redmine-gitea-sync
# Restart the application
pm2 restart redmine-gitea-sync
# Reload with zero downtime (cluster mode)
pm2 reload redmine-gitea-sync
# Delete from PM2
pm2 delete redmine-gitea-sync
# Update environment variables and restart
pm2 restart redmine-gitea-sync --update-env
Monitoring
# List all processes
pm2 list
pm2 ls
# Show detailed information
pm2 show redmine-gitea-sync
# Monitor in real-time
pm2 monit
# View resource usage
pm2 status
Log Management
# View logs in real-time
pm2 logs redmine-gitea-sync
# View last 100 lines
pm2 logs redmine-gitea-sync --lines 100
# View only errors
pm2 logs redmine-gitea-sync --err
# View only output
pm2 logs redmine-gitea-sync --out
# Clear logs
pm2 flush
# Follow logs with grep
pm2 logs redmine-gitea-sync | grep ERROR
Save and Restore
# Save current process list
pm2 save
# Resurrect saved process list
pm2 resurrect
# Clear saved process list
pm2 cleardump
Configuration
Ecosystem File
The ecosystem.config.cjs file contains all configuration:
module.exports = {
apps: [{
name: 'redmine-gitea-sync',
script: './server.mjs',
env: {
// Your environment variables
},
instances: 1,
exec_mode: 'fork',
max_memory_restart: '300M',
// ... other settings
}]
};
Update Configuration
- Edit
ecosystem.config.cjs - Restart with updated environment:
pm2 restart redmine-gitea-sync --update-env
Multiple Environments
// ecosystem.config.cjs
module.exports = {
apps: [{
name: 'redmine-gitea-sync',
script: './server.mjs',
env: {
NODE_ENV: 'production',
PORT: 3002,
},
env_development: {
NODE_ENV: 'development',
PORT: 3002,
LOG_LEVEL: 'debug',
},
env_staging: {
NODE_ENV: 'staging',
PORT: 3003,
}
}]
};
Start with specific environment:
pm2 start ecosystem.config.cjs --env development
pm2 start ecosystem.config.cjs --env staging
Auto-Start on Boot
Setup Startup Script
# Generate startup script for your system
pm2 startup
# This will output a command like:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u yourusername --hp /home/yourusername
# Run the command it outputs
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u yourusername --hp /home/yourusername
# Save your process list
pm2 save
Disable Startup
pm2 unstartup
Clustering
For high-traffic scenarios, use cluster mode:
Update ecosystem.config.cjs
module.exports = {
apps: [{
name: 'redmine-gitea-sync',
script: './server.mjs',
instances: 'max', // or specific number like 4
exec_mode: 'cluster',
// ... other settings
}]
};
Commands
# Start in cluster mode
pm2 start ecosystem.config.cjs
# Scale up/down
pm2 scale redmine-gitea-sync +2 # Add 2 instances
pm2 scale redmine-gitea-sync 4 # Set to 4 instances
# Reload with zero downtime
pm2 reload redmine-gitea-sync
Log Rotation
Install PM2 Log Rotate Module
pm2 install pm2-logrotate
Configure Log Rotation
# Set max file size (default: 10MB)
pm2 set pm2-logrotate:max_size 10M
# Set number of files to keep (default: 10)
pm2 set pm2-logrotate:retain 7
# Enable compression
pm2 set pm2-logrotate:compress true
# Set rotation interval (daily/hourly)
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # Daily at midnight
# View configuration
pm2 conf pm2-logrotate
Monitoring and Metrics
PM2 Plus (Optional)
PM2 Plus provides advanced monitoring:
# Link to PM2 Plus
pm2 link <secret_key> <public_key>
# Unlink
pm2 unlink
Custom Metrics
Add to your application:
const pmx = require('pmx');
// Custom metric
const metric = pmx.probe().metric({
name: 'Sync Operations',
value: 0
});
// Increment
metric.set(metric.val() + 1);
System Monitoring
# Install system monitoring module
pm2 install pm2-server-monit
# View dashboard
# Access via http://localhost:9615
Troubleshooting
Process Keeps Restarting
# Check error logs
pm2 logs redmine-gitea-sync --err
# View restart count
pm2 list
# Increase restart delay in ecosystem.config.cjs
restart_delay: 5000,
max_restarts: 5,
High Memory Usage
# Check memory
pm2 list
pm2 monit
# View detailed info
pm2 show redmine-gitea-sync
# Adjust memory limit in ecosystem.config.cjs
max_memory_restart: '500M',
Application Not Starting
# Check if port is in use
sudo lsof -i :3002
# Check logs for errors
pm2 logs redmine-gitea-sync --err --lines 50
# Try starting manually to see errors
node server.js
PM2 Not Starting on Boot
# Verify startup is configured
pm2 startup
# Check systemd status
systemctl status pm2-yourusername
# Regenerate startup script
pm2 unstartup
pm2 startup
pm2 save
Logs Not Appearing
# Check log file locations
pm2 show redmine-gitea-sync
# Verify log directory exists and is writable
ls -la ./logs/
# Create logs directory if missing
mkdir -p ./logs
# Restart application
pm2 restart redmine-gitea-sync
Advanced Usage
Watch Mode
Monitor file changes and auto-restart:
// ecosystem.config.cjs
watch: true,
watch_delay: 1000,
ignore_watch: ['node_modules', 'logs', '.git'],
Or from command line:
pm2 start ecosystem.config.cjs --watch
Cron Restart
Restart at specific intervals:
// ecosystem.config.cjs
cron_restart: '0 3 * * *', // Every day at 3 AM
Max Restarts
Limit restart attempts:
// ecosystem.config.cjs
max_restarts: 10,
min_uptime: '10s',
Environment-Specific Commands
# Production
pm2 start ecosystem.config.cjs --env production
# Development
pm2 start ecosystem.config.cjs --env development
# Staging
pm2 start ecosystem.config.cjs --env staging
PM2 Runtime Configuration
Update PM2
# Update PM2 to latest version
npm install -g pm2@latest
# Update in-memory PM2
pm2 update
PM2 Home Directory
By default: ~/.pm2
Change location:
export PM2_HOME=/path/to/custom/location
Reset PM2
# Kill PM2 daemon
pm2 kill
# Clear everything
rm -rf ~/.pm2
# Restart PM2
pm2 start ecosystem.config.cjs
Integration with CI/CD
Deploy Script Example
#!/bin/bash
# Pull latest code
git pull origin main
# Install dependencies
npm install --production
# Restart with zero downtime
pm2 reload ecosystem.config.cjs
# Check if running
pm2 list
GitHub Actions Example
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /opt/redmine-gitea-sync
git pull
npm install --production
pm2 reload ecosystem.config.cjs
Performance Tuning
Node.js Options
// ecosystem.config.cjs
node_args: '--max-old-space-size=2048',
Increase File Descriptors
# Check current limit
ulimit -n
# Increase limit (temporary)
ulimit -n 10000
# Permanent: Edit /etc/security/limits.conf
* soft nofile 10000
* hard nofile 10000
Process Priority
# Start with higher priority (lower nice value)
pm2 start ecosystem.config.cjs --node-args="--nice=-10"
Backup and Restore
Backup PM2 Configuration
# Backup process list
pm2 save
# Backup ecosystem file
cp ecosystem.config.cjs ecosystem.config.cjs.backup
# Backup PM2 directory
tar -czf pm2-backup.tar.gz ~/.pm2
Restore
# Restore PM2 directory
tar -xzf pm2-backup.tar.gz -C ~/
# Resurrect processes
pm2 resurrect
Security Best Practices
Run as Dedicated User
# Create user
sudo useradd -r -s /bin/false pm2user
# Set ownership
sudo chown -R pm2user:pm2user /opt/redmine-gitea-sync
# Run PM2 as user
sudo su - pm2user -s /bin/bash -c "pm2 start /opt/redmine-gitea-sync/ecosystem.config.cjs"
sudo su - pm2user -s /bin/bash -c "pm2 save"
# Setup startup as that user
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u pm2user --hp /home/pm2user
Secure Environment Variables
Never commit sensitive data to version control:
# Protect ecosystem file
chmod 600 ecosystem.config.cjs
# Use external .env file
# In ecosystem.config.cjs:
require('dotenv').config();
env: {
REDMINE_API_KEY: process.env.REDMINE_API_KEY,
GITEA_TOKEN: process.env.GITEA_TOKEN,
}
Quick Reference
Most Common Commands
# Start
pm2 start ecosystem.config.cjs
# Status
pm2 list
# Logs
pm2 logs
# Restart
pm2 restart redmine-gitea-sync
# Stop
pm2 stop redmine-gitea-sync
# Monitor
pm2 monit
# Save
pm2 save
Useful Aliases
Add to ~/.bashrc:
alias pm2-status='pm2 list'
alias pm2-logs='pm2 logs redmine-gitea-sync'
alias pm2-restart='pm2 restart redmine-gitea-sync'
alias pm2-sync='cd /opt/redmine-gitea-sync && pm2 logs redmine-gitea-sync'
Additional Resources
Support
For PM2-specific issues:
- Check PM2 logs:
pm2 logs - Consult PM2 documentation
- Search PM2 GitHub issues
For application issues:
- Check application logs:
pm2 logs redmine-gitea-sync - Review main documentation
- Check server health:
curl http://localhost:3002/health