#!/bin/bash # QuantEngine v0.2 - Direct Server Deployment Script # Usage: bash deploy-prod.sh set -e SERVER_IP="${1:-178.104.200.7}" SERVER_USER="kjh2064" ARTIFACT_PATH="${2:-quantengine-release.tar.gz}" DEPLOY_DIR="/home/kjh2064/deployments" SERVICE_NAME="quantengine" SERVICE_PORT="5000" echo "═══════════════════════════════════════════════════════════════════════════════" echo " QuantEngine Production Deployment" echo "═══════════════════════════════════════════════════════════════════════════════" echo "" echo "Configuration:" echo " Server: $SERVER_IP ($SERVER_USER)" echo " Artifact: $ARTIFACT_PATH" echo " Deploy Dir: $DEPLOY_DIR" echo " Service: $SERVICE_NAME" echo " Port: $SERVICE_PORT" echo "" # Verify artifact exists if [ ! -f "$ARTIFACT_PATH" ]; then echo "❌ ERROR: Artifact not found: $ARTIFACT_PATH" exit 1 fi echo "✓ Artifact found: $ARTIFACT_PATH ($(du -h "$ARTIFACT_PATH" | cut -f1))" echo "" # Step 1: Transfer artifact echo "📦 Step 1: Transferring artifact to server..." TIMESTAMP=$(date +%Y%m%d_%H%M%S) REMOTE_ARTIFACT="$DEPLOY_DIR/quantengine_$TIMESTAMP.tar.gz" REMOTE_EXTRACT="$DEPLOY_DIR/quantengine_$TIMESTAMP" scp "$ARTIFACT_PATH" "$SERVER_USER@$SERVER_IP:$REMOTE_ARTIFACT" echo "✓ Artifact transferred to $REMOTE_ARTIFACT" echo "" # Step 2: Extract on server echo "📂 Step 2: Extracting artifact on server..." ssh "$SERVER_USER@$SERVER_IP" << EXTRACT_EOF set -e mkdir -p "$REMOTE_EXTRACT" cd "$REMOTE_EXTRACT" tar -xzf "$REMOTE_ARTIFACT" echo "✓ Extraction complete" EXTRACT_EOF echo "" # Step 3: Stop service echo "⏹️ Step 3: Stopping QuantEngine service..." ssh "$SERVER_USER@$SERVER_IP" << STOP_EOF set -e sudo systemctl stop $SERVICE_NAME || true echo "✓ Service stopped" sleep 1 STOP_EOF echo "" # Step 4: Update symlink echo "🔗 Step 4: Updating deployment symlink..." ssh "$SERVER_USER@$SERVER_IP" << SYMLINK_EOF set -e # Backup old active OLD_ACTIVE="/home/$SERVER_USER/${SERVICE_NAME}_active_backup" if [ -L "/home/$SERVER_USER/${SERVICE_NAME}_active" ]; then rm -f "\$OLD_ACTIVE" ln -s \$(readlink "/home/$SERVER_USER/${SERVICE_NAME}_active") "\$OLD_ACTIVE" fi # Create new symlink ln -sfn "$REMOTE_EXTRACT/publish_artifact" "/home/$SERVER_USER/${SERVICE_NAME}_active" echo "✓ Symlink updated: /home/$SERVER_USER/${SERVICE_NAME}_active" SYMLINK_EOF echo "" # Step 5: Start service echo "▶️ Step 5: Starting QuantEngine service..." ssh "$SERVER_USER@$SERVER_IP" << START_EOF set -e sudo systemctl start $SERVICE_NAME echo "✓ Service started" sleep 2 START_EOF echo "" # Step 6: Health checks echo "🏥 Step 6: Running health checks..." echo "" # Check 1: Service status echo " [1/6] Service status..." ssh "$SERVER_USER@$SERVER_IP" "sudo systemctl status $SERVICE_NAME --no-pager | head -5" # Check 2: Port listening echo " [2/6] Port $SERVICE_PORT listening..." ssh "$SERVER_USER@$SERVER_IP" "ss -tlnp | grep $SERVICE_PORT || echo 'Port check in progress...'" # Check 3: HTTP response echo " [3/6] HTTP 200 check on /Account/Login..." RESPONSE=$(ssh "$SERVER_USER@$SERVER_IP" "curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:$SERVICE_PORT/Account/Login") if [ "$RESPONSE" = "200" ]; then echo " ✓ HTTP $RESPONSE OK" else echo " ⚠️ HTTP $RESPONSE (expected 200)" fi # Check 4: DB connectivity echo " [4/6] Database connectivity check..." ssh "$SERVER_USER@$SERVER_IP" "journalctl -u $SERVICE_NAME -n 20 --no-pager | grep -i 'password\|28P01' && echo '⚠️ DB auth error found!' || echo '✓ No DB auth errors'" # Check 5: Service logs echo " [5/6] Recent service logs..." ssh "$SERVER_USER@$SERVER_IP" "journalctl -u $SERVICE_NAME -n 5 --no-pager" # Check 6: Deployment info echo " [6/6] Deployment info..." ssh "$SERVER_USER@$SERVER_IP" "readlink /home/$SERVER_USER/${SERVICE_NAME}_active && echo 'Timestamp: $TIMESTAMP'" echo "" echo "═══════════════════════════════════════════════════════════════════════════════" echo "✅ DEPLOYMENT COMPLETE" echo "═══════════════════════════════════════════════════════════════════════════════" echo "" echo "Summary:" echo " Deployed: $REMOTE_EXTRACT" echo " Active: /home/$SERVER_USER/${SERVICE_NAME}_active" echo " Backup: /home/$SERVER_USER/${SERVICE_NAME}_active_backup" echo " Service: $SERVICE_NAME (running)" echo "" echo "Access: http://178.104.200.7/quantengine" echo "Login: http://178.104.200.7/quantengine/Account/Login" echo "" echo "Rollback (if needed):" echo " ssh $SERVER_USER@$SERVER_IP" echo " ln -sfn \$(readlink /home/$SERVER_USER/${SERVICE_NAME}_active_backup) /home/$SERVER_USER/${SERVICE_NAME}_active" echo " sudo systemctl restart $SERVICE_NAME" echo ""