Production SSH Access Skill
Overview
This skill guides you through accessing and working with the Codante Frontend production server hosted on Digital Ocean.
Server Information
- Host: 216.238.103.47
- User: robertotcestari
- OS: Linux (Ubuntu/Debian)
- Web Server: nginx
- Application Server: pm2 (Node.js process manager) -
codante-io-frontprocess - Runtime: Node.js >= 20
- Application Root:
/var/www/codante-io-front - Deployment Method: rsync (direct, no release directories)
Quick Access
Connect to Production Server
ssh robertotcestari@216.238.103.47
Common SSH Commands
Check pm2 status:
ssh robertotcestari@216.238.103.47 "pm2 status"
Check nginx configuration:
ssh robertotcestari@216.238.103.47 "sudo nginx -t"
List nginx sites:
ssh robertotcestari@216.238.103.47 "ls /etc/nginx/sites-enabled/"
Check service status:
ssh robertotcestari@216.238.103.47 "systemctl status nginx"
File Transfer
WARNING: do not transfer files - this is used only for emergency debugging. To change files in the production server, use the deployment pipeline.
Copy files from production to local:
scp robertotcestari@216.238.103.47:/path/on/server /local/path
Copy files from local to production:
scp /local/path robertotcestari@216.238.103.47:/path/on/server
Production Application Paths
- Application Root:
/var/www/codante-io-front - Source Code:
/var/www/codante-io-front/(direct rsync, no releases/) - Build Output:
/var/www/codante-io-front/dist/(production build) - Node Modules:
/var/www/codante-io-front/node_modules/ - pm2 Config:
/var/www/codante-io-front/pm2.config.jsor ecosystem.config.js - Public:
/var/www/codante-io-front/dist(served by nginx) - .env Config:
/var/www/codante-io-front/.env(if used)
Log Access in Production
pm2 Logs
View pm2 process logs (live):
# Follow codante-io-front logs in real-time
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front"
# View last 100 lines
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front --lines 100"
View pm2 error logs specifically:
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front --err"
View pm2 output logs specifically:
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front --out"
Get pm2 process details:
ssh robertotcestari@216.238.103.47 "pm2 info codante-io-front"
nginx Logs
nginx access logs:
# Real-time access logs
ssh robertotcestari@216.238.103.47 "tail -f /var/log/nginx/access.log"
# Site-specific access logs (if configured)
ssh robertotcestari@216.238.103.47 "tail -f /var/log/nginx/codante-io-front-access.log"
nginx error logs:
# Real-time error logs
ssh robertotcestari@216.238.103.47 "tail -f /var/log/nginx/error.log"
# Site-specific error logs
ssh robertotcestari@216.238.103.47 "tail -f /var/log/nginx/codante-io-front-error.log"
System Logs - nginx/pm2 Services
nginx service logs:
ssh robertotcestari@216.238.103.47 "journalctl -u nginx -n 100 -f"
pm2 service logs (if using systemd):
# If pm2 is managed by systemd
ssh robertotcestari@216.238.103.47 "journalctl -u pm2-robertotcestari -n 100 -f"
View All Logs in Directory
# List log files with sizes
ssh robertotcestari@216.238.103.47 "ls -lh /var/log/nginx/"
# Check application logs if using custom logging
ssh robertotcestari@216.238.103.47 "ls -lh /var/www/codante-io-front/logs/ 2>/dev/null || echo 'No custom logs directory'"
Search and Filter Logs
Find errors in nginx logs:
ssh robertotcestari@216.238.103.47 "grep 'error\|ERROR\|502\|503' /var/log/nginx/error.log | head -50"
Find 502/503 errors:
ssh robertotcestari@216.238.103.47 "grep '502\|503' /var/log/nginx/access.log | tail -20"
Find 4xx errors:
ssh robertotcestari@216.238.103.47 "grep '4[0-9][0-9]' /var/log/nginx/access.log | tail -20"
Monitor logs with filter:
ssh robertotcestari@216.238.103.47 "tail -f /var/log/nginx/error.log | grep -E 'error|502|503|upstream'"
Download Logs Locally
Copy nginx access log:
scp robertotcestari@216.238.103.47:/var/log/nginx/access.log ./nginx-access-backup.log
Copy all nginx logs:
scp -r robertotcestari@216.238.103.47:/var/log/nginx/ ./nginx-logs/
Copy pm2 logs:
# pm2 logs are stored in ~/.pm2/logs/
scp -r robertotcestari@216.238.103.47:~/.pm2/logs/ ./pm2-logs/
pm2 Management
Codante Frontend uses pm2 (Node.js process manager) running the codante-io-front process.
Check pm2 Status
# View all processes
ssh robertotcestari@216.238.103.47 "pm2 status"
# Get detailed process info
ssh robertotcestari@216.238.103.47 "pm2 info codante-io-front"
# View process list with resource usage
ssh robertotcestari@216.238.103.47 "pm2 monit"
View pm2 Logs
# Follow logs in real-time
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front"
# View last N lines
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front --lines 200"
# View error logs only
ssh robertotcestari@216.238.103.47 "pm2 logs codante-io-front --err"
Restart pm2 Process
# Restart the codante-io-front process
ssh robertotcestari@216.238.103.47 "pm2 restart codante-io-front"
# Reload (graceful restart - used for 0-downtime reloads)
ssh robertotcestari@216.238.103.47 "pm2 reload codante-io-front"
# Stop process
ssh robertotcestari@216.238.103.47 "pm2 stop codante-io-front"
# Start process
ssh robertotcestari@216.238.103.47 "pm2 start codante-io-front"
Monitor pm2 Process
# Monitor memory usage
ssh robertotcestari@216.238.103.47 "pm2 monit codante-io-front"
# Get process details including memory
ssh robertotcestari@216.238.103.47 "pm2 info codante-io-front"
# View real-time metrics
ssh robertotcestari@216.238.103.47 "watch 'pm2 status'"
View pm2 Config
# View ecosystem config if exists
ssh robertotcestari@216.238.103.47 "cat /var/www/codante-io-front/ecosystem.config.js 2>/dev/null || cat /var/www/codante-io-front/pm2.config.js 2>/dev/null || echo 'No pm2 config found'"
Common Production Tasks
Check Disk Space
ssh robertotcestari@216.238.103.47 "df -h"
Monitor CPU/Memory
ssh robertotcestari@216.238.103.47 "top -b -n 1 | head -20"
# Check specific process
ssh robertotcestari@216.238.103.47 "ps aux | grep 'node\|pm2'"
Restart Services
# Restart pm2 process
ssh robertotcestari@216.238.103.47 "pm2 restart codante-io-front"
# Restart nginx
ssh robertotcestari@216.238.103.47 "sudo systemctl restart nginx"
# Restart both
ssh robertotcestari@216.238.103.47 "pm2 restart codante-io-front && sudo systemctl restart nginx"
Check Current Deployment
# Check if app directory exists
ssh robertotcestari@216.238.103.47 "ls -la /var/www/codante-io-front/"
# Check git info
ssh robertotcestari@216.238.103.47 "cd /var/www/codante-io-front && git log -5 --oneline 2>/dev/null || echo 'Not a git repo'"
# Check if dist build exists
ssh robertotcestari@216.238.103.47 "ls -la /var/www/codante-io-front/dist/ | head -10"
# Check Node.js version
ssh robertotcestari@216.238.103.47 "node --version"
Deploy New Release
When deploying via GitHub Actions + rsync:
- Push to
mainbranch - GitHub Actions triggers automated deployment
- GitHub Actions handles:
- npm install
- Build production (npm run build)
- rsync to server at
/var/www/codante-io-front - pm2 restart (post-deploy)
Check deployment status:
ssh robertotcestari@216.238.103.47 "ls -lah /var/www/codante-io-front/ | head -20"
Verify Application is Running
# Check if pm2 process is running
ssh robertotcestari@216.238.103.47 "pm2 status | grep codante-io-front"
# Check if nginx is serving requests
ssh robertotcestari@216.238.103.47 "curl -I http://localhost:3000"
# Check nginx proxy to port 3000
ssh robertotcestari@216.238.103.47 "sudo netstat -tlnp | grep -E '3000|80|443'"
Clear Build Cache (if needed)
# Remove node_modules and dist
ssh robertotcestari@216.238.103.47 "cd /var/www/codante-io-front && rm -rf node_modules dist"
# Full rebuild on next deployment
ssh robertotcestari@216.238.103.47 "cd /var/www/codante-io-front && npm install && npm run build"
Security Considerations
- SSH Keys: Ensure your SSH key is added to
~/.ssh/authorized_keyson the server - sudo Access: Use
sudofor privileged commands (requires password or sudo setup) - Environment Variables: Never expose sensitive data in logs or console output
- Log Files: Check logs for errors, security warnings, and performance issues
- Backups: Always ensure backups exist before making changes to production
- Process State: pm2 maintains process state; changes to app code require rebuild and restart
- nginx Proxy: Verify nginx configuration before restarting to avoid service disruption
- Deployment: Use automated GitHub Actions pipeline instead of manual rsync when possible
Troubleshooting
Connection Issues
If you can't connect:
- Verify SSH key is configured:
ssh-keyscan 216.238.103.47 - Check your SSH config:
~/.ssh/config - Test connectivity:
ping 216.238.103.47
Permission Denied
If you get "Permission denied":
- Verify the username is
robertotcestari - Check SSH key permissions:
chmod 600 ~/.ssh/id_rsa - Ensure public key is on server:
cat ~/.ssh/id_rsa.pub
pm2 Process Not Running
If pm2 process is stopped:
- Check status:
pm2 status - View recent logs:
pm2 logs codante-io-front --lines 50 - Restart process:
pm2 restart codante-io-front - Verify app directory exists:
ls /var/www/codante-io-front/
Build Not Found
If npm run build output doesn't exist:
- Check if dist/ folder exists:
ls /var/www/codante-io-front/dist/ - Check package.json build script:
cat /var/www/codante-io-front/package.json | grep -A 5 '"build"' - Manually trigger build:
cd /var/www/codante-io-front && npm install && npm run build
nginx 502 Bad Gateway
If you see 502 errors in nginx:
- Check if pm2 process is running:
pm2 status - Check if Node app is listening on port 3000:
curl http://127.0.0.1:3000 - Check nginx error log:
tail -f /var/log/nginx/error.log - Restart pm2:
pm2 restart codante-io-front - Restart nginx:
sudo systemctl restart nginx
High Memory Usage
If Node process is consuming too much memory:
- Check memory:
ps aux | grep node - View pm2 memory usage:
pm2 info codante-io-front - Check logs for memory leaks:
pm2 logs codante-io-front - Restart process:
pm2 restart codante-io-front - Monitor memory:
pm2 monit
Slow Response Times
If application is slow:
- Check nginx access logs:
tail -f /var/log/nginx/access.log | grep "HTTP/\|response" - Check backend API availability:
curl -I http://127.0.0.1:8000 - Check CPU usage:
top -p $(pgrep -f 'node') - Monitor pm2:
pm2 monit - Check disk I/O:
iostat -x 1
Application Won't Start After Deployment
If app fails to start:
- Check deployment logs:
pm2 logs codante-io-front - Check if dependencies installed:
ls /var/www/codante-io-front/node_modules/ - Check for build errors:
cd /var/www/codante-io-front && npm run build - Verify .env file exists:
test -f /var/www/codante-io-front/.env && echo 'exists' || echo 'missing' - Check if API backend is reachable:
curl http://127.0.0.1:8000/health
When to Use This Skill
Use this skill when you need to:
- ✅ Connect to the production server
- ✅ Debug production issues
- ✅ Access and analyze production logs (pm2, nginx)
- ✅ Monitor real-time log streams
- ✅ Check server logs and metrics
- ✅ Manage pm2 processes
- ✅ Verify deployments
- ✅ Transfer files to/from production
- ✅ Run ad-hoc commands on production
- ✅ Troubleshoot deployment issues
- ✅ Monitor performance and resource usage
- ✅ Check backend API availability
- ✅ Verify nginx proxy configuration
Related Resources
- CLAUDE.md deployment section for CI/CD information
- Server management documentation
- GitHub Actions workflow (
.github/workflows/deploy.yml) - pm2 documentation: https://pm2.keymetrics.io/docs/usage/quick-start/
- React Router documentation: https://reactrouter.com/
Scan to join WeChat group