Deployment Architecture
This document outlines the deployment architecture and strategies for the Stayzr hotel management system, covering infrastructure, environments, and operational considerations.
Deployment Overview
The Stayzr platform is designed for cloud-native deployment with the following architecture:
- Frontend: Static site deployment (Vercel, Netlify, or CDN)
- Backend: Containerized Node.js application
- Database: PostgreSQL with Redis caching
- File Storage: S3-compatible object storage
- Load Balancing: Nginx reverse proxy
Infrastructure Requirements
Minimum System Requirements
- CPU: 2 vCPUs per application instance
- Memory: 4GB RAM per application instance
- Storage: 20GB+ SSD storage for application
- Database: PostgreSQL 15+ with 100GB+ storage
- Network: Public IP with HTTPS capability
Recommended Production Setup
- CPU: 4+ vCPUs per application instance
- Memory: 8GB+ RAM per application instance
- Storage: 50GB+ SSD storage
- Database: PostgreSQL cluster with read replicas
- CDN: CloudFlare or AWS CloudFront
Environment Architecture
Development Environment
Development Setup:
Infrastructure:
- Docker Compose for local development
- PostgreSQL container
- Redis container
- Local file storage
Configuration:
- Hot reloading enabled
- Debug logging active
- Mock external services
- Test data seeding
Staging Environment
Staging Setup:
Infrastructure:
- Production-like environment
- Shared database instance
- Redis cluster
- S3-compatible storage
Configuration:
- Production build artifacts
- Limited external service integration
- Automated testing suite
- Performance monitoring
Production Environment
Production Setup:
Infrastructure:
- Auto-scaling application instances
- High-availability database cluster
- Redis cluster with failover
- CDN for static assets
- Load balancer with SSL termination
Configuration:
- Optimized builds
- Comprehensive monitoring
- Full external service integration
- Automated backups
Container Architecture
Docker Configuration
# Backend Application Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
Docker Compose Production
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.prod
environment:
NODE_ENV: production
DATABASE_URL: ${DATABASE_URL}
REDIS_URL: ${REDIS_URL}
ports:
- "3000:3000"
depends_on:
- postgres
- redis
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: stayzr
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: unless-stopped
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
ports:
- "6379:6379"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- app
restart: unless-stopped
volumes:
postgres_data:
redis_data:
Load Balancer Configuration
Nginx Configuration
upstream backend {
server app:3000;
# Add more servers for scaling
# server app2:3000;
# server app3:3000;
}
server {
listen 80;
server_name stayzr.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name stayzr.example.com;
# SSL Configuration
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# 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";
location / {
proxy_pass http://backend;
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;
}
location /health {
proxy_pass http://backend;
access_log off;
}
# Static assets with caching
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Database Deployment
PostgreSQL Configuration
PostgreSQL Setup:
Version: 15+
Configuration:
- Shared buffers: 25% of RAM
- Work memory: 4MB per connection
- Maintenance work memory: 64MB
- WAL buffers: 16MB
- Checkpoint completion target: 0.9
Security:
- SSL connections required
- Row-level security enabled
- Regular security updates
- Backup encryption
Monitoring:
- Connection pooling with PgBouncer
- Query performance monitoring
- Automated backup verification
- Disk space monitoring
Redis Configuration
Redis Setup:
Version: 7+
Configuration:
- Memory policy: allkeys-lru
- Max memory: 80% of available RAM
- Persistence: AOF enabled
- Replication: Master-slave setup
Security:
- Password authentication
- Network access restrictions
- Regular security updates
Monitoring:
- Memory usage tracking
- Hit rate monitoring
- Latency measurements
- Failover testing
CI/CD Pipeline
GitHub Actions Workflow
name: Deploy to Production
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build application
run: npm run build
- name: Build Docker image
run: docker build -t stayzr:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push stayzr:${{ github.sha }}
deploy:
needs: build-and-test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Deploy to production
run: |
# Deploy script here
echo "Deploying to production..."
Monitoring and Observability
Application Monitoring
Monitoring Stack:
Metrics:
- Prometheus for metrics collection
- Grafana for visualization
- Node Exporter for system metrics
- Application-specific metrics
Logging:
- Structured JSON logging
- Centralized log aggregation
- Log rotation and retention
- Error tracking and alerting
Tracing:
- Distributed request tracing
- Performance bottleneck identification
- Database query analysis
- External service monitoring
Health Checks
// Health check endpoints
export const healthChecks = {
'/health': {
description: 'Basic health check',
checks: ['server', 'memory']
},
'/health/detailed': {
description: 'Comprehensive health check',
checks: ['server', 'database', 'redis', 'external-services']
},
'/health/ready': {
description: 'Readiness probe for Kubernetes',
checks: ['database-connection', 'migrations']
}
};
Security Considerations
Infrastructure Security
- Firewall Configuration: Restrict access to essential ports only
- SSL/TLS: Strong cipher suites and certificate management
- Access Control: Role-based access to infrastructure components
- Network Segmentation: Separate networks for different environments
Application Security
- Environment Variables: Secure storage of secrets and configuration
- Container Security: Regular base image updates and vulnerability scanning
- API Security: Rate limiting, input validation, and authentication
- Data Protection: Encryption at rest and in transit
Backup and Disaster Recovery
Backup Strategy
Database Backups:
Frequency: Daily automated backups
Retention: 30 days for daily, 12 months for monthly
Testing: Monthly restore tests
Storage: Encrypted offsite storage
File Storage Backups:
Frequency: Continuous replication
Retention: 90 days
Testing: Quarterly restore tests
Storage: Multi-region replication
Application Backups:
Configuration: Version controlled
Code: Git repository with tags
Dependencies: Package lock files
Documentation: Automated generation
Disaster Recovery
Recovery Procedures:
RTO (Recovery Time Objective): 4 hours
RPO (Recovery Point Objective): 1 hour
Steps:
1. Infrastructure provisioning
2. Database restoration
3. Application deployment
4. Configuration verification
5. Service validation
6. DNS cutover
Performance Optimization
Application Performance
- Code Optimization: Bundle optimization and tree shaking
- Caching Strategy: Multi-layer caching implementation
- Database Optimization: Query optimization and indexing
- CDN Integration: Static asset delivery optimization
Infrastructure Performance
- Auto Scaling: Horizontal pod autoscaling based on metrics
- Load Balancing: Intelligent request distribution
- Resource Allocation: Right-sizing of compute resources
- Network Optimization: Efficient data transfer protocols
Cost Optimization
Resource Management
Cost Optimization Strategies:
Compute:
- Right-sizing instances
- Spot instances for development
- Scheduled scaling for predictable loads
- Reserved instances for production
Storage:
- Lifecycle policies for data archiving
- Compression for backups
- Efficient file formats
- Regular cleanup of unused data
Network:
- CDN for reduced bandwidth costs
- Efficient API designs
- Data compression
- Regional deployment optimization
Troubleshooting Guide
Common Issues
-
Database Connection Issues
# Check database connectivity
pg_isready -h localhost -p 5432
# Check connection pool status
docker logs stayzr-app | grep "connection pool" -
Memory Issues
# Monitor memory usage
docker stats
# Check for memory leaks
docker exec stayzr-app node --inspect app.js -
Performance Issues
# Check application metrics
curl http://localhost:3000/metrics
# Monitor database queries
docker logs stayzr-postgres | grep "slow query"