Server Configuration & Deployment
Production deployment, security, and optimization guide
Production Environment Setup
This guide covers deploying AsseTrack 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
# Database Configuration
DB_HOST=localhost
DB_PORT=3306
DB_NAME=assettrack_db
DB_USERNAME=root
DB_PASSWORD=your_mysql_password
# 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
# CORS Configuration
ALLOWED_ORIGINS=http://localhost:5000,http://localhost:3000
# Rate Limiting
RATE_LIMIT_MAX=1000
AUTH_RATE_LIMIT_MAX=1000
API_RATE_LIMIT_MAX=1000
# Logging
LOG_LEVEL=info
Security Warning
Never commit the .env file to version control. Use environment-specific configuration files and secure secret management.
Process Management
PM2 Configuration
Create ecosystem.config.js
for production deployment:
module.exports = {
apps: [{
name: 'assettrack-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/assettrack.service
:
[Unit]
Description=AsseTrack Asset Management System
After=network.target mysql.service
Requires=mysql.service
[Service]
Type=forking
User=www-data
Group=www-data
WorkingDirectory=/var/www/assettrack/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/assettrack
:
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/assettrack/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/assettrack/server/public/uploads/;
expires 1y;
add_header Cache-Control "public";
}
}
Apache Configuration
Create /etc/apache2/sites-available/assettrack.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/assettrack/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/assettrack/server/public/uploads
<Directory /var/www/assettrack/server/public/uploads>
Options -Indexes
AllowOverride None
Require all granted
</Directory>
# Frontend
<Directory /var/www/assettrack/client/dist>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
SSL Certificate Setup
Let's Encrypt with Certbot
1
Install Certbot
# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx
2
Obtain Certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
3
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/assettrack
:
/var/www/assettrack/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/assettrack"
DB_NAME="assettrack_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/assettrack/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