#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" DEPLOY_SERVER="${DEPLOY_SERVER:-}" DEPLOY_CONTRACT_UNIT="${DEPLOY_CONTRACT_UNIT:-hyb-oa-automatic-backup-daily.service}" fail() { echo "[deploy-existing][ERROR] $1" >&2 exit 1 } [[ "$DEPLOY_SERVER" =~ ^([A-Za-z0-9._-]+@)?[A-Za-z0-9._-]+$ ]] \ || fail "必须显式提供安全的 DEPLOY_SERVER" [[ "$DEPLOY_CONTRACT_UNIT" =~ ^[A-Za-z0-9_.@-]+\.service$ ]] \ || fail "DEPLOY_CONTRACT_UNIT 格式无效" command -v ssh >/dev/null 2>&1 || fail "缺少 ssh" unit_environment="$(ssh "$DEPLOY_SERVER" \ "systemctl show '${DEPLOY_CONTRACT_UNIT}' -p Environment --value")" [[ -n "$unit_environment" ]] || fail "无法读取既有部署合同 unit" declare -A contract=() for entry in $unit_environment; do key="${entry%%=*}" value="${entry#*=}" case "$key" in REMOTE_DIR|REMOTE_ENV_FILE|COMPOSE_FILE|COMPOSE_PROJECT_NAME|POSTGRES_DATA_DIR|STORAGE_HOST_DIR) contract["$key"]="$value" ;; esac done for key in REMOTE_DIR REMOTE_ENV_FILE COMPOSE_FILE COMPOSE_PROJECT_NAME POSTGRES_DATA_DIR STORAGE_HOST_DIR; do [[ -n "${contract[$key]:-}" ]] || fail "既有部署合同缺少 $key" done echo "[deploy-existing] 已读取受控 unit 合同;路径与标识不回显" DEPLOY_SERVER="$DEPLOY_SERVER" \ REMOTE_DIR="${contract[REMOTE_DIR]}" \ REMOTE_ENV_FILE="${contract[REMOTE_ENV_FILE]}" \ COMPOSE_FILE="${contract[COMPOSE_FILE]}" \ COMPOSE_PROJECT_NAME="${contract[COMPOSE_PROJECT_NAME]}" \ POSTGRES_DATA_DIR="${contract[POSTGRES_DATA_DIR]}" \ STORAGE_HOST_DIR="${contract[STORAGE_HOST_DIR]}" \ DEPLOY_DATA_MODE=existing \ SYNC_ENV=0 \ bash "$ROOT_DIR/deploy/trialrun/deploy.sh"