#!/usr/bin/env bash set +x set -Eeuo pipefail umask 022 root=${1:?} release=${2:?} [[ "$root" == /*/gray-logistics-chat && "$root" != *..* ]] || exit 2 [[ "$release" == "$root"/releases/* && "$release" != *..* ]] || exit 2 [[ "$(cat "$root/.project")" == baiyue-logistics-chat-gray ]] || exit 2 while IFS='=' read -r name value; do case "$name" in CHAT_ROOT|CHAT_RELEASE|CHAT_DOMAIN|CHAT_PROXY_DIR|CHAT_TLS_CERT|CHAT_TLS_KEY|CHAT_CERTBOT_IMAGE|CHAT_CERTBOT_IMAGE_ID|SOURCE_COMMIT) [[ "$value" =~ ^[A-Za-z0-9_./:-]+$ ]] || exit 2 printf -v "$name" '%s' "$value" ;; esac done < "$release/release.env" [[ "$CHAT_ROOT" == "$root" && "$CHAT_RELEASE" == "$release" ]] || exit 2 [[ "$CHAT_TLS_CERT" == "$root/tls/config/live/$CHAT_DOMAIN/fullchain.pem" ]] || exit 2 [[ "$CHAT_TLS_KEY" == "$root/tls/config/live/$CHAT_DOMAIN/privkey.pem" ]] || exit 2 [[ "$CHAT_CERTBOT_IMAGE" =~ ^baiyue-logistics-chat-certbot:[a-f0-9]{12}-b[0-9]+$ ]] || exit 2 loaded_id=$(awk -F= '$1 == "CERTBOT_IMAGE_ID" {print $2}' "$release/loaded-image-ids.env") [[ "$loaded_id" =~ ^sha256:[a-f0-9]{64}$ ]] || exit 2 [[ "$(docker image inspect --format '{{.Id}}' "$CHAT_CERTBOT_IMAGE")" == "$loaded_id" ]] || { echo 'Loaded certificate image changed.' >&2; exit 2; } [[ "$(docker image inspect --format '{{index .Config.Labels "org.opencontainers.image.revision"}}' "$CHAT_CERTBOT_IMAGE")" == "$SOURCE_COMMIT" ]] || exit 2 site="$CHAT_PROXY_DIR/baiyue-logistics-chat-gray.conf" if [[ -f "$site" ]]; then head -n 1 "$site" | grep -Fq 'Managed for baiyue-logistics-chat-gray' || exit 2 else for candidate in "$CHAT_PROXY_DIR/"*.conf; do [[ -f "$candidate" ]] || continue if grep -Fq "$CHAT_DOMAIN" "$candidate"; then echo 'Domain already belongs to another site.' >&2; exit 2; fi done cat > "$release/bootstrap.conf" </dev/null; then docker run --rm --name baiyue-logistics-chat-certbot-issue \ -v "$root/tls/config:/etc/letsencrypt" -v "$root/tls/work:/var/lib/letsencrypt" \ -v "$root/tls/logs:/var/log/letsencrypt" -v /var/lib/baiyue-logistics-chat-acme:/webroot \ "$CHAT_CERTBOT_IMAGE" certonly --non-interactive --webroot -w /webroot \ --cert-name "$CHAT_DOMAIN" -d "$CHAT_DOMAIN" --agree-tos --register-unsafely-without-email fi openssl x509 -in "$CHAT_TLS_CERT" -checkhost "$CHAT_DOMAIN" -noout >/dev/null install -m 700 "$release/renew-tls.sh" "$root/tls/renew.sh" unit=/etc/systemd/system/baiyue-logistics-chat-tls-renew.service timer=/etc/systemd/system/baiyue-logistics-chat-tls-renew.timer for file in "$unit" "$timer"; do if [[ -e "$file" ]]; then head -n 1 "$file" | grep -Fq 'Managed for baiyue-logistics-chat-gray' || exit 2; fi done cat > "$unit" < "$timer" <