Files
heicode-win/heicode/bin/azure_vm_deploy.sh
T

62 lines
1.9 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# Azure VM deployment script with canary gate and rollback pointer.
# Prerequisites:
# - SSH access to VM
# - docker + docker compose installed on VM
# - project already synced to VM path
#
# Example:
# VM_HOST=20.1.2.3 VM_USER=azureuser REMOTE_DIR=/opt/heicode/heicode \
# IMAGE_TAG=heicode-manager:local ./bin/azure_vm_deploy.sh
VM_HOST="${VM_HOST:-}"
VM_USER="${VM_USER:-azureuser}"
REMOTE_DIR="${REMOTE_DIR:-/opt/heicode/heicode}"
IMAGE_TAG="${IMAGE_TAG:-heicode-manager:local}"
HEALTH_URL="${HEALTH_URL:-http://127.0.0.1:3000/api/status}"
COMPOSE_FILES="${COMPOSE_FILES:--f docker-compose.azure-vm.yml -f docker-compose.override.yml}"
ENV_FILE="${ENV_FILE:-.env}"
SSH_OPTS="${SSH_OPTS:-}"
if [[ -z "${VM_HOST}" ]]; then
echo "ERROR: VM_HOST is required"
exit 1
fi
REMOTE="${VM_USER}@${VM_HOST}"
SSH="ssh ${SSH_OPTS} ${REMOTE}"
echo "== Azure VM deploy start =="
echo "remote=${REMOTE}"
echo "dir=${REMOTE_DIR}"
echo "image=${IMAGE_TAG}"
echo "compose_files=${COMPOSE_FILES}"
echo "env_file=${ENV_FILE}"
# Persist previous image for rollback.
${SSH} "cd '${REMOTE_DIR}' && \
PREV=\$(docker inspect --format='{{.Config.Image}}' heicode 2>/dev/null || true) && \
echo \"\${PREV}\" > .last_success_image && \
echo \"last_success_image=\${PREV}\""
# Update compose image tag and redeploy.
${SSH} "cd '${REMOTE_DIR}' && \
ENV_FILE='${ENV_FILE}' docker compose ${COMPOSE_FILES} --env-file '${ENV_FILE}' pull heicode || true && \
ENV_FILE='${ENV_FILE}' IMAGE_TAG='${IMAGE_TAG}' docker compose ${COMPOSE_FILES} --env-file '${ENV_FILE}' up -d --build --force-recreate heicode"
echo "Waiting for health endpoint..."
for i in {1..20}; do
if ${SSH} "curl -fsS '${HEALTH_URL}' | grep -q '\"success\":true'"; then
echo "Health check passed."
echo "${IMAGE_TAG}" | ${SSH} "cat > '${REMOTE_DIR}/.last_success_image'"
echo "Deploy completed."
exit 0
fi
sleep 3
done
echo "Health check failed. Run rollback script."
exit 2