#!/usr/bin/env bash set -euo pipefail REMOTE_USER="bee" REMOTE_BIN="/usr/local/bin/bee" LOCAL_BIN="audit/bee" SERVICES="bee-audit bee-web" # --- IP --- if [[ $# -ge 1 ]]; then HOST="$1" else read -rp "IP адрес хоста: " HOST fi [[ -z "$HOST" ]] && { echo "Ошибка: IP не указан"; exit 1; } # --- SSH options --- SSH_OPTS=(-o StrictHostKeyChecking=no -o ConnectTimeout=10) # Проверяем, нужен ли пароль SSH_PASS="" if ! ssh "${SSH_OPTS[@]}" -o BatchMode=yes "${REMOTE_USER}@${HOST}" true 2>/dev/null; then if command -v sshpass &>/dev/null; then read -rsp "Пароль для ${REMOTE_USER}@${HOST}: " SSH_PASS echo SSH_CMD=(sshpass -p "$SSH_PASS" ssh "${SSH_OPTS[@]}") SCP_CMD=(sshpass -p "$SSH_PASS" scp "${SSH_OPTS[@]}") else echo "sshpass не установлен. Введите пароль вручную при запросе (или установите SSH-ключ)." SSH_CMD=(ssh "${SSH_OPTS[@]}") SCP_CMD=(scp "${SSH_OPTS[@]}") fi else SSH_CMD=(ssh "${SSH_OPTS[@]}") SCP_CMD=(scp "${SSH_OPTS[@]}") fi REMOTE="${REMOTE_USER}@${HOST}" # --- Build --- echo "==> Сборка бинарника..." ( cd audit VERSION=$(sh ./scripts/resolve-version.sh 2>/dev/null || echo "dev") CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -ldflags "-X main.Version=${VERSION}" -o bee ./cmd/bee ) echo " OK: $(ls -lh "${LOCAL_BIN}" | awk '{print $5, $9}')" LOCAL_SHA="$(shasum -a 256 "${LOCAL_BIN}" | awk '{print $1}')" REMOTE_SHA="$("${SSH_CMD[@]}" "$REMOTE" "if [ -f '${REMOTE_BIN}' ] && command -v sha256sum >/dev/null 2>&1; then sha256sum '${REMOTE_BIN}' | awk '{print \\$1}'; fi" 2>/dev/null || true)" if [[ -n "${REMOTE_SHA}" && "${LOCAL_SHA}" == "${REMOTE_SHA}" ]]; then echo "==> Бинарник не изменился (${LOCAL_SHA}); копирование и перезапуск сервисов пропущены." exit 0 fi # --- Deploy --- echo "==> Копирование на ${REMOTE}..." "${SCP_CMD[@]}" "${LOCAL_BIN}" "${REMOTE}:/tmp/bee-new" echo "==> Замена бинарника и перезапуск сервисов..." "${SSH_CMD[@]}" "$REMOTE" bash -s < Готово."