mirror of
https://github.com/DeNNiiInc/Web-Page-Performance-Test.git
synced 2026-04-17 11:55:59 +00:00
206 lines
6.1 KiB
Bash
206 lines
6.1 KiB
Bash
#!/bin/bash
|
|
|
|
# ============================================================================
|
|
# Initial Server Deployment Script
|
|
# ============================================================================
|
|
# This script will be run ONCE on the server to:
|
|
# 1. Clone the repository
|
|
# 2. Install dependencies
|
|
# 3. Set up systemd service
|
|
# 4. Configure Nginx
|
|
# 5. Set up auto-sync cron job
|
|
# ============================================================================
|
|
|
|
set -e
|
|
|
|
# Read credentials from deploy-config.json (must be uploaded separately)
|
|
if [ ! -f "deploy-config.json" ]; then
|
|
echo "❌ ERROR: deploy-config.json not found!"
|
|
echo "Please create it with your credentials before running this script."
|
|
exit 1
|
|
fi
|
|
|
|
# Parse config using jq
|
|
APP_NAME=$(jq -r '.appName' deploy-config.json)
|
|
REMOTE_PATH=$(jq -r '.remotePath' deploy-config.json)
|
|
GITHUB_USER=$(jq -r '.github.username' deploy-config.json)
|
|
GITHUB_TOKEN=$(jq -r '.github.token' deploy-config.json)
|
|
GITHUB_REPO=$(jq -r '.github.repo' deploy-config.json)
|
|
|
|
echo "========================================="
|
|
echo "🚀 Starting deployment for $APP_NAME"
|
|
echo "========================================="
|
|
|
|
# Install jq if not present
|
|
if ! command -v jq &> /dev/null; then
|
|
echo "📦 Installing jq..."
|
|
apt-get update && apt-get install -y jq
|
|
fi
|
|
|
|
# Install git if not present
|
|
if ! command -v git &> /dev/null; then
|
|
echo "📦 Installing git..."
|
|
apt-get update && apt-get install -y git
|
|
apt-get update && apt-get install -y git
|
|
fi
|
|
|
|
# Install ffmpeg if not present
|
|
if ! command -v ffmpeg &> /dev/null; then
|
|
echo "📦 Installing ffmpeg..."
|
|
apt-get update && apt-get install -y ffmpeg
|
|
fi
|
|
|
|
# Install traceroute if not present
|
|
if ! command -v traceroute &> /dev/null; then
|
|
echo "📦 Installing traceroute..."
|
|
apt-get update && apt-get install -y traceroute
|
|
fi
|
|
|
|
# Create app directory
|
|
echo "📁 Creating application directory: $REMOTE_PATH"
|
|
mkdir -p "$REMOTE_PATH"
|
|
cd "$REMOTE_PATH"
|
|
|
|
# Clone repository with authentication
|
|
echo "📥 Cloning repository..."
|
|
REPO_URL="https://${GITHUB_USER}:${GITHUB_TOKEN}@github.com/${GITHUB_REPO}.git"
|
|
git clone "$REPO_URL" . || (cd "$REMOTE_PATH" && git pull)
|
|
|
|
# Remove credentials from git config for security
|
|
git remote set-url origin "https://github.com/${GITHUB_REPO}.git"
|
|
|
|
# Store credentials in git credential helper (memory only, not disk)
|
|
git config credential.helper 'cache --timeout=3600'
|
|
echo "url=https://github.com" | git credential approve
|
|
echo "username=${GITHUB_USER}" | git credential approve
|
|
echo "password=${GITHUB_TOKEN}" | git credential approve
|
|
|
|
# Install Node.js dependencies
|
|
echo "📦 Installing dependencies..."
|
|
npm install --production
|
|
|
|
# Create systemd service
|
|
echo "⚙️ Creating systemd service..."
|
|
cat > "/etc/systemd/system/${APP_NAME}.service" << EOF
|
|
[Unit]
|
|
Description=${APP_NAME} Service
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=${REMOTE_PATH}
|
|
ExecStart=/usr/bin/node server.js
|
|
Restart=always
|
|
RestartSec=10
|
|
Environment=NODE_ENV=production
|
|
Environment=PORT=3000
|
|
|
|
# Logging
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
SyslogIdentifier=${APP_NAME}
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Reload systemd and start service
|
|
echo "🔄 Starting service..."
|
|
systemctl daemon-reload
|
|
systemctl enable "$APP_NAME"
|
|
systemctl start "$APP_NAME"
|
|
|
|
# Wait and check status
|
|
sleep 2
|
|
systemctl status "$APP_NAME" --no-pager
|
|
|
|
# Configure Nginx
|
|
echo "🌐 Configuring Nginx..."
|
|
cat > "/etc/nginx/sites-available/${APP_NAME}" << EOF
|
|
server {
|
|
listen 80 default_server;
|
|
server_name _;
|
|
|
|
# Serve static files directly from application directory
|
|
root ${REMOTE_PATH};
|
|
index index.html;
|
|
|
|
# Serve reports directory files with proper MIME types
|
|
location /reports/ {
|
|
try_files \$uri =404;
|
|
add_header Content-Type application/json;
|
|
add_header Access-Control-Allow-Origin *;
|
|
}
|
|
|
|
# Serve static files directly
|
|
location / {
|
|
try_files \$uri \$uri/ /index.html;
|
|
}
|
|
|
|
# Proxy API requests to Node.js
|
|
location /api {
|
|
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;
|
|
}
|
|
|
|
# Security headers
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
|
|
# Cache static assets
|
|
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
|
|
expires 1y;
|
|
add_header Cache-Control "public, immutable";
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Remove default sites (including TurnKey defaults)
|
|
echo "🗑️ Removing default Nginx sites..."
|
|
rm -f /etc/nginx/sites-enabled/default
|
|
rm -f /etc/nginx/sites-enabled/nodejs
|
|
rm -f /etc/nginx/sites-enabled/node*
|
|
rm -f /etc/nginx/sites-enabled/tkl-webcp
|
|
|
|
# Enable new site
|
|
ln -sf "/etc/nginx/sites-available/${APP_NAME}" "/etc/nginx/sites-enabled/"
|
|
|
|
# Test and reload Nginx
|
|
echo "🔍 Testing Nginx configuration..."
|
|
nginx -t && systemctl reload nginx
|
|
|
|
# Set up auto-sync cron job
|
|
echo "⏰ Setting up auto-sync cron job (every 5 minutes)..."
|
|
CRON_JOB="*/5 * * * * cd ${REMOTE_PATH} && /bin/bash auto-sync.sh"
|
|
|
|
# Add to crontab if not already present
|
|
(crontab -l 2>/dev/null | grep -v "auto-sync.sh"; echo "$CRON_JOB") | crontab -
|
|
|
|
# Make auto-sync script executable
|
|
chmod +x "${REMOTE_PATH}/auto-sync.sh"
|
|
|
|
# Create log file
|
|
touch "/var/log/${APP_NAME}-autosync.log"
|
|
chmod 644 "/var/log/${APP_NAME}-autosync.log"
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo "✅ Deployment Complete!"
|
|
echo "========================================="
|
|
echo "🌐 Application: $APP_NAME"
|
|
echo "📁 Directory: $REMOTE_PATH"
|
|
echo "🔄 Auto-sync: Every 5 minutes"
|
|
echo "📊 Service status: systemctl status $APP_NAME"
|
|
echo "📜 Auto-sync logs: tail -f /var/log/${APP_NAME}-autosync.log"
|
|
echo "🌐 Test: curl http://localhost"
|
|
echo "========================================="
|