Server Configuration & Deployment
Production deployment, security, and optimization guide
Production Environment Setup
This guide covers deploying POSTrack in a production environment with proper security, performance, and monitoring configurations.
Server Requirements
- CPU: 2+ cores (4+ recommended)
- RAM: 8GB minimum (16GB+ recommended)
- Storage: 50GB+ SSD storage
- OS: Ubuntu 20.04 LTS or CentOS 8+
- Network: Static IP address, domain name
Environment Configuration
Production .env Configuration
# CORS Configuration CLIENT_URL=http://localhost:5173 # Database Configuration DB_USERNAME= "root" DB_PASSWORD="root" DB_HOST="localhost" DB_PORT="3306" DB_NAME="invetrack" # JWT Configuration JWT_SECRET=your-super-secure-jwt-secret-key-change-this-in-production JWT_EXPIRES_IN=24h # Server Configuration PORT=3000 NODE_ENV=development # Rate Limiting RATE_LIMIT_MAX=1000 AUTH_RATE_LIMIT_MAX=1000 API_RATE_LIMIT_MAX=1000 OPENAI_MODEL=gpt-4o-mini # Logging LOG_LEVEL=info
Security Warning
Never commit the .env file to version control. Use environment-specific configuration files and secure secret management.
Initial Access
After deploying POSTrack, you can access the application through your configured domain or IP address.
Default Login Credentials
Use these credentials to log in for the first time:
- Email: admin@example.com
- Password: admin123
Security Critical
Change the default password immediately after your first login. In production environments, ensure all default credentials are changed and consider implementing additional security measures such as two-factor authentication.
Process Management
PM2 Configuration
Create
ecosystem.config.jsfor production deployment:
module.exports = {
apps: [{
name: 'POSTrack-server',
script: './bin/www',
instances: 'max', // Use all CPU cores
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_file: './logs/combined.log',
time: true,
log_date_format: 'YYYY-MM-DD HH:mm:ss Z'
}]
};
Systemd Service
Create
/etc/systemd/system/POSTrack.service:
[Unit] Description=POSTrack Point of Sale System After=network.target mysql.service Requires=mysql.service [Service] Type=forking User=www-data Group=www-data WorkingDirectory=/var/www/POSTrack/server ExecStart=/usr/bin/pm2 start ecosystem.config.js ExecReload=/usr/bin/pm2 reload all ExecStop=/usr/bin/pm2 stop all Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
Web Server Configuration
Nginx Configuration
Create
/etc/nginx/sites-available/POSTrack:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# SSL Configuration
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
# Security Headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Rate Limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
# API Routes
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
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;
proxy_cache_bypass $http_upgrade;
}
# Frontend
location / {
root /var/www/POSTrack/client/dist;
try_files $uri $uri/ /index.html;
# Cache static assets
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# File uploads
location /uploads/ {
alias /var/www/POSTrack/server/public/uploads/;
expires 1y;
add_header Cache-Control "public";
}
}
Apache Configuration
Create
/etc/apache2/sites-available/POSTrack.conf:
<VirtualHost *:80> ServerName yourdomain.com ServerAlias www.yourdomain.com Redirect permanent / https://yourdomain.com/ </VirtualHost> <VirtualHost *:443> ServerName yourdomain.com ServerAlias www.yourdomain.com DocumentRoot /var/www/POSTrack/client/dist # SSL Configuration SSLEngine on SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/chain.pem # Security Headers Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff Header always set X-XSS-Protection "1; mode=block" Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" # API Proxy ProxyPreserveHost On ProxyPass /api/ http://localhost:3000/api/ ProxyPassReverse /api/ http://localhost:3000/api/ # File uploads Alias /uploads /var/www/POSTrack/server/public/uploads <Directory /var/www/POSTrack/server/public/uploads> Options -Indexes AllowOverride None Require all granted </Directory> # Frontend <Directory /var/www/POSTrack/client/dist> Options -Indexes AllowOverride All Require all granted </Directory> </VirtualHost>
SSL Certificate Setup
Let's Encrypt with Certbot
Install Certbot
# Ubuntu/Debian sudo apt install certbot python3-certbot-nginx # CentOS/RHEL sudo yum install certbot python3-certbot-nginx
Obtain Certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Auto-renewal
# Test renewal sudo certbot renew --dry-run # Add to crontab for auto-renewal sudo crontab -e # Add: 0 12 * * * /usr/bin/certbot renew --quiet
Monitoring and Logging
Log Management
Configure log rotation in
/etc/logrotate.d/POSTrack:
/var/www/POSTrack/server/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
postrotate
/usr/bin/pm2 reloadLogs
endscript
}
Health Monitoring
Set up monitoring with tools like:
- PM2 Monitoring: Built-in process monitoring
- Uptime Robot: External uptime monitoring
- New Relic: Application performance monitoring
- DataDog: Infrastructure monitoring
Backup Strategy
#!/bin/bash # Database backup script DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/var/backups/POSTrack" DB_NAME="POSTrack_production" # Create backup directory mkdir -p $BACKUP_DIR # Backup database mysqldump -u root -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql # Backup uploads tar -czf $BACKUP_DIR/uploads_backup_$DATE.tar.gz /var/www/POSTrack/server/public/uploads/ # Keep only last 7 days of backups find $BACKUP_DIR -name "*.sql" -mtime +7 -delete find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
Security Hardening
Server Security
- Keep the system and packages updated
- Configure firewall (UFW or iptables)
- Disable root login and use SSH keys
- Install fail2ban for brute force protection
- Use non-standard ports for SSH
Application Security
- Use environment variables for sensitive data
- Implement proper input validation
- Use HTTPS everywhere
- Set secure HTTP headers
- Regular security audits and updates
Database Security
- Use strong passwords
- Limit database user privileges
- Enable SSL for database connections
- Regular security updates
- Monitor database access logs
Performance Optimization
Node.js Optimization
| Setting | Value | Description |
|---|---|---|
| NODE_ENV | production | Enables production optimizations |
| UV_THREADPOOL_SIZE | 128 | Increases thread pool size |
| NODE_OPTIONS | --max-old-space-size=4096 | Increases memory limit |
Database Optimization
- Add appropriate indexes
- Optimize queries
- Use connection pooling
- Regular database maintenance
Caching Strategy
- Implement Redis for session storage
- Use CDN for static assets
- Enable browser caching
- Database query caching
Deployment Checklist
Pre-deployment
- ✅ Test all functionality in staging environment
- ✅ Configure production environment variables
- ✅ Set up SSL certificates
- ✅ Configure web server (Nginx/Apache)
- ✅ Set up database with proper security
- ✅ Configure monitoring and logging
Deployment
- ✅ Deploy application code
- ✅ Run database migrations
- ✅ Start application services
- ✅ Configure load balancer (if applicable)
- ✅ Test all endpoints
- ✅ Verify SSL certificate
Post-deployment
- ✅ Monitor application performance
- ✅ Check error logs
- ✅ Verify backup procedures
- ✅ Test failover procedures
- ✅ Document any custom configurations