major-domo-v2/.scripts/deploy.sh
Cal Corum 9e43ffa1c1
All checks were successful
Build Docker Image / build (pull_request) Successful in 1m13s
feat: add local deploy script for production deploys
Automates the SSH-to-akamai deploy workflow: pulls latest image,
restarts the container, and verifies health. Includes pre-deploy
checks (dirty git warning, confirmation prompt) and prints a
rollback command if the image changed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 21:45:56 -06:00

81 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Deploy Discord Bot v2 to production (akamai)
# Pulls latest Docker image and restarts the container.
#
# Usage: .scripts/deploy.sh [-y]
# -y Skip confirmation prompt
set -euo pipefail
SSH_CMD="ssh -i ~/.ssh/cloud_servers_rsa root@akamai"
REMOTE_DIR="/root/container-data/major-domo"
SERVICE="discord-app"
CONTAINER="major-domo-discord-app-1"
IMAGE="manticorum67/major-domo-discordapp:latest"
SKIP_CONFIRM=false
[[ "${1:-}" == "-y" ]] && SKIP_CONFIRM=true
# --- Pre-deploy checks ---
if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then
echo "WARNING: You have uncommitted changes."
git status --short
echo ""
fi
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
COMMIT=$(git log -1 --format='%h %s' 2>/dev/null || echo "unknown")
echo "Branch: ${BRANCH}"
echo "Latest: ${COMMIT}"
echo "Target: akamai (${IMAGE})"
echo ""
if [[ "$SKIP_CONFIRM" != true ]]; then
read -rp "Deploy to production? [y/N] " answer
[[ "$answer" =~ ^[Yy]$ ]] || { echo "Aborted."; exit 0; }
echo ""
fi
# --- Save previous image for rollback ---
PREV_DIGEST=$($SSH_CMD "docker inspect --format='{{index .RepoDigests 0}}' ${IMAGE} 2>/dev/null" || echo "unknown")
# --- Deploy ---
echo "==> Pulling latest image for ${SERVICE}..."
$SSH_CMD "cd ${REMOTE_DIR} && docker compose pull ${SERVICE}"
echo "==> Restarting ${SERVICE}..."
$SSH_CMD "cd ${REMOTE_DIR} && docker compose up -d ${SERVICE}"
echo "==> Waiting 5s for container to start..."
sleep 5
echo "==> Container status:"
$SSH_CMD "docker ps --filter name=${CONTAINER} --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'"
echo ""
echo "==> Last 10 log lines:"
$SSH_CMD "docker logs --tail 10 ${CONTAINER}"
NEW_DIGEST=$($SSH_CMD "docker inspect --format='{{index .RepoDigests 0}}' ${IMAGE} 2>/dev/null || docker inspect --format='{{.Image}}' ${CONTAINER}")
echo ""
echo "==> Image digest: ${NEW_DIGEST}"
if [[ "$PREV_DIGEST" == "$NEW_DIGEST" ]]; then
echo " (unchanged from previous deploy)"
fi
# --- Rollback command ---
if [[ "$PREV_DIGEST" != "unknown" && "$PREV_DIGEST" != "$NEW_DIGEST" ]]; then
echo ""
echo "==> To rollback:"
echo " ssh -i ~/.ssh/cloud_servers_rsa root@akamai \\"
echo " \"cd ${REMOTE_DIR} && docker pull ${PREV_DIGEST} && docker tag ${PREV_DIGEST} ${IMAGE} && docker compose up -d ${SERVICE}\""
fi
echo ""
echo "Deploy complete."