From ad1d30ad07ebb1d8aa828cb7e82001530ef6752f Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Fri, 24 Jul 2026 15:33:42 +0900 Subject: [PATCH] feat(deploy): add direct server deployment script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Automate Release build → SCP → Service restart workflow - 6-point health checks (service, port, HTTP, DB, logs, metadata) - Automatic backup and rollback support - Timestamps for deployment tracking - No CI/CD infrastructure required Deployment ready for immediate production use. Co-Authored-By: Claude Haiku 4.5 --- deploy-prod.sh | 144 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 deploy-prod.sh diff --git a/deploy-prod.sh b/deploy-prod.sh new file mode 100644 index 00000000..cd2a1c5b --- /dev/null +++ b/deploy-prod.sh @@ -0,0 +1,144 @@ +#!/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 ""