#!/usr/bin/env bash set -Eeuo pipefail WM_DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # shellcheck source=common.sh source "$WM_DEPLOY_DIR/scripts/common.sh" images_env_file="$WM_IMAGES_ENV_FILE" usage() { printf 'Verwendung: %s [--images-file DATEI]\n' "$0" } while [[ "$#" -gt 0 ]]; do case "$1" in --images-file) [[ "$#" -ge 2 ]] || wm_die "Wert für --images-file fehlt." images_env_file="$2" shift 2 ;; -h|--help) usage exit 0 ;; *) wm_die "Unbekannte Option: $1" ;; esac done [[ "$(id -u)" -eq 0 ]] || wm_die "Dieses Skript muss als root ausgeführt werden." wm_load_env wm_assert_data_mount wm_use_images_env "$images_env_file" install -d -m 0755 \ "$WATERMAPS_DATA_DIR/geofabrik" \ "$WATERMAPS_DATA_DIR/local" \ "$WATERMAPS_DATA_DIR/certbot/www" \ "$WATERMAPS_DATA_DIR/certbot/letsencrypt" \ "$WATERMAPS_RUNTIME_DIR/nginx/conf.d" \ "$WATERMAPS_RUNTIME_DIR/locks" \ "$WATERMAPS_RUNTIME_DIR/deployments" wm_acquire_route_lock || wm_die "Deployment abgebrochen, weil gerade Routingdaten aktualisiert werden." active_images_file="$WM_DEPLOY_DIR/.env.images" rollback_images_file="" resolved_images_file="" deployment_complete=false if [[ -f "$active_images_file" ]]; then wm_validate_images_env "$active_images_file" rollback_images_file="$( mktemp "$WATERMAPS_RUNTIME_DIR/deployments/.rollback-images.XXXXXX" )" install -m 0644 "$active_images_file" "$rollback_images_file" fi wm_finish_deployment() { local status=$? trap - EXIT HUP INT TERM set +e if [[ "$status" -ne 0 && "$deployment_complete" != "true" ]]; then if [[ -n "$rollback_images_file" && -f "$rollback_images_file" ]]; then wm_log "Deployment fehlgeschlagen; vorheriges Container-Release wird wiederhergestellt." wm_use_images_env "$rollback_images_file" wm_compose up --detach --no-build --remove-orphans postgres watermaps nginx wm_wait_for_health postgres 240 wm_wait_for_health watermaps 240 wm_wait_for_health nginx 120 if wm_route_data_ready; then wm_smoke_test_route fi if wm_marine_features_ready; then wm_smoke_test_features fi else wm_log "Deployment fehlgeschlagen; für das erste Release existiert noch kein Rollback." fi fi [[ -z "$resolved_images_file" ]] || rm -f "$resolved_images_file" [[ -z "$rollback_images_file" ]] || rm -f "$rollback_images_file" exit "$status" } trap wm_finish_deployment EXIT trap 'exit 130' HUP INT TERM if [[ ! -f "$WATERMAPS_RUNTIME_DIR/nginx/conf.d/default.conf" ]]; then install -m 0644 \ "$WM_DEPLOY_DIR/nginx/bootstrap.conf" \ "$WATERMAPS_RUNTIME_DIR/nginx/conf.d/default.conf" fi revision="$(wm_env_value "$images_env_file" WATERMAPS_DEPLOY_REVISION)" requested_app_image="$(wm_env_value "$images_env_file" WATERMAPS_APP_IMAGE)" requested_route_data_image="$(wm_env_value "$images_env_file" WATERMAPS_ROUTE_DATA_IMAGE)" wm_log "Container-Images für Commit $revision werden aus den Registries geladen." wm_compose --profile maintenance pull watermaps postgres nginx certbot route-data resolved_app_image="$(wm_resolve_image_digest "$requested_app_image")" resolved_route_data_image="$(wm_resolve_image_digest "$requested_route_data_image")" resolved_images_file="$( mktemp "$WATERMAPS_RUNTIME_DIR/deployments/.resolved-images.XXXXXX" )" { printf 'WATERMAPS_DEPLOY_REVISION=%s\n' "$revision" printf 'WATERMAPS_APP_IMAGE=%s\n' "$resolved_app_image" printf 'WATERMAPS_ROUTE_DATA_IMAGE=%s\n' "$resolved_route_data_image" } >"$resolved_images_file" chmod 0644 "$resolved_images_file" wm_use_images_env "$resolved_images_file" wm_log "Persistentes PostGIS wird vor App und Datenimport gestartet." wm_compose up --detach --no-build postgres wm_wait_for_health postgres 240 data_update_required=false update_args=() if [[ "${WATERMAPS_REBUILD_ROUTE_DATA:-false}" == "true" ]]; then data_update_required=true update_args+=(--force) elif ! wm_route_data_ready; then data_update_required=true fi if [[ "${WATERMAPS_REBUILD_MARINE_DATA:-false}" == "true" ]]; then data_update_required=true update_args+=(--force-marine) elif ! wm_marine_features_ready; then data_update_required=true fi if [[ "$data_update_required" == "true" ]]; then wm_log "Deutschland-/Niederlande-Routingdaten und Marine-Features werden sicher vorbereitet." WATERMAPS_ROUTE_LOCK_HELD=true \ "$WM_DEPLOY_DIR/scripts/update-route-data.sh" "${update_args[@]}" fi wm_assert_route_data wm_assert_marine_features wm_log "Commit $revision wird erst mit validierten Routing- und Ereignisdaten gestartet." wm_compose up --detach --no-build --remove-orphans postgres watermaps nginx wm_wait_for_health postgres 240 wm_wait_for_health watermaps 240 wm_wait_for_health nginx 120 wm_smoke_test_route wm_smoke_test_features release_images_file="$WATERMAPS_RUNTIME_DIR/deployments/$revision.env" install -m 0644 "$resolved_images_file" "$release_images_file" if [[ -n "$rollback_images_file" ]]; then install -m 0644 \ "$rollback_images_file" \ "$WATERMAPS_RUNTIME_DIR/deployments/previous.env" fi install -m 0644 "$resolved_images_file" "$active_images_file" deployment_complete=true wm_log "Deployment von Commit $revision ist bereit. Vor dem Livegang liefert Port 80 nur ACME-Challenges und ansonsten HTTP 404."