#!/usr/bin/env bash set -euo pipefail CONFIG_FILE=${JC_WEB_IM_UPDATE_CONFIG:-/etc/jc-web-im-update.conf} STATE_DIR=/var/lib/jc-web-im-update LOCK_FILE=/run/lock/jc-web-im-update.lock if [[ ! -r "$CONFIG_FILE" ]]; then echo "Missing configuration: $CONFIG_FILE" >&2 exit 1 fi # shellcheck source=/dev/null source "$CONFIG_FILE" : "${REPO_DIR:?REPO_DIR is required}" : "${WEB_ROOT:?WEB_ROOT is required}" : "${BRANCH:=main}" case "$REPO_DIR" in /opt/jc-web-im-release|/opt/jc-web-im-release-*) ;; *) echo "Unsafe REPO_DIR: $REPO_DIR" >&2; exit 1 ;; esac case "$WEB_ROOT" in /var/www/jc-web-im|/var/www/jc-web-im-*) ;; *) echo "Unsafe WEB_ROOT: $WEB_ROOT" >&2; exit 1 ;; esac mkdir -p "$STATE_DIR" exec 9>"$LOCK_FILE" flock -n 9 || { echo "Another update is already running" exit 0 } git -C "$REPO_DIR" fetch --quiet origin "$BRANCH" TARGET_COMMIT=$(git -C "$REPO_DIR" rev-parse "origin/$BRANCH") CURRENT_COMMIT=$(cat "$STATE_DIR/last_deployed" 2>/dev/null || true) if [[ "$TARGET_COMMIT" == "$CURRENT_COMMIT" ]]; then echo "Already current: $TARGET_COMMIT" exit 0 fi git -C "$REPO_DIR" reset --hard --quiet "$TARGET_COMMIT" DIST_DIR="$REPO_DIR/dist" [[ -f "$DIST_DIR/index.html" ]] || { echo "Missing dist/index.html at $TARGET_COMMIT" >&2 exit 1 } while IFS= read -r asset; do [[ -f "$DIST_DIR/$asset" ]] || { echo "Missing referenced asset: $asset" >&2 exit 1 } done < <(grep -oE '(css|js)/[^"'"'"' ]+' "$DIST_DIR/index.html" | sort -u) find "$DIST_DIR/api" -type f -name '*.php' -print0 | xargs -0 -r -n1 php -l >/dev/null BACKUP_DIR="/var/backups/jc-web-im/$(date +%Y%m%d-%H%M%S)" mkdir -p "$BACKUP_DIR" [[ -f "$WEB_ROOT/index.html" ]] && cp -a "$WEB_ROOT/index.html" "$BACKUP_DIR/" [[ -f "$WEB_ROOT/config/runtime-config.js" ]] && { mkdir -p "$BACKUP_DIR/config" cp -a "$WEB_ROOT/config/runtime-config.js" "$BACKUP_DIR/config/" } mkdir -p "$WEB_ROOT" rsync -a --exclude='/config/runtime-config.js' "$DIST_DIR/" "$WEB_ROOT/" chown -R www-data:www-data "$WEB_ROOT" printf '%s\n' "$TARGET_COMMIT" >"$STATE_DIR/last_deployed" echo "Deployed: $TARGET_COMMIT -> $WEB_ROOT"