#!/usr/bin/env bash set -euo pipefail IMAGE="git.mchus.pro/reanimator/core" TAG="${1:-latest}" DEPLOY_DIR="${DEPLOY_DIR:-/appdata/reanimator}" DEPLOY_PLATFORM="linux/amd64" LOCAL_DEPLOY_DIR="$DEPLOY_DIR" REPO_LOCAL_DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)/infra/reanimator" echo "Deploy target:" echo " 1) local" echo " 2) remote (SSH)" echo " 3) push only" read -rp "Choice [1/2/3]: " choice case "$choice" in 1) TARGET="local" ;; 2) read -rp "SSH target (login@hostname): " SSH_TARGET TARGET="ssh" ;; 3) TARGET="push-only" ;; *) echo "Invalid choice" >&2 exit 1 ;; esac echo "==> Building and pushing $IMAGE:$TAG ($DEPLOY_PLATFORM)..." docker buildx build --platform "$DEPLOY_PLATFORM" -t "$IMAGE:$TAG" --push . if [ "$TARGET" = "push-only" ]; then echo "==> Push complete. No deploy requested." exit 0 fi if [ "$TARGET" = "local" ]; then echo "==> Deploying locally..." export DOCKER_DEFAULT_PLATFORM="$DEPLOY_PLATFORM" export REANIMATOR_IMAGE="$IMAGE" export REANIMATOR_TAG="$TAG" docker pull --platform "$DEPLOY_PLATFORM" "$IMAGE:$TAG" if [ ! -d "$LOCAL_DEPLOY_DIR" ] && [ -d "$REPO_LOCAL_DEPLOY_DIR" ]; then LOCAL_DEPLOY_DIR="$REPO_LOCAL_DEPLOY_DIR" fi if [ ! -d "$LOCAL_DEPLOY_DIR" ]; then echo "Local deploy directory not found: $LOCAL_DEPLOY_DIR" >&2 exit 1 fi if [ ! -f "$LOCAL_DEPLOY_DIR/reanimator.env" ]; then echo "Local env file not found: $LOCAL_DEPLOY_DIR/reanimator.env" >&2 if [ -f "$LOCAL_DEPLOY_DIR/reanimator.env.example" ]; then echo "Create it from: $LOCAL_DEPLOY_DIR/reanimator.env.example" >&2 fi exit 1 fi echo "==> Using local deploy dir: $LOCAL_DEPLOY_DIR" cd "$LOCAL_DEPLOY_DIR" docker compose pull docker compose up -d --remove-orphans echo "-- Status:" docker compose ps echo "==> Done." else echo "==> Deploying on $SSH_TARGET..." ssh "$SSH_TARGET" " set -euo pipefail export REANIMATOR_IMAGE=$IMAGE export REANIMATOR_TAG=$TAG echo '-- Pulling image...' docker pull $IMAGE:$TAG echo '-- Restarting container...' cd $DEPLOY_DIR docker compose pull docker compose up -d --remove-orphans echo '-- Status:' docker compose ps " echo "==> Done." fi