Deployment Process Documentation¶
🚀 Deployment Overview¶
Multi-Stage Deployment Pipeline¶
The portfolio infrastructure uses a hybrid deployment approach combining automated CI/CD with manual deployment controls for maximum reliability and flexibility.
graph TD
A[Local Development] --> B[Git Commit]
B --> C[GitHub Push]
C --> D[GitHub Actions]
D --> E{Tests Pass?}
E -->|Yes| F[Build Success]
E -->|No| G[Deployment Blocked]
F --> H[Manual Deployment Decision]
H --> I[Server-Side Scripts]
I --> J[Container Rebuild]
J --> K[Service Health Check]
K --> L[Live Application]
subgraph "Quality Gates"
E1[Linting]
E2[Build Verification]
E3[Docker Image Creation]
end
📋 Deployment Methods¶
1. Automated Git-Based Deployment¶
Mass Repository Management¶
# Deploy all applications with branding updates
/var/www/zaylegend/git-push-all.sh "feat(branding): Add personal favicon and enhanced meta tags"
# Deploy specific application
/var/www/zaylegend/git-push-all.sh "fix: Resolve audio lag" dj-visualizer
# Auto-generated commit messages
/var/www/zaylegend/git-push-all.sh
Process Flow: 1. Change Detection → Analyzes modified files 2. Commit Categorization → Generates semantic commit messages 3. SSH Authentication → Converts HTTPS to SSH automatically 4. Multi-Repo Push → Processes all applications in parallel 5. Status Reporting → Success/failure summary
2. Individual Application Deployment¶
Container-Level Deployment¶
# Deploy specific application with port management
/var/www/zaylegend/deploy-portfolio-app.sh <app-name> <port> [rebuild]
# Examples:
/var/www/zaylegend/deploy-portfolio-app.sh fineline 3003 rebuild
/var/www/zaylegend/deploy-portfolio-app.sh new-feature-app 3008
Deployment Features: - ✅ Port Availability Check → Prevents conflicts - ✅ Container Health Validation → Ensures service quality - ✅ Automatic Rollback → Reverts on failure - ✅ Resource Monitoring → Tracks usage during deployment
3. Infrastructure-Level Deployment¶
Full Stack Management¶
# Portfolio master control
/var/www/zaylegend/portfolio-master.sh [action]
# Available actions:
./portfolio-master.sh start # Start all services
./portfolio-master.sh restart # Restart infrastructure
./portfolio-master.sh status # Health check all services
./portfolio-master.sh logs # Aggregate service logs
🔄 Deployment Scenarios¶
Scenario 1: Feature Update¶
Frontend Application Update¶
# Step 1: Update code and commit
cd /var/www/zaylegend/apps/chord-genesis
git add .
git commit -m "feat: Add chord progression generator"
# Step 2: Push to GitHub (triggers CI/CD)
git push origin main
# Step 3: Deploy locally after CI passes
/var/www/zaylegend/deploy-portfolio-app.sh chord-genesis 3001 rebuild
# Step 4: Verify deployment
curl -I https://zaylegend.com/chord-genesis/
docker logs chord-genesis --tail 20
Scenario 2: New Application Deployment¶
Complete New Service Setup¶
# Step 1: Create application directory
mkdir /var/www/zaylegend/apps/new-app
cd /var/www/zaylegend/apps/new-app
# Step 2: Initialize git repository
git init
git remote add origin https://github.com/yetog/new-app.git
# Step 3: Add Docker configuration
cat > Dockerfile << EOF
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOF
# Step 4: Deploy application
/var/www/zaylegend/deploy-portfolio-app.sh new-app 3008
# Step 5: Update Nginx configuration
# Add location block to /etc/nginx/conf.d/portfolio.conf
# Reload Nginx: sudo systemctl reload nginx
Scenario 3: Emergency Rollback¶
Quick Service Recovery¶
# Step 1: Identify problematic container
docker ps --filter health=unhealthy
# Step 2: Rollback to previous image
docker stop problematic-app
docker run -d --name problematic-app-backup \
-p 3001:80 \
problematic-app:previous-version
# Step 3: Update load balancer
# Temporarily point traffic to backup container
# Step 4: Investigate and fix issue
docker logs problematic-app --since="1h"
# Step 5: Redeploy fixed version
/var/www/zaylegend/deploy-portfolio-app.sh problematic-app 3001 rebuild
🎯 Deployment Strategies¶
Blue-Green Deployment¶
Zero-Downtime Updates¶
# Current implementation (simplified)
OLD_CONTAINER="app-blue"
NEW_CONTAINER="app-green"
# Step 1: Deploy new version
docker run -d --name $NEW_CONTAINER \
-p 3009:80 app:new-version
# Step 2: Health check new container
until docker exec $NEW_CONTAINER curl -f http://localhost/health; do
echo "Waiting for new container to be ready..."
sleep 5
done
# Step 3: Switch traffic (update Nginx upstream)
# Update /etc/nginx/conf.d/portfolio.conf
# proxy_pass http://127.0.0.1:3009/; # Point to new container
# Step 4: Reload Nginx
sudo systemctl reload nginx
# Step 5: Cleanup old container
docker stop $OLD_CONTAINER
docker rm $OLD_CONTAINER
Canary Deployment¶
Gradual Traffic Shifting¶
# Nginx configuration for canary deployment
upstream app_stable {
server 127.0.0.1:3001 weight=90;
}
upstream app_canary {
server 127.0.0.1:3009 weight=10;
}
server {
location /app/ {
# 90% traffic to stable, 10% to canary
proxy_pass http://app_stable;
# Route specific users to canary
if ($cookie_canary = "true") {
proxy_pass http://app_canary;
}
}
}
📊 Deployment Monitoring¶
Real-Time Health Checks¶
Service Validation Script¶
#!/bin/bash
# /var/www/zaylegend/scripts/validate-deployment.sh
SERVICES=("chord-genesis:3001" "fineline:3003" "game-hub:3004" "dj-visualizer:3005" "spritegen:3006" "voice-assistant:3007")
echo "🔍 Validating deployment health..."
for service in "${SERVICES[@]}"; do
IFS=':' read -r name port <<< "$service"
echo -n "Checking $name ($port)... "
if curl -f -s -o /dev/null "http://localhost:$port/"; then
echo "✅ Healthy"
else
echo "❌ Unhealthy"
# Send alert or trigger rollback
docker logs "$name" --tail 10
fi
done
Deployment Metrics¶
Performance Tracking¶
# Deployment duration tracking
DEPLOY_START=$(date +%s)
# ... deployment commands ...
DEPLOY_END=$(date +%s)
DEPLOY_DURATION=$((DEPLOY_END - DEPLOY_START))
echo "📊 Deployment completed in ${DEPLOY_DURATION} seconds"
Resource Impact Monitoring¶
# Pre-deployment resource baseline
PRE_MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
PRE_CPU=$(top -bn1 | grep load | awk '{printf "%.2f", $(NF-2)}')
# Post-deployment resource check
POST_MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
POST_CPU=$(top -bn1 | grep load | awk '{printf "%.2f", $(NF-2)}')
echo "Memory usage: $PRE_MEMORY% → $POST_MEMORY%"
echo "CPU load: $PRE_CPU → $POST_CPU"
🔐 Security in Deployment¶
Secure Deployment Practices¶
Environment Variable Management¶
# Secure secret injection during deployment
docker run -d \
--env-file /secure/app.env \
--name secure-app \
app:latest
Container Security Scanning¶
# Pre-deployment security check
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:latest image app:latest
Deployment Logging¶
Audit Trail¶
# Log all deployment activities
DEPLOY_LOG="/var/log/portfolio-deployments.log"
log_deployment() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1 - $2" >> $DEPLOY_LOG
}
log_deployment "DEPLOY_START" "app-name:version"
log_deployment "DEPLOY_SUCCESS" "app-name:version"
📈 Deployment Optimization¶
Build Cache Optimization¶
# Optimized Docker layer caching
FROM node:18-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Final optimized image
FROM nginx:alpine AS runner
COPY --from=builder /app/dist /usr/share/nginx/html
Parallel Deployment¶
# Deploy multiple applications simultaneously
deploy_app() {
local app=$1
local port=$2
echo "Deploying $app on port $port..."
/var/www/zaylegend/deploy-portfolio-app.sh "$app" "$port" rebuild
}
# Run deployments in parallel
deploy_app "chord-genesis" 3001 &
deploy_app "fineline" 3003 &
deploy_app "game-hub" 3004 &
# Wait for all deployments to complete
wait
echo "All deployments completed!"
Deployment Frequency: On-demand + feature-driven
Average Deployment Time: 2-5 minutes per service
Success Rate: 98% (with automatic rollback)
Downtime: Near-zero with rolling updates
Security Level: Production-grade with audit logging