142 lines
6.2 KiB
Bash
Executable File
142 lines
6.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# ─────────────────────────────────────────────────────────────
|
|
# deploy-platform-to-server.sh
|
|
# Run from the VM (backup server) to push the latest platform
|
|
# version to a remote server (e.g. main server after failure).
|
|
# Usage:
|
|
# ./deploy-platform-to-server.sh # deploys to default main server
|
|
# ./deploy-platform-to-server.sh 192.168.1.50 # deploys to custom IP
|
|
# ./deploy-platform-to-server.sh 192.168.1.50 2222 # custom IP + SSH port
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
|
LOCAL_BACKUP_DIR="/backups/platform"
|
|
DEPLOY_DIR="/root/management-platform"
|
|
LOG="/root/deploy-to-server.log"
|
|
|
|
# ── Target server (override via args) ────────────────────────
|
|
TARGET_IP="${1:-173.249.20.244}"
|
|
TARGET_PORT="${2:-22}"
|
|
TARGET_USER="root"
|
|
SSH_KEY="/root/.ssh/contabo-key" # adjust if different on VM
|
|
|
|
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=15 -p $TARGET_PORT -i $SSH_KEY"
|
|
SCP_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=15 -P $TARGET_PORT -i $SSH_KEY"
|
|
|
|
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" | tee -a "$LOG"; }
|
|
|
|
log "════════════════════════════════════════════════"
|
|
log "🚀 Deploy platform → $TARGET_USER@$TARGET_IP:$TARGET_PORT"
|
|
log "════════════════════════════════════════════════"
|
|
|
|
# ── Find latest local platform backup ────────────────────────
|
|
LATEST=$(ls -t "$LOCAL_BACKUP_DIR"/platform-backup-*.tar.gz 2>/dev/null | head -1)
|
|
|
|
if [ -z "$LATEST" ]; then
|
|
log "❌ No local platform backups found in $LOCAL_BACKUP_DIR"
|
|
log " Run pull-platform-backup.sh first"
|
|
exit 1
|
|
fi
|
|
|
|
BACKUP_NAME=$(basename "$LATEST")
|
|
log "📦 Using backup: $BACKUP_NAME"
|
|
|
|
# ── Test SSH connection ───────────────────────────────────────
|
|
log "🔗 Testing SSH connection to $TARGET_IP:$TARGET_PORT ..."
|
|
ssh $SSH_OPTS $TARGET_USER@$TARGET_IP "echo ok" > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
log "❌ Cannot connect to $TARGET_IP:$TARGET_PORT"
|
|
log " Check: SSH key at $SSH_KEY, server is up, port is correct"
|
|
exit 1
|
|
fi
|
|
log "✅ SSH connection OK"
|
|
|
|
# ── Extract backup locally to get the platform files ─────────
|
|
EXTRACT_DIR=$(mktemp -d /tmp/deploy-to-server-XXXXXX)
|
|
log "📂 Extracting backup locally..."
|
|
tar -xzf "$LATEST" -C "$EXTRACT_DIR"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
log "❌ Extraction failed — backup may be corrupt"
|
|
rm -rf "$EXTRACT_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
PLATFORM_SRC=$(find "$EXTRACT_DIR" -maxdepth 3 -type d -name "management-platform" | head -1)
|
|
|
|
if [ -z "$PLATFORM_SRC" ] || [ ! -f "$PLATFORM_SRC/app.py" ]; then
|
|
log "❌ Could not find valid management-platform/app.py in archive"
|
|
rm -rf "$EXTRACT_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
log "✅ Platform source found: $PLATFORM_SRC"
|
|
|
|
# ── Stop the service on remote if running ────────────────────
|
|
log "🛑 Stopping service on remote (if running)..."
|
|
ssh $SSH_OPTS $TARGET_USER@$TARGET_IP \
|
|
"systemctl stop management-platform 2>/dev/null ; pkill -f 'flask\|app.py' 2>/dev/null ; echo stopped"
|
|
|
|
# ── Backup current version on remote ─────────────────────────
|
|
log "📦 Archiving current version on remote..."
|
|
ssh $SSH_OPTS $TARGET_USER@$TARGET_IP \
|
|
"if [ -d /root/management-platform ] && [ \"\$(ls -A /root/management-platform 2>/dev/null)\" ]; then
|
|
mkdir -p /backups/platform/old-deploys
|
|
tar -czf /backups/platform/old-deploys/management-platform.old.\$(date +%Y%m%d_%H%M%S).tar.gz \
|
|
-C /root management-platform 2>/dev/null
|
|
rm -rf /root/management-platform
|
|
ls -t /backups/platform/old-deploys/management-platform.old.*.tar.gz 2>/dev/null \
|
|
| tail -n +3 | xargs rm -f 2>/dev/null
|
|
echo 'archived'
|
|
else
|
|
echo 'nothing to archive'
|
|
fi"
|
|
|
|
# ── Copy platform files to remote ────────────────────────────
|
|
log "📤 Copying platform files to $TARGET_IP ..."
|
|
scp $SCP_OPTS -r "$PLATFORM_SRC" $TARGET_USER@$TARGET_IP:/root/management-platform
|
|
|
|
if [ $? -ne 0 ]; then
|
|
log "❌ SCP failed"
|
|
rm -rf "$EXTRACT_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
log "✅ Files copied"
|
|
|
|
# ── Fix permissions and venv on remote ───────────────────────
|
|
log "🔧 Fixing permissions and venv on remote..."
|
|
ssh $SSH_OPTS $TARGET_USER@$TARGET_IP "
|
|
chmod +x /root/management-platform/*.sh 2>/dev/null
|
|
chmod +x /root/management-platform/*.py 2>/dev/null
|
|
cd /root/management-platform
|
|
if [ ! -d venv ]; then
|
|
echo '🐍 Creating venv...'
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
pip install flask --quiet
|
|
deactivate
|
|
else
|
|
echo '🐍 Venv exists'
|
|
fi
|
|
"
|
|
|
|
# ── Start service on remote ───────────────────────────────────
|
|
log "▶️ Starting management-platform on remote..."
|
|
ssh $SSH_OPTS $TARGET_USER@$TARGET_IP "systemctl start management-platform"
|
|
|
|
sleep 4
|
|
|
|
STATUS=$(ssh $SSH_OPTS $TARGET_USER@$TARGET_IP "systemctl is-active management-platform 2>/dev/null")
|
|
|
|
if [ "$STATUS" = "active" ]; then
|
|
log "✅ Service is running on $TARGET_IP"
|
|
log "🌐 Access at: http://$TARGET_IP:5000"
|
|
else
|
|
log "⚠️ Service may not be running (status: $STATUS)"
|
|
log " Check on remote: journalctl -u management-platform -n 30"
|
|
fi
|
|
|
|
# ── Cleanup ───────────────────────────────────────────────────
|
|
rm -rf "$EXTRACT_DIR"
|
|
log "🎉 Done — platform deployed to $TARGET_IP from backup: $BACKUP_NAME"
|