Files
watermaps/deploy/scripts/remote-common.sh
T
BuTzZ 2064570913
Test and publish container images / test (push) Successful in 2m43s
Test and publish container images / publish (push) Successful in 2m56s
Automate immutable production deployments
2026-07-29 13:00:50 +02:00

89 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
WM_LOCAL_DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
WM_LOCAL_ROOT_DIR="$(cd "$WM_LOCAL_DEPLOY_DIR/.." && pwd)"
WM_LOCAL_INFRA_DIR="${WATERMAPS_INFRA_DIR:-$WM_LOCAL_ROOT_DIR/infra/opentofu}"
wm_local_die() {
printf 'Fehler: %s\n' "$*" >&2
exit 1
}
wm_local_iac_command() {
if command -v tofu >/dev/null 2>&1; then
command -v tofu
elif command -v terraform >/dev/null 2>&1; then
command -v terraform
else
return 1
fi
}
wm_local_resolve_ssh() {
local requested_server="${1:-}"
local requested_identity="${2:-}"
local iac_command
WM_SERVER_IPV4="${requested_server:-${WATERMAPS_SERVER_IPV4:-}}"
if [[ -z "$WM_SERVER_IPV4" ]]; then
iac_command="$(wm_local_iac_command)" ||
wm_local_die "OpenTofu/Terraform fehlt und WATERMAPS_SERVER_IPV4 wurde nicht gesetzt."
[[ -d "$WM_LOCAL_INFRA_DIR" ]] ||
wm_local_die "OpenTofu-Verzeichnis fehlt: $WM_LOCAL_INFRA_DIR"
WM_SERVER_IPV4="$("$iac_command" -chdir="$WM_LOCAL_INFRA_DIR" output -raw server_ipv4)"
fi
[[ "$WM_SERVER_IPV4" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] ||
wm_local_die "Ungültige Server-IPv4: $WM_SERVER_IPV4"
WM_SSH_IDENTITY="${requested_identity:-${WATERMAPS_SSH_KEY:-}}"
if [[ -z "$WM_SSH_IDENTITY" ]]; then
candidate_identity="$HOME/.ssh/watermaps_deploy_ed25519"
if [[ -f "$candidate_identity" ]]; then
WM_SSH_IDENTITY="$candidate_identity"
fi
fi
if [[ -n "$WM_SSH_IDENTITY" && ! -f "$WM_SSH_IDENTITY" ]]; then
wm_local_die "SSH-Keydatei nicht gefunden: $WM_SSH_IDENTITY"
fi
WM_SSH_USER="${WATERMAPS_SSH_USER:-deploy}"
[[ "$WM_SSH_USER" =~ ^[a-z_][a-z0-9_-]{0,30}$ ]] ||
wm_local_die "Ungültiger SSH-Benutzer: $WM_SSH_USER"
if [[ -n "${WATERMAPS_REMOTE_SUDO+x}" ]]; then
WM_REMOTE_SUDO="$WATERMAPS_REMOTE_SUDO"
elif [[ "$WM_SSH_USER" == "root" ]]; then
WM_REMOTE_SUDO=""
else
WM_REMOTE_SUDO="sudo"
fi
case "$WM_REMOTE_SUDO" in
""|sudo) ;;
*) wm_local_die "WATERMAPS_REMOTE_SUDO darf nur leer oder 'sudo' sein." ;;
esac
WM_SSH_TARGET="$WM_SSH_USER@$WM_SERVER_IPV4"
WM_SSH_OPTIONS=(-o BatchMode=yes -o StrictHostKeyChecking=accept-new)
if [[ -n "$WM_SSH_IDENTITY" ]]; then
WM_SSH_OPTIONS+=(-i "$WM_SSH_IDENTITY" -o IdentitiesOnly=yes)
fi
}
wm_local_wait_for_ssh() {
local timeout_seconds="${WATERMAPS_SSH_WAIT_SECONDS:-600}"
local deadline=$((SECONDS + timeout_seconds))
while ((SECONDS < deadline)); do
if ssh "${WM_SSH_OPTIONS[@]}" \
-o ConnectTimeout=5 \
"$WM_SSH_TARGET" true >/dev/null 2>&1; then
return 0
fi
printf '[watermaps] Warte auf SSH und Cloud-init-Benutzer %s …\n' "$WM_SSH_TARGET"
sleep 5
done
wm_local_die "SSH war nach ${timeout_seconds}s nicht erreichbar: $WM_SSH_TARGET"
}