Infrastructure Orchestration Guide¶
đ¯ Complete System Recreation¶
This guide enables you to recreate the entire zaylegend.com infrastructure from scratch, including all applications, configurations, and deployment pipelines.
Prerequisites¶
- Ubuntu Server 18.04+ (tested on 20.04 LTS)
- Domain name with DNS pointing to server
- SSH access to the server
- GitHub account with repository access
đī¸ Phase 1: Base System Setup¶
1.1 System Preparation¶
# Update system packages
sudo apt update && sudo apt upgrade -y
# Install essential packages
sudo apt install -y curl wget git htop tree unzip nginx
# Install Node.js (v18 LTS)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Verify installations
node --version # Should show v18.x.x
npm --version # Should show 9.x.x
nginx -version # Should show nginx version
1.2 Docker Installation¶
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add user to docker group
sudo usermod -aG docker $USER
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Enable and start Docker
sudo systemctl enable docker
sudo systemctl start docker
# Verify installation
docker --version
docker-compose --version
1.3 SSL Certificate Setup¶
# Install Certbot
sudo apt install -y certbot python3-certbot-nginx
# Obtain SSL certificate (replace zaylegend.com with your domain)
sudo certbot --nginx -d zaylegend.com -d www.zaylegend.com
# Setup auto-renewal
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo crontab -
đī¸ Phase 2: Directory Structure & Git Setup¶
2.1 Create Directory Structure¶
# Create main directory structure
sudo mkdir -p /var/www/zaylegend/{apps,portfolio,scripts,infrastructure-docs}
sudo chown -R $USER:$USER /var/www/zaylegend
# Create apps directory structure
mkdir -p /var/www/zaylegend/apps/{chord-genesis,dj-visualizer,fineline,game-hub,knowledge-base,spritegen,voice-assistant,contentforge}
# Create script directories
mkdir -p /var/www/zaylegend/scripts/{deployment,maintenance,monitoring}
2.2 SSH Key Setup for GitHub¶
# Generate SSH key for GitHub deployment
ssh-keygen -t ed25519 -f ~/.ssh/github_actions_deploy -N ""
# Display public key (add this to GitHub deploy keys)
cat ~/.ssh/github_actions_deploy.pub
# Create SSH config
cat > ~/.ssh/config << EOF
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_actions_deploy
IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config
đĻ Phase 3: Application Deployment¶
3.1 Clone All Repositories¶
cd /var/www/zaylegend/apps
# Clone each application repository
git clone git@github.com:yetog/chord-genesis.git
git clone git@github.com:yetog/apr.git dj-visualizer
git clone git@github.com:yetog/fineline.git
git clone git@github.com:yetog/playful-space-arcade.git game-hub
git clone git@github.com:yetog/knowledge-base.git
git clone git@github.com:yetog/spritegen.git
git clone git@github.com:yetog/voice-agent-11.git voice-assistant
git clone git@github.com:yetog/spritegen.git contentforge
# Set up main portfolio site
cd /var/www/zaylegend
# Add your portfolio repository here
3.2 Deploy Management Scripts¶
cd /var/www/zaylegend
# Create the deployment script
cat > deploy-portfolio-app.sh << 'EOF'
#!/bin/bash
set -e
# Portfolio App Deployment Script
# Usage: ./deploy-portfolio-app.sh <app-name> <port> [rebuild]
APP_NAME="$1"
APP_PORT="$2"
REBUILD_FORCE="$3"
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Helper functions
log_info() { echo -e "${BLUE}âšī¸ $1${NC}"; }
log_success() { echo -e "${GREEN}â
$1${NC}"; }
log_warning() { echo -e "${YELLOW}â ī¸ $1${NC}"; }
log_error() { echo -e "${RED}â $1${NC}"; }
# Validation
if [[ -z "$APP_NAME" || -z "$APP_PORT" ]]; then
log_error "Usage: $0 <app-name> <port> [rebuild]"
exit 1
fi
APP_DIR="/var/www/zaylegend/apps/${APP_NAME}"
BASE_PATH="/${APP_NAME}/"
# Check if app directory exists
if [[ ! -d "$APP_DIR" ]]; then
log_error "App directory not found: $APP_DIR"
exit 1
fi
cd "$APP_DIR"
# Stop existing container if rebuilding
if [[ "$REBUILD_FORCE" == "rebuild" ]]; then
log_info "Rebuilding $APP_NAME..."
docker stop "$APP_NAME" 2>/dev/null || true
docker rm "$APP_NAME" 2>/dev/null || true
fi
# Build and run container
log_info "Building Docker image for $APP_NAME..."
docker build -t "$APP_NAME:latest" .
log_info "Starting container on port $APP_PORT..."
docker run -d \
--name "$APP_NAME" \
-p "$APP_PORT:80" \
--restart unless-stopped \
"$APP_NAME:latest"
# Health check
sleep 5
if curl -f -s "http://localhost:$APP_PORT/" > /dev/null; then
log_success "$APP_NAME deployed successfully on port $APP_PORT"
else
log_error "Health check failed for $APP_NAME"
exit 1
fi
EOF
chmod +x deploy-portfolio-app.sh
3.3 Create Git Management Script¶
# Download the git-push-all.sh script from your infrastructure
curl -o git-push-all.sh https://raw.githubusercontent.com/your-repo/infrastructure/main/git-push-all.sh
chmod +x git-push-all.sh
đ Phase 4: Nginx Configuration¶
4.1 Main Nginx Configuration¶
# Backup default config
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
# Create portfolio configuration
sudo cat > /etc/nginx/conf.d/portfolio.conf << 'EOF'
# Auto-generated NGINX configuration for portfolio
server {
listen 80;
listen 443 ssl http2;
server_name zaylegend.com www.zaylegend.com;
# SSL configuration (certificates will be added by certbot)
ssl_certificate /etc/letsencrypt/live/zaylegend.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/zaylegend.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header X-XSS-Protection "1; mode=block" always;
# Gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
# Portfolio (root)
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
# Applications (add each application here)
location /chord-genesis/ {
proxy_pass http://127.0.0.1:3001/;
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;
}
# Knowledge base (static files)
location /knowledge-base/ {
alias /var/www/zaylegend/apps/knowledge-base/;
index index.html;
try_files $uri $uri/ $uri.html /knowledge-base/index.html;
}
}
# HTTP to HTTPS redirect
server {
if ($host = www.zaylegend.com) {
return 301 https://$host$request_uri;
}
if ($host = zaylegend.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name zaylegend.com www.zaylegend.com;
return 404;
}
EOF
# Test and reload nginx
sudo nginx -t
sudo systemctl reload nginx
4.2 Nginx Route Generator Script¶
# Create script to automatically add application routes
cat > /var/www/zaylegend/scripts/update-nginx-routes.sh << 'EOF'
#!/bin/bash
NGINX_CONF="/etc/nginx/conf.d/portfolio.conf"
APPS=("chord-genesis:3001" "fineline:3003" "game-hub:3004" "dj-visualizer:3005" "spritegen:3006" "voice-assistant:3007")
echo "Updating Nginx routes..."
for app_config in "${APPS[@]}"; do
IFS=':' read -r app_name port <<< "$app_config"
# Add location block if it doesn't exist
if ! grep -q "location /$app_name/" "$NGINX_CONF"; then
echo "Adding route for $app_name..."
# Insert location block before the closing }
# This is a simplified version - in practice, you'd use a template
fi
done
sudo nginx -t && sudo systemctl reload nginx
echo "Nginx routes updated successfully!"
EOF
chmod +x /var/www/zaylegend/scripts/update-nginx-routes.sh
đŗ Phase 5: Docker Services Deployment¶
5.1 Create Master Docker Compose¶
cat > /var/www/zaylegend/apps/docker-compose.yml << 'EOF'
version: '3.8'
services:
chord-genesis:
build: ./chord-genesis
container_name: chord-genesis
ports: ["3001:80"]
restart: unless-stopped
networks: [app-network]
environment: [NODE_ENV=production]
fineline:
build: ./fineline
container_name: fineline
ports: ["3003:80"]
restart: unless-stopped
networks: [app-network]
environment: [NODE_ENV=production]
game-hub:
build: ./game-hub
container_name: game-hub
ports: ["3004:80"]
restart: unless-stopped
networks: [app-network]
environment: [NODE_ENV=production]
dj-visualizer:
build: ./dj-visualizer
container_name: dj-visualizer
ports: ["3005:80"]
restart: unless-stopped
networks: [app-network]
environment: [NODE_ENV=production]
spritegen:
build: ./spritegen
container_name: spritegen
ports: ["3006:80"]
restart: unless-stopped
networks: [app-network]
environment: [NODE_ENV=production]
networks:
app-network:
driver: bridge
name: zaylegend-apps
volumes:
app-data:
driver: local
EOF
5.2 Deploy All Applications¶
cd /var/www/zaylegend/apps
# Deploy all applications at once
docker-compose up -d --build
# Or deploy individually
./deploy-portfolio-app.sh chord-genesis 3001
./deploy-portfolio-app.sh fineline 3003
./deploy-portfolio-app.sh game-hub 3004
./deploy-portfolio-app.sh dj-visualizer 3005
./deploy-portfolio-app.sh spritegen 3006
./deploy-portfolio-app.sh voice-assistant 3007
# Verify all containers are running
docker ps
đ Phase 6: CI/CD Pipeline Setup¶
6.1 GitHub Actions Setup¶
# Create GitHub Actions workflow for each app
for app in chord-genesis fineline game-hub dj-visualizer spritegen voice-assistant contentforge; do
mkdir -p "/var/www/zaylegend/apps/$app/.github/workflows"
cat > "/var/www/zaylegend/apps/$app/.github/workflows/deploy.yml" << EOF
name: Deploy đ $app
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter (if available)
run: npm run lint || echo "No linter configured"
- name: Build application
run: npm run build || echo "No build script configured"
- name: Build Docker image (if Dockerfile exists)
run: |
if [ -f Dockerfile ]; then
docker build -t $app:latest .
else
echo "No Dockerfile found, skipping Docker build"
fi
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Deploy notification
run: |
echo "đ $app deployed successfully!"
echo "đ¯ Build SHA: \${{ github.sha }}"
EOF
done
6.2 Webhook Integration (Optional)¶
# Create webhook handler for automated deployment
cat > /var/www/zaylegend/scripts/webhook-handler.sh << 'EOF'
#!/bin/bash
# Simple webhook handler for GitHub Actions
# This would be called by GitHub Actions to trigger deployment
APP_NAME="$1"
GITHUB_SHA="$2"
echo "Deploying $APP_NAME with SHA: $GITHUB_SHA"
cd "/var/www/zaylegend/apps/$APP_NAME"
git pull origin main
# Rebuild and deploy
/var/www/zaylegend/deploy-portfolio-app.sh "$APP_NAME" "$(docker port "$APP_NAME" | cut -d: -f2 | cut -d- -f1)" rebuild
echo "Deployment completed for $APP_NAME"
EOF
chmod +x /var/www/zaylegend/scripts/webhook-handler.sh
đ Phase 7: Monitoring & Maintenance¶
7.1 Health Monitoring Setup¶
# Create comprehensive health check
cat > /var/www/zaylegend/scripts/health-check.sh << 'EOF'
#!/bin/bash
echo "=== Portfolio Infrastructure Health Check ==="
echo "$(date)"
echo
# System resources
echo "=== System Resources ==="
echo "Disk Usage:"
df -h | head -5
echo
echo "Memory Usage:"
free -h
echo
# Services status
echo "=== Services Status ==="
systemctl is-active nginx && echo "â
Nginx: Active" || echo "â Nginx: Inactive"
systemctl is-active docker && echo "â
Docker: Active" || echo "â Docker: Inactive"
echo
# Container health
echo "=== Container Health ==="
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo
# Application endpoints
echo "=== Application Health ==="
APPS=("chord-genesis:3001" "fineline:3003" "game-hub:3004" "dj-visualizer:3005" "spritegen:3006" "voice-assistant:3007")
for app_config in "${APPS[@]}"; do
IFS=':' read -r app_name port <<< "$app_config"
if curl -f -s "http://localhost:$port/" > /dev/null; then
echo "â
$app_name ($port): Healthy"
else
echo "â $app_name ($port): Unhealthy"
fi
done
EOF
chmod +x /var/www/zaylegend/scripts/health-check.sh
# Setup cron job for regular health checks
echo "*/15 * * * * /var/www/zaylegend/scripts/health-check.sh >> /var/log/portfolio-health.log" | crontab -
7.2 Backup Strategy¶
# Create backup script
cat > /var/www/zaylegend/scripts/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/portfolio"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="portfolio-backup-$DATE.tar.gz"
mkdir -p "$BACKUP_DIR"
echo "Creating backup: $BACKUP_FILE"
# Backup configuration files and scripts
tar -czf "$BACKUP_DIR/$BACKUP_FILE" \
/var/www/zaylegend/*.sh \
/var/www/zaylegend/infrastructure-docs/ \
/var/www/zaylegend/scripts/ \
/etc/nginx/conf.d/portfolio.conf \
--exclude=node_modules \
--exclude=.git \
/var/www/zaylegend/apps/*/package.json \
/var/www/zaylegend/apps/*/Dockerfile \
/var/www/zaylegend/apps/*/docker-compose.yml
# Keep only last 7 days of backups
find "$BACKUP_DIR" -name "portfolio-backup-*.tar.gz" -mtime +7 -delete
echo "Backup completed: $BACKUP_DIR/$BACKUP_FILE"
EOF
chmod +x /var/www/zaylegend/scripts/backup.sh
# Schedule daily backups
echo "0 2 * * * /var/www/zaylegend/scripts/backup.sh" | crontab -
â Phase 8: Verification & Testing¶
8.1 Complete System Test¶
# Run complete verification
cd /var/www/zaylegend
# Test all applications
./scripts/health-check.sh
# Test deployment pipeline
./git-push-all.sh "test: Infrastructure deployment verification"
# Test individual app deployment
./deploy-portfolio-app.sh chord-genesis 3001 rebuild
# Test SSL certificate
curl -I https://zaylegend.com/
# Test all application endpoints
for port in 3001 3003 3004 3005 3006 3007; do
echo "Testing port $port..."
curl -I "https://zaylegend.com:$port/" || echo "Failed"
done
8.2 Performance Baseline¶
# Create performance monitoring
cat > /var/www/zaylegend/scripts/performance-check.sh << 'EOF'
#!/bin/bash
echo "=== Performance Baseline Check ==="
# Response time test
echo "Response Times:"
for app in "" "chord-genesis" "fineline" "game-hub" "dj-visualizer" "spritegen"; do
url="https://zaylegend.com/$app"
time=$(curl -w "%{time_total}" -o /dev/null -s "$url")
echo "$app: ${time}s"
done
# Resource usage
echo "Resource Usage:"
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
EOF
chmod +x /var/www/zaylegend/scripts/performance-check.sh
đ¯ Final Checklist¶
Infrastructure Complete â ¶
- [ ] Base system with Ubuntu + Docker + Nginx
- [ ] SSL certificates configured and auto-renewing
- [ ] All applications cloned and deployed
- [ ] Docker containers running and healthy
- [ ] Nginx routes configured for all apps
- [ ] Git management scripts operational
- [ ] CI/CD pipelines active on GitHub
- [ ] Monitoring and health checks running
- [ ] Backup strategy implemented
- [ ] Security headers and configurations applied
Operational Verification â ¶
- [ ] All applications accessible via HTTPS
- [ ] Container health checks passing
- [ ] Git push/pull operations working
- [ ] Deployment scripts functional
- [ ] SSL certificate valid and trusted
- [ ] Performance baselines established
- [ ] Log aggregation working
- [ ] Backup and recovery tested
đ Infrastructure Orchestration Complete!
Your zaylegend.com infrastructure is now fully operational with:
- â
8+ containerized applications
- â
Automated CI/CD pipelines
- â
SSL-secured domain
- â
Comprehensive monitoring
- â
Disaster recovery capabilities
- â
Automated deployment workflows
Total Setup Time: 2-4 hours (depending on domain propagation)
Maintenance: Automated with manual oversight
Scalability: Ready for additional applications and services