From f882814a50d58db11f8c637ff88cf4380ce71dc1 Mon Sep 17 00:00:00 2001 From: bytestream Date: Tue, 23 Sep 2025 16:05:17 +0100 Subject: [PATCH 01/17] create meilisearch dump prior to upgrade --- templates/docker-monolithic/upgrade.sh | 132 ++++++++++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 403cd19..edb10c4 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -37,6 +37,8 @@ while [[ "$#" -gt 0 ]]; do shift done +COMPOSE_FILE_DOWNLOAD_URL="https://raw.githubusercontent.com/supportpal/helpdesk-install/"${ref}"/templates/docker-monolithic/docker-compose.yml" + # usage: version_ge version_ge() { if ! [ "$(printf '%s\n' "$2" "$1" | sort -V | head -n1)" = "$2" ]; then @@ -81,7 +83,7 @@ backup() { } update_compose_files() { - curl -fLsS https://raw.githubusercontent.com/supportpal/helpdesk-install/"${ref}"/templates/docker-monolithic/docker-compose.yml -o docker-compose.yml + curl -fLsS "${COMPOSE_FILE_DOWNLOAD_URL}" -o docker-compose.yml } update_volumes() { @@ -107,7 +109,135 @@ update_env() { fi } +create_meilisearch_dump_pre_upgrade() { + local MASTER_KEY BASE_URL + MASTER_KEY="$(docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && echo $MEILI_MASTER_KEY')" + BASE_URL="$(docker compose exec supportpal bash -c 'echo $SUPPORTPAL_MEILISEARCH_HOST')" + + echo "Creating Meilisearch data dump with current version before upgrade..." + + # Check if Meilisearch is running + while true; do + if docker compose exec -T supportpal curl -fsS "$BASE_URL/health" -H "Authorization: Bearer $MASTER_KEY" >/dev/null; then + echo "Meilisearch is ready" + break + fi + + echo "Waiting for Meilisearch to be ready..." + sleep 2 + done + + # Create dump + dump_response=$(docker compose exec -T supportpal curl -fsS -X POST "$BASE_URL/dumps" -H "Content-Type: application/json" -H "Authorization: Bearer $MASTER_KEY") + task_uid=$(echo "$dump_response" | grep -o "\"taskUid\":[0-9]*" | cut -d: -f2) + + if [ -z "$task_uid" ]; then + echo "Failed to initiate dump creation:" + echo "$dump_response" + exit 1 + fi + + echo "Dump task created with UID: $task_uid" + + # Wait for dump to complete + while true; do + task_status=$(docker compose exec -T supportpal curl -fsS "$BASE_URL/tasks/$task_uid" -H "Authorization: Bearer $MASTER_KEY" | grep -o "\"status\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\"") + + case "$task_status" in + succeeded) + echo "Pre-upgrade dump created successfully" + + # Create a marker file to indicate pre-upgrade dump was created + docker compose exec -T -u meilisearch supportpal touch "/meilisearch/.pre_upgrade_dump_created" + exit 0 + ;; + failed) + echo "Pre-upgrade dump creation failed" + exit 1 + ;; + *) + echo "Dump in progress..." + sleep 5 + ;; + esac + done +} + +# Usage: get_meilisearch_version +get_meilisearch_version() { + local CID="$1" + local version_json="" start_ts=$(date +%s) + + # Poll the version endpoint inside the container until it succeeds or times out. + while true; do + if ! docker ps -q --no-trunc | grep -q "$CID"; then + echo "Container exited before Meilisearch became ready." >&2 + exit 1 + fi + + if version_json="$(docker exec "$CID" bash -lc 'source <(sudo cat /etc/container_environment.sh); curl -fsS -X GET "$SUPPORTPAL_MEILISEARCH_HOST/version" -H "Authorization: Bearer $MEILI_MASTER_KEY"')"; then + break + fi + + now=$(date +%s) + if (( now - start_ts >= TIMEOUT )); then + echo "Timed out waiting for Meilisearch to become ready." >&2 + exit 1 + fi + + sleep "$RETRY_DELAY" + done + + # Extract pkgVersion from the JSON + pkgVersion="$(echo "$version_json" | grep -oP '"pkgVersion"\s*:\s*"\K[^"]+')" + if [ -z "${pkgVersion:-}" ]; then + echo "Failed to parse pkgVersion from response: $version_json" >&2 + exit 1 + fi + + echo "$pkgVersion" +} + +get_next_meilisearch_version() { + IMAGE=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" \ + | grep -m1 -E '^[[:space:]]*image:' \ + | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//") + + TIMEOUT="${TIMEOUT:-180}" # seconds to wait for Meilisearch + RETRY_DELAY="${RETRY_DELAY:-3}" # seconds between retries + + # Start the container detached; --rm ensures removal after it exits. + CID="$(docker run -d --rm "$IMAGE")" + + cleanup() { + # Stop the container; with --rm it will be removed automatically. + docker stop -t 5 "$CID" >/dev/null 2>&1 || true + } + trap cleanup EXIT INT TERM + + echo "$(get_meilisearch_version "$CID")" +} + +# Check if a version requires data dumping for upgrade +meili_requires_dump_upgrade() { + local MEILISEARCH_DUMPLESS_VERSION="1.12.0" + local from_version="$1" + local to_version="$2" + + # If upgrading from < 1.12.0 to any version, dump is required + if [ "$(printf '%s\n' "$from_version" "$MEILISEARCH_DUMPLESS_VERSION" | sort -V | head -n1)" = "$from_version" ] && [ "$from_version" != "$MEILISEARCH_DUMPLESS_VERSION" ]; then + return 0 # true - dump required + fi + + return 1 # false - no dump required +} + upgrade() { + current_meili_version="$(get_meilisearch_version $(docker compose ps -q supportpal))" + if requires_dump_upgrade "$current_meili_version" "$(get_next_meilisearch_version)"; then + create_meilisearch_dump_pre_upgrade + fi + backup docker compose down -v update_volumes From 173c69aa9d8d49d96f774bd122e722539f8d528a Mon Sep 17 00:00:00 2001 From: bytestream Date: Tue, 23 Sep 2025 16:12:25 +0100 Subject: [PATCH 02/17] improve debug --- templates/docker-monolithic/upgrade.sh | 359 +++++++++++++++++++++---- 1 file changed, 309 insertions(+), 50 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index edb10c4..0e27517 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -110,112 +110,277 @@ update_env() { } create_meilisearch_dump_pre_upgrade() { - local MASTER_KEY BASE_URL - MASTER_KEY="$(docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && echo $MEILI_MASTER_KEY')" - BASE_URL="$(docker compose exec supportpal bash -c 'echo $SUPPORTPAL_MEILISEARCH_HOST')" + local MASTER_KEY BASE_URL dump_response task_uid task_status + local health_check_timeout=60 dump_timeout=300 retry_count=0 max_retries=30 echo "Creating Meilisearch data dump with current version before upgrade..." - # Check if Meilisearch is running + # Get Meilisearch configuration with error handling + echo "Retrieving Meilisearch configuration..." + if ! MASTER_KEY="$(docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && echo $MEILI_MASTER_KEY' 2>/dev/null)"; then + echo "ERROR: Failed to retrieve Meilisearch master key from container" >&2 + echo "DEBUG: Ensure the supportpal container is running and environment variables are properly set" >&2 + exit 1 + fi + + if ! BASE_URL="$(docker compose exec supportpal bash -c 'echo $SUPPORTPAL_MEILISEARCH_HOST' 2>/dev/null)"; then + echo "ERROR: Failed to retrieve Meilisearch host URL from container" >&2 + echo "DEBUG: Ensure the supportpal container is running and SUPPORTPAL_MEILISEARCH_HOST is set" >&2 + exit 1 + fi + + echo "DEBUG: Using Meilisearch URL: $BASE_URL" + + # Check if Meilisearch is running with timeout + echo "Checking Meilisearch health status..." + local start_time=$(date +%s) while true; do - if docker compose exec -T supportpal curl -fsS "$BASE_URL/health" -H "Authorization: Bearer $MASTER_KEY" >/dev/null; then - echo "Meilisearch is ready" + local current_time=$(date +%s) + local elapsed=$((current_time - start_time)) + + if (( elapsed >= health_check_timeout )); then + echo "ERROR: Timeout waiting for Meilisearch to become healthy (${health_check_timeout}s)" >&2 + echo "DEBUG: Check Meilisearch container logs: docker compose logs supportpal" >&2 + exit 1 + fi + + if docker compose exec -T supportpal curl -fsS "$BASE_URL/health" -H "Authorization: Bearer $MASTER_KEY" >/dev/null 2>&1; then + echo "✓ Meilisearch is ready and healthy" break fi - echo "Waiting for Meilisearch to be ready..." + echo "Waiting for Meilisearch to be ready... (${elapsed}/${health_check_timeout}s)" sleep 2 done - # Create dump - dump_response=$(docker compose exec -T supportpal curl -fsS -X POST "$BASE_URL/dumps" -H "Content-Type: application/json" -H "Authorization: Bearer $MASTER_KEY") + # Create dump with detailed error handling + echo "Initiating Meilisearch dump creation..." + if ! dump_response=$(docker compose exec -T supportpal curl -fsS -X POST "$BASE_URL/dumps" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $MASTER_KEY" 2>&1); then + echo "ERROR: Failed to initiate dump creation" >&2 + echo "DEBUG: cURL response: $dump_response" >&2 + echo "DEBUG: Check Meilisearch logs: docker compose exec supportpal tail -n 50 /var/log/meilisearch.log" >&2 + exit 1 + fi + + echo "DEBUG: Dump API response: $dump_response" + task_uid=$(echo "$dump_response" | grep -o "\"taskUid\":[0-9]*" | cut -d: -f2) if [ -z "$task_uid" ]; then - echo "Failed to initiate dump creation:" - echo "$dump_response" + echo "ERROR: Failed to extract task UID from dump creation response" >&2 + echo "DEBUG: Response was: $dump_response" >&2 + echo "DEBUG: Expected format: {\"taskUid\":123,...}" >&2 exit 1 fi - echo "Dump task created with UID: $task_uid" + echo "✓ Dump task created with UID: $task_uid" - # Wait for dump to complete + # Wait for dump to complete with enhanced status reporting + echo "Monitoring dump progress..." + start_time=$(date +%s) while true; do - task_status=$(docker compose exec -T supportpal curl -fsS "$BASE_URL/tasks/$task_uid" -H "Authorization: Bearer $MASTER_KEY" | grep -o "\"status\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\"") + local current_time=$(date +%s) + local elapsed=$((current_time - start_time)) + + if (( elapsed >= dump_timeout )); then + echo "ERROR: Timeout waiting for dump to complete (${dump_timeout}s)" >&2 + echo "DEBUG: Check task status manually: curl -H 'Authorization: Bearer \$MASTER_KEY' $BASE_URL/tasks/$task_uid" >&2 + exit 1 + fi + + if ! task_status=$(docker compose exec -T supportpal curl -fsS "$BASE_URL/tasks/$task_uid" \ + -H "Authorization: Bearer $MASTER_KEY" 2>&1); then + echo "WARNING: Failed to check task status (attempt $((++retry_count))/$max_retries)" >&2 + echo "DEBUG: Response: $task_status" >&2 + + if (( retry_count >= max_retries )); then + echo "ERROR: Max retries exceeded checking dump status" >&2 + exit 1 + fi + + sleep 5 + continue + fi + + # Reset retry count on successful API call + retry_count=0 + + # Extract status with better error handling + if ! task_status=$(echo "$task_status" | grep -o "\"status\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\""); then + echo "WARNING: Failed to parse task status from response" >&2 + echo "DEBUG: Raw response: $task_status" >&2 + sleep 5 + continue + fi case "$task_status" in succeeded) - echo "Pre-upgrade dump created successfully" + echo "✓ Pre-upgrade dump created successfully in ${elapsed}s" # Create a marker file to indicate pre-upgrade dump was created - docker compose exec -T -u meilisearch supportpal touch "/meilisearch/.pre_upgrade_dump_created" - exit 0 + if ! docker compose exec -T -u meilisearch supportpal touch "/meilisearch/.pre_upgrade_dump_created" 2>/dev/null; then + echo "WARNING: Failed to create dump marker file (non-critical)" >&2 + fi + return 0 ;; failed) - echo "Pre-upgrade dump creation failed" + echo "ERROR: Pre-upgrade dump creation failed" >&2 + + # Try to get error details + local error_details + if error_details=$(echo "$task_status" | grep -o "\"error\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\""); then + echo "DEBUG: Error details: $error_details" >&2 + fi + + echo "DEBUG: Check Meilisearch logs for more details: docker compose exec supportpal tail -n 100 /var/log/meilisearch.log" >&2 exit 1 ;; + enqueued|processing) + echo "Dump in progress... (${elapsed}s elapsed, status: $task_status)" + ;; *) - echo "Dump in progress..." - sleep 5 + echo "Dump status: $task_status (${elapsed}s elapsed)" ;; esac + + sleep 5 done } # Usage: get_meilisearch_version get_meilisearch_version() { local CID="$1" - local version_json="" start_ts=$(date +%s) + local version_json="" start_ts=$(date +%s) retry_count=0 max_retries=10 + local timeout="${TIMEOUT:-180}" + local retry_delay="${RETRY_DELAY:-3}" + + echo "DEBUG: Getting Meilisearch version from container: $CID" >&2 + echo "DEBUG: Timeout: ${timeout}s, Retry delay: ${retry_delay}s" >&2 # Poll the version endpoint inside the container until it succeeds or times out. while true; do + local now=$(date +%s) + local elapsed=$((now - start_ts)) + + # Check if container is still running if ! docker ps -q --no-trunc | grep -q "$CID"; then - echo "Container exited before Meilisearch became ready." >&2 + echo "ERROR: Container $CID exited before Meilisearch became ready (after ${elapsed}s)" >&2 + echo "DEBUG: Check container logs: docker logs $CID" >&2 exit 1 fi - if version_json="$(docker exec "$CID" bash -lc 'source <(sudo cat /etc/container_environment.sh); curl -fsS -X GET "$SUPPORTPAL_MEILISEARCH_HOST/version" -H "Authorization: Bearer $MEILI_MASTER_KEY"')"; then + # Try to get version with detailed error handling + echo "DEBUG: Attempting to get Meilisearch version (attempt $((retry_count + 1)), ${elapsed}s elapsed)" >&2 + + if version_json="$(docker exec "$CID" bash -lc 'source <(sudo cat /etc/container_environment.sh) 2>/dev/null; curl -fsS -X GET "$SUPPORTPAL_MEILISEARCH_HOST/version" -H "Authorization: Bearer $MEILI_MASTER_KEY"' 2>&1)"; then + echo "DEBUG: Successfully retrieved version response" >&2 break + else + retry_count=$((retry_count + 1)) + echo "DEBUG: Failed to get version (attempt $retry_count/$max_retries)" >&2 + echo "DEBUG: Response: $version_json" >&2 + + if (( retry_count >= max_retries )); then + echo "ERROR: Max retries ($max_retries) exceeded while trying to get Meilisearch version" >&2 + echo "DEBUG: Container logs:" >&2 + docker logs --tail 20 "$CID" >&2 || true + exit 1 + fi fi - now=$(date +%s) - if (( now - start_ts >= TIMEOUT )); then - echo "Timed out waiting for Meilisearch to become ready." >&2 + if (( elapsed >= timeout )); then + echo "ERROR: Timed out waiting for Meilisearch to become ready (${timeout}s)" >&2 + echo "DEBUG: Container is running but Meilisearch API is not responding" >&2 + echo "DEBUG: Container logs:" >&2 + docker logs --tail 30 "$CID" >&2 || true exit 1 fi - sleep "$RETRY_DELAY" + echo "DEBUG: Waiting ${retry_delay}s before next attempt..." >&2 + sleep "$retry_delay" done - # Extract pkgVersion from the JSON - pkgVersion="$(echo "$version_json" | grep -oP '"pkgVersion"\s*:\s*"\K[^"]+')" - if [ -z "${pkgVersion:-}" ]; then - echo "Failed to parse pkgVersion from response: $version_json" >&2 - exit 1 + echo "DEBUG: Raw version response: $version_json" >&2 + + # Extract pkgVersion from the JSON with better error handling + local pkgVersion + if ! pkgVersion="$(echo "$version_json" | grep -oP '"pkgVersion"\s*:\s*"\K[^"]+')" || [ -z "${pkgVersion:-}" ]; then + echo "ERROR: Failed to parse pkgVersion from Meilisearch version response" >&2 + echo "DEBUG: Expected JSON format: {\"pkgVersion\":\"1.x.x\",...}" >&2 + echo "DEBUG: Actual response: $version_json" >&2 + + # Try alternative parsing methods + local alt_version + if alt_version="$(echo "$version_json" | sed -n 's/.*"pkgVersion"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"; then + if [ -n "$alt_version" ]; then + echo "DEBUG: Alternative parsing succeeded: $alt_version" >&2 + pkgVersion="$alt_version" + else + exit 1 + fi + else + exit 1 + fi fi + echo "DEBUG: Extracted Meilisearch version: $pkgVersion" >&2 echo "$pkgVersion" } get_next_meilisearch_version() { - IMAGE=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" \ - | grep -m1 -E '^[[:space:]]*image:' \ - | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//") + echo "DEBUG: Fetching next Meilisearch version from docker-compose file..." >&2 + echo "DEBUG: Download URL: $COMPOSE_FILE_DOWNLOAD_URL" >&2 + + local IMAGE + if ! IMAGE=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" 2>&1 | grep -m1 -E '^[[:space:]]*image:' | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//"); then + echo "ERROR: Failed to fetch or parse docker-compose file" >&2 + echo "DEBUG: URL: $COMPOSE_FILE_DOWNLOAD_URL" >&2 + echo "DEBUG: Check if the URL is accessible and contains valid YAML" >&2 + exit 1 + fi - TIMEOUT="${TIMEOUT:-180}" # seconds to wait for Meilisearch - RETRY_DELAY="${RETRY_DELAY:-3}" # seconds between retries + if [ -z "$IMAGE" ]; then + echo "ERROR: Could not extract image name from docker-compose file" >&2 + echo "DEBUG: Expected to find a line like 'image: supportpal/helpdesk:latest'" >&2 + exit 1 + fi + + echo "DEBUG: Found image: $IMAGE" >&2 + + local TIMEOUT="${TIMEOUT:-180}" # seconds to wait for Meilisearch + local RETRY_DELAY="${RETRY_DELAY:-3}" # seconds between retries + + echo "DEBUG: Starting temporary container to get Meilisearch version..." >&2 # Start the container detached; --rm ensures removal after it exits. - CID="$(docker run -d --rm "$IMAGE")" + local CID + if ! CID="$(docker run -d --rm "$IMAGE" 2>&1)"; then + echo "ERROR: Failed to start container with image: $IMAGE" >&2 + echo "DEBUG: Docker run output: $CID" >&2 + echo "DEBUG: Check if the image exists and is accessible" >&2 + exit 1 + fi + + echo "DEBUG: Started temporary container: $CID" >&2 cleanup() { - # Stop the container; with --rm it will be removed automatically. - docker stop -t 5 "$CID" >/dev/null 2>&1 || true + echo "DEBUG: Cleaning up temporary container: $CID" >&2 + # Stop the container; with --rm it will be removed automatically. + docker stop -t 5 "$CID" >/dev/null 2>&1 || true } trap cleanup EXIT INT TERM - echo "$(get_meilisearch_version "$CID")" + local version + if ! version="$(get_meilisearch_version "$CID")"; then + echo "ERROR: Failed to get Meilisearch version from temporary container" >&2 + cleanup + exit 1 + fi + + echo "DEBUG: Successfully retrieved next Meilisearch version: $version" >&2 + echo "$version" } # Check if a version requires data dumping for upgrade @@ -224,33 +389,127 @@ meili_requires_dump_upgrade() { local from_version="$1" local to_version="$2" + echo "DEBUG: Checking if Meilisearch dump is required for upgrade" >&2 + echo "DEBUG: Current version: $from_version" >&2 + echo "DEBUG: Target version: $to_version" >&2 + echo "DEBUG: Dumpless version threshold: $MEILISEARCH_DUMPLESS_VERSION" >&2 + + # Validate input versions + if [ -z "$from_version" ] || [ -z "$to_version" ]; then + echo "ERROR: Both from_version and to_version must be provided" >&2 + echo "DEBUG: from_version='$from_version', to_version='$to_version'" >&2 + exit 1 + fi + + # Check version format (basic validation) + if ! echo "$from_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then + echo "WARNING: from_version '$from_version' doesn't match expected format (x.y.z)" >&2 + fi + + if ! echo "$to_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then + echo "WARNING: to_version '$to_version' doesn't match expected format (x.y.z)" >&2 + fi + # If upgrading from < 1.12.0 to any version, dump is required - if [ "$(printf '%s\n' "$from_version" "$MEILISEARCH_DUMPLESS_VERSION" | sort -V | head -n1)" = "$from_version" ] && [ "$from_version" != "$MEILISEARCH_DUMPLESS_VERSION" ]; then + local comparison_result + comparison_result="$(printf '%s\n' "$from_version" "$MEILISEARCH_DUMPLESS_VERSION" | sort -V | head -n1)" + + if [ "$comparison_result" = "$from_version" ] && [ "$from_version" != "$MEILISEARCH_DUMPLESS_VERSION" ]; then + echo "DEBUG: Dump required - upgrading from pre-$MEILISEARCH_DUMPLESS_VERSION version" >&2 return 0 # true - dump required + else + echo "DEBUG: No dump required - version $from_version >= $MEILISEARCH_DUMPLESS_VERSION" >&2 + return 1 # false - no dump required fi - - return 1 # false - no dump required } upgrade() { - current_meili_version="$(get_meilisearch_version $(docker compose ps -q supportpal))" - if requires_dump_upgrade "$current_meili_version" "$(get_next_meilisearch_version)"; then + echo "Starting upgrade process..." + + # Get current Meilisearch version with error handling + echo "Checking current Meilisearch version..." + local current_container_id + if ! current_container_id=$(docker compose ps -q supportpal 2>/dev/null); then + echo "ERROR: Failed to get supportpal container ID" >&2 + echo "DEBUG: Ensure docker compose is running and supportpal service exists" >&2 + exit 1 + fi + + if [ -z "$current_container_id" ]; then + echo "ERROR: supportpal container is not running" >&2 + echo "DEBUG: Start the containers with: docker compose up -d" >&2 + exit 1 + fi + + echo "DEBUG: Found supportpal container: $current_container_id" >&2 + + local current_meili_version + if ! current_meili_version="$(get_meilisearch_version "$current_container_id")"; then + echo "ERROR: Failed to get current Meilisearch version" >&2 + echo "DEBUG: Check if Meilisearch is properly configured in the supportpal container" >&2 + exit 1 + fi + + echo "✓ Current Meilisearch version: $current_meili_version" + + # Get next Meilisearch version with error handling + echo "Checking target Meilisearch version..." + local next_meili_version + if ! next_meili_version="$(get_next_meilisearch_version)"; then + echo "ERROR: Failed to get target Meilisearch version" >&2 + echo "DEBUG: Check network connectivity and docker image availability" >&2 + exit 1 + fi + + echo "✓ Target Meilisearch version: $next_meili_version" + + # Check if dump is required + if meili_requires_dump_upgrade "$current_meili_version" "$next_meili_version"; then + echo "✓ Meilisearch dump is required for this upgrade" create_meilisearch_dump_pre_upgrade + else + echo "✓ No Meilisearch dump required for this upgrade" fi backup - docker compose down -v + + echo "Stopping containers..." + if ! docker compose down -v; then + echo "ERROR: Failed to stop containers" >&2 + echo "DEBUG: Check docker compose status and try manually: docker compose down -v" >&2 + exit 1 + fi + + echo "Updating volumes..." update_volumes + + echo "Updating environment configuration..." update_env + + echo "Updating docker-compose files..." update_compose_files + if [ "${only_files}" = true ]; then + echo "✓ Files updated successfully (--only-files specified)" exit 0 fi - COMPOSE_PARALLEL_LIMIT=1 docker compose up -d - docker compose exec supportpal bash -c "bash /init/upgrade-helpdesk.sh" + echo "Starting upgraded containers..." + if ! COMPOSE_PARALLEL_LIMIT=1 docker compose up -d; then + echo "ERROR: Failed to start upgraded containers" >&2 + echo "DEBUG: Check docker compose logs: docker compose logs" >&2 + exit 1 + fi + + echo "Running helpdesk upgrade script..." + if ! docker compose exec supportpal bash -c "bash /init/upgrade-helpdesk.sh"; then + echo "ERROR: Helpdesk upgrade script failed" >&2 + echo "DEBUG: Check container logs: docker compose logs supportpal" >&2 + exit 1 + fi + echo - echo "Upgrade complete!" + echo "✓ Upgrade complete!" } check_docker_compose From 4c527c470ad153a096324e7df88ffebe8a0b717e Mon Sep 17 00:00:00 2001 From: bytestream Date: Tue, 23 Sep 2025 16:14:15 +0100 Subject: [PATCH 03/17] don't require meili dump if versions are equal --- templates/docker-monolithic/upgrade.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 0e27517..d9b49d3 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -401,6 +401,12 @@ meili_requires_dump_upgrade() { exit 1 fi + # Check if versions are equal - no dump needed if not upgrading + if [ "$from_version" = "$to_version" ]; then + echo "DEBUG: No dump required - versions are identical (no upgrade needed)" >&2 + return 1 # false - no dump required + fi + # Check version format (basic validation) if ! echo "$from_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then echo "WARNING: from_version '$from_version' doesn't match expected format (x.y.z)" >&2 From 925f2efcf045a4cf5aacb4f1554ac1ee64abf68e Mon Sep 17 00:00:00 2001 From: bytestream Date: Wed, 24 Sep 2025 10:54:25 +0100 Subject: [PATCH 04/17] fix shell check errors --- templates/docker-monolithic/upgrade.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index d9b49d3..a8eb109 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -37,7 +37,7 @@ while [[ "$#" -gt 0 ]]; do shift done -COMPOSE_FILE_DOWNLOAD_URL="https://raw.githubusercontent.com/supportpal/helpdesk-install/"${ref}"/templates/docker-monolithic/docker-compose.yml" +COMPOSE_FILE_DOWNLOAD_URL="https://raw.githubusercontent.com/supportpal/helpdesk-install/${ref}/templates/docker-monolithic/docker-compose.yml" # usage: version_ge version_ge() { @@ -133,10 +133,11 @@ create_meilisearch_dump_pre_upgrade() { # Check if Meilisearch is running with timeout echo "Checking Meilisearch health status..." - local start_time=$(date +%s) + local start_time current_time elapsed + start_time=$(date +%s) while true; do - local current_time=$(date +%s) - local elapsed=$((current_time - start_time)) + current_time=$(date +%s) + elapsed=$((current_time - start_time)) if (( elapsed >= health_check_timeout )); then echo "ERROR: Timeout waiting for Meilisearch to become healthy (${health_check_timeout}s)" >&2 @@ -181,8 +182,8 @@ create_meilisearch_dump_pre_upgrade() { echo "Monitoring dump progress..." start_time=$(date +%s) while true; do - local current_time=$(date +%s) - local elapsed=$((current_time - start_time)) + current_time=$(date +%s) + elapsed=$((current_time - start_time)) if (( elapsed >= dump_timeout )); then echo "ERROR: Timeout waiting for dump to complete (${dump_timeout}s)" >&2 @@ -252,17 +253,18 @@ create_meilisearch_dump_pre_upgrade() { # Usage: get_meilisearch_version get_meilisearch_version() { local CID="$1" - local version_json="" start_ts=$(date +%s) retry_count=0 max_retries=10 + local version_json="" start_ts retry_count=0 max_retries=10 now elapsed local timeout="${TIMEOUT:-180}" local retry_delay="${RETRY_DELAY:-3}" + start_ts=$(date +%s) echo "DEBUG: Getting Meilisearch version from container: $CID" >&2 echo "DEBUG: Timeout: ${timeout}s, Retry delay: ${retry_delay}s" >&2 # Poll the version endpoint inside the container until it succeeds or times out. while true; do - local now=$(date +%s) - local elapsed=$((now - start_ts)) + now=$(date +%s) + elapsed=$((now - start_ts)) # Check if container is still running if ! docker ps -q --no-trunc | grep -q "$CID"; then From 424988a4a5b9f79b7875efab1a16936c956133c4 Mon Sep 17 00:00:00 2001 From: bytestream Date: Fri, 26 Sep 2025 16:39:28 +0100 Subject: [PATCH 05/17] wait 60s for container to initialise before trying to get version --- templates/docker-monolithic/upgrade.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index a8eb109..0ef810c 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -374,6 +374,10 @@ get_next_meilisearch_version() { } trap cleanup EXIT INT TERM + # Give the container time to initialize before starting health checks + echo "DEBUG: Waiting 60s for container initialization..." >&2 + sleep 60 + local version if ! version="$(get_meilisearch_version "$CID")"; then echo "ERROR: Failed to get Meilisearch version from temporary container" >&2 From 805f21b4cc3d75c5c6ffbe3cb19702863d22039d Mon Sep 17 00:00:00 2001 From: bytestream Date: Sun, 28 Sep 2025 14:58:39 +0100 Subject: [PATCH 06/17] streamline meilisearch version retrieval and remove unnecessary pre-upgrade dump marker --- templates/docker-monolithic/upgrade.sh | 144 +++++++------------------ 1 file changed, 36 insertions(+), 108 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 0ef810c..02ea99e 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -219,11 +219,6 @@ create_meilisearch_dump_pre_upgrade() { case "$task_status" in succeeded) echo "✓ Pre-upgrade dump created successfully in ${elapsed}s" - - # Create a marker file to indicate pre-upgrade dump was created - if ! docker compose exec -T -u meilisearch supportpal touch "/meilisearch/.pre_upgrade_dump_created" 2>/dev/null; then - echo "WARNING: Failed to create dump marker file (non-critical)" >&2 - fi return 0 ;; failed) @@ -250,85 +245,42 @@ create_meilisearch_dump_pre_upgrade() { done } -# Usage: get_meilisearch_version -get_meilisearch_version() { - local CID="$1" - local version_json="" start_ts retry_count=0 max_retries=10 now elapsed - local timeout="${TIMEOUT:-180}" - local retry_delay="${RETRY_DELAY:-3}" - start_ts=$(date +%s) - - echo "DEBUG: Getting Meilisearch version from container: $CID" >&2 - echo "DEBUG: Timeout: ${timeout}s, Retry delay: ${retry_delay}s" >&2 - - # Poll the version endpoint inside the container until it succeeds or times out. - while true; do - now=$(date +%s) - elapsed=$((now - start_ts)) - - # Check if container is still running - if ! docker ps -q --no-trunc | grep -q "$CID"; then - echo "ERROR: Container $CID exited before Meilisearch became ready (after ${elapsed}s)" >&2 - echo "DEBUG: Check container logs: docker logs $CID" >&2 - exit 1 - fi - - # Try to get version with detailed error handling - echo "DEBUG: Attempting to get Meilisearch version (attempt $((retry_count + 1)), ${elapsed}s elapsed)" >&2 +# Helper function to parse version from meilisearch --version output +parse_meilisearch_version() { + local version_output="$1" + local pkgVersion - if version_json="$(docker exec "$CID" bash -lc 'source <(sudo cat /etc/container_environment.sh) 2>/dev/null; curl -fsS -X GET "$SUPPORTPAL_MEILISEARCH_HOST/version" -H "Authorization: Bearer $MEILI_MASTER_KEY"' 2>&1)"; then - echo "DEBUG: Successfully retrieved version response" >&2 - break - else - retry_count=$((retry_count + 1)) - echo "DEBUG: Failed to get version (attempt $retry_count/$max_retries)" >&2 - echo "DEBUG: Response: $version_json" >&2 + echo "DEBUG: Raw version output: $version_output" >&2 - if (( retry_count >= max_retries )); then - echo "ERROR: Max retries ($max_retries) exceeded while trying to get Meilisearch version" >&2 - echo "DEBUG: Container logs:" >&2 - docker logs --tail 20 "$CID" >&2 || true - exit 1 - fi - fi + # Extract version number from output like "meilisearch 1.10.3" + if ! pkgVersion="$(echo "$version_output" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')"; then + echo "ERROR: Failed to parse version from meilisearch --version output" >&2 + echo "DEBUG: Expected format: 'meilisearch x.y.z'" >&2 + echo "DEBUG: Actual output: $version_output" >&2 + exit 1 + fi - if (( elapsed >= timeout )); then - echo "ERROR: Timed out waiting for Meilisearch to become ready (${timeout}s)" >&2 - echo "DEBUG: Container is running but Meilisearch API is not responding" >&2 - echo "DEBUG: Container logs:" >&2 - docker logs --tail 30 "$CID" >&2 || true - exit 1 - fi + echo "DEBUG: Extracted Meilisearch version: $pkgVersion" >&2 + echo "$pkgVersion" +} - echo "DEBUG: Waiting ${retry_delay}s before next attempt..." >&2 - sleep "$retry_delay" - done +# Usage: get_current_meilisearch_version +get_current_meilisearch_version() { + local CID="$1" + local version - echo "DEBUG: Raw version response: $version_json" >&2 + echo "DEBUG: Getting Meilisearch version from container: $CID" >&2 - # Extract pkgVersion from the JSON with better error handling - local pkgVersion - if ! pkgVersion="$(echo "$version_json" | grep -oP '"pkgVersion"\s*:\s*"\K[^"]+')" || [ -z "${pkgVersion:-}" ]; then - echo "ERROR: Failed to parse pkgVersion from Meilisearch version response" >&2 - echo "DEBUG: Expected JSON format: {\"pkgVersion\":\"1.x.x\",...}" >&2 - echo "DEBUG: Actual response: $version_json" >&2 - - # Try alternative parsing methods - local alt_version - if alt_version="$(echo "$version_json" | sed -n 's/.*"pkgVersion"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"; then - if [ -n "$alt_version" ]; then - echo "DEBUG: Alternative parsing succeeded: $alt_version" >&2 - pkgVersion="$alt_version" - else - exit 1 - fi - else - exit 1 - fi + # Get version directly using meilisearch --version command + if ! version="$(docker exec "$CID" meilisearch --version 2>&1)"; then + echo "ERROR: Failed to get Meilisearch version from container $CID" >&2 + echo "DEBUG: Make sure the container is running and has meilisearch binary" >&2 + echo "DEBUG: Container logs:" >&2 + docker logs --tail 10 "$CID" >&2 || true + exit 1 fi - echo "DEBUG: Extracted Meilisearch version: $pkgVersion" >&2 - echo "$pkgVersion" + parse_meilisearch_version "$version" } get_next_meilisearch_version() { @@ -351,42 +303,18 @@ get_next_meilisearch_version() { echo "DEBUG: Found image: $IMAGE" >&2 - local TIMEOUT="${TIMEOUT:-180}" # seconds to wait for Meilisearch - local RETRY_DELAY="${RETRY_DELAY:-3}" # seconds between retries - - echo "DEBUG: Starting temporary container to get Meilisearch version..." >&2 - - # Start the container detached; --rm ensures removal after it exits. - local CID - if ! CID="$(docker run -d --rm "$IMAGE" 2>&1)"; then - echo "ERROR: Failed to start container with image: $IMAGE" >&2 - echo "DEBUG: Docker run output: $CID" >&2 - echo "DEBUG: Check if the image exists and is accessible" >&2 - exit 1 - fi - - echo "DEBUG: Started temporary container: $CID" >&2 - - cleanup() { - echo "DEBUG: Cleaning up temporary container: $CID" >&2 - # Stop the container; with --rm it will be removed automatically. - docker stop -t 5 "$CID" >/dev/null 2>&1 || true - } - trap cleanup EXIT INT TERM - - # Give the container time to initialize before starting health checks - echo "DEBUG: Waiting 60s for container initialization..." >&2 - sleep 60 + # Get version directly using meilisearch --version without starting the full container + echo "DEBUG: Getting Meilisearch version from image..." >&2 local version - if ! version="$(get_meilisearch_version "$CID")"; then - echo "ERROR: Failed to get Meilisearch version from temporary container" >&2 - cleanup + if ! version="$(docker run --rm --entrypoint meilisearch "$IMAGE" --version 2>&1)"; then + echo "ERROR: Failed to get Meilisearch version from image: $IMAGE" >&2 + echo "DEBUG: Check if the image exists and contains meilisearch binary" >&2 + echo "DEBUG: Docker run output: $version" >&2 exit 1 fi - echo "DEBUG: Successfully retrieved next Meilisearch version: $version" >&2 - echo "$version" + parse_meilisearch_version "$version" } # Check if a version requires data dumping for upgrade @@ -456,7 +384,7 @@ upgrade() { echo "DEBUG: Found supportpal container: $current_container_id" >&2 local current_meili_version - if ! current_meili_version="$(get_meilisearch_version "$current_container_id")"; then + if ! current_meili_version="$(get_current_meilisearch_version "$current_container_id")"; then echo "ERROR: Failed to get current Meilisearch version" >&2 echo "DEBUG: Check if Meilisearch is properly configured in the supportpal container" >&2 exit 1 From 899f5e162f3296e57f83c65976236255213fc817 Mon Sep 17 00:00:00 2001 From: Kieran Brahney Date: Mon, 15 Dec 2025 12:13:46 +0000 Subject: [PATCH 07/17] drop meilisearch instead of dump and reimport --- templates/docker-monolithic/upgrade.sh | 159 ++++--------------------- 1 file changed, 21 insertions(+), 138 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 02ea99e..91e4021 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -109,140 +109,24 @@ update_env() { fi } -create_meilisearch_dump_pre_upgrade() { - local MASTER_KEY BASE_URL dump_response task_uid task_status - local health_check_timeout=60 dump_timeout=300 retry_count=0 max_retries=30 +drop_meilisearch_data() { + echo "Preparing Meilisearch for upgrade..." - echo "Creating Meilisearch data dump with current version before upgrade..." - - # Get Meilisearch configuration with error handling - echo "Retrieving Meilisearch configuration..." - if ! MASTER_KEY="$(docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && echo $MEILI_MASTER_KEY' 2>/dev/null)"; then - echo "ERROR: Failed to retrieve Meilisearch master key from container" >&2 - echo "DEBUG: Ensure the supportpal container is running and environment variables are properly set" >&2 - exit 1 - fi - - if ! BASE_URL="$(docker compose exec supportpal bash -c 'echo $SUPPORTPAL_MEILISEARCH_HOST' 2>/dev/null)"; then - echo "ERROR: Failed to retrieve Meilisearch host URL from container" >&2 - echo "DEBUG: Ensure the supportpal container is running and SUPPORTPAL_MEILISEARCH_HOST is set" >&2 + # Stop Meilisearch service + echo "Stopping Meilisearch service..." + if ! docker compose exec supportpal sv stop 00meilisearch; then + echo "ERROR: Failed to stop Meilisearch service" >&2 exit 1 fi + echo "✓ Meilisearch service stopped" - echo "DEBUG: Using Meilisearch URL: $BASE_URL" - - # Check if Meilisearch is running with timeout - echo "Checking Meilisearch health status..." - local start_time current_time elapsed - start_time=$(date +%s) - while true; do - current_time=$(date +%s) - elapsed=$((current_time - start_time)) - - if (( elapsed >= health_check_timeout )); then - echo "ERROR: Timeout waiting for Meilisearch to become healthy (${health_check_timeout}s)" >&2 - echo "DEBUG: Check Meilisearch container logs: docker compose logs supportpal" >&2 - exit 1 - fi - - if docker compose exec -T supportpal curl -fsS "$BASE_URL/health" -H "Authorization: Bearer $MASTER_KEY" >/dev/null 2>&1; then - echo "✓ Meilisearch is ready and healthy" - break - fi - - echo "Waiting for Meilisearch to be ready... (${elapsed}/${health_check_timeout}s)" - sleep 2 - done - - # Create dump with detailed error handling - echo "Initiating Meilisearch dump creation..." - if ! dump_response=$(docker compose exec -T supportpal curl -fsS -X POST "$BASE_URL/dumps" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $MASTER_KEY" 2>&1); then - echo "ERROR: Failed to initiate dump creation" >&2 - echo "DEBUG: cURL response: $dump_response" >&2 - echo "DEBUG: Check Meilisearch logs: docker compose exec supportpal tail -n 50 /var/log/meilisearch.log" >&2 + # Clear Meilisearch database directory (including hidden files) + echo "Clearing Meilisearch database directory..." + if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then + echo "ERROR: Failed to clear Meilisearch database directory" >&2 exit 1 fi - - echo "DEBUG: Dump API response: $dump_response" - - task_uid=$(echo "$dump_response" | grep -o "\"taskUid\":[0-9]*" | cut -d: -f2) - - if [ -z "$task_uid" ]; then - echo "ERROR: Failed to extract task UID from dump creation response" >&2 - echo "DEBUG: Response was: $dump_response" >&2 - echo "DEBUG: Expected format: {\"taskUid\":123,...}" >&2 - exit 1 - fi - - echo "✓ Dump task created with UID: $task_uid" - - # Wait for dump to complete with enhanced status reporting - echo "Monitoring dump progress..." - start_time=$(date +%s) - while true; do - current_time=$(date +%s) - elapsed=$((current_time - start_time)) - - if (( elapsed >= dump_timeout )); then - echo "ERROR: Timeout waiting for dump to complete (${dump_timeout}s)" >&2 - echo "DEBUG: Check task status manually: curl -H 'Authorization: Bearer \$MASTER_KEY' $BASE_URL/tasks/$task_uid" >&2 - exit 1 - fi - - if ! task_status=$(docker compose exec -T supportpal curl -fsS "$BASE_URL/tasks/$task_uid" \ - -H "Authorization: Bearer $MASTER_KEY" 2>&1); then - echo "WARNING: Failed to check task status (attempt $((++retry_count))/$max_retries)" >&2 - echo "DEBUG: Response: $task_status" >&2 - - if (( retry_count >= max_retries )); then - echo "ERROR: Max retries exceeded checking dump status" >&2 - exit 1 - fi - - sleep 5 - continue - fi - - # Reset retry count on successful API call - retry_count=0 - - # Extract status with better error handling - if ! task_status=$(echo "$task_status" | grep -o "\"status\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\""); then - echo "WARNING: Failed to parse task status from response" >&2 - echo "DEBUG: Raw response: $task_status" >&2 - sleep 5 - continue - fi - - case "$task_status" in - succeeded) - echo "✓ Pre-upgrade dump created successfully in ${elapsed}s" - return 0 - ;; - failed) - echo "ERROR: Pre-upgrade dump creation failed" >&2 - - # Try to get error details - local error_details - if error_details=$(echo "$task_status" | grep -o "\"error\":\"[^\"]*\"" | cut -d: -f2 | tr -d "\""); then - echo "DEBUG: Error details: $error_details" >&2 - fi - - echo "DEBUG: Check Meilisearch logs for more details: docker compose exec supportpal tail -n 100 /var/log/meilisearch.log" >&2 - exit 1 - ;; - enqueued|processing) - echo "Dump in progress... (${elapsed}s elapsed, status: $task_status)" - ;; - *) - echo "Dump status: $task_status (${elapsed}s elapsed)" - ;; - esac - - sleep 5 - done + echo "✓ Meilisearch database directory cleared" } # Helper function to parse version from meilisearch --version output @@ -318,12 +202,12 @@ get_next_meilisearch_version() { } # Check if a version requires data dumping for upgrade -meili_requires_dump_upgrade() { +meili_requires_upgrade() { local MEILISEARCH_DUMPLESS_VERSION="1.12.0" local from_version="$1" local to_version="$2" - echo "DEBUG: Checking if Meilisearch dump is required for upgrade" >&2 + echo "DEBUG: Checking if Meilisearch requires upgrading" >&2 echo "DEBUG: Current version: $from_version" >&2 echo "DEBUG: Target version: $to_version" >&2 echo "DEBUG: Dumpless version threshold: $MEILISEARCH_DUMPLESS_VERSION" >&2 @@ -355,7 +239,7 @@ meili_requires_dump_upgrade() { comparison_result="$(printf '%s\n' "$from_version" "$MEILISEARCH_DUMPLESS_VERSION" | sort -V | head -n1)" if [ "$comparison_result" = "$from_version" ] && [ "$from_version" != "$MEILISEARCH_DUMPLESS_VERSION" ]; then - echo "DEBUG: Dump required - upgrading from pre-$MEILISEARCH_DUMPLESS_VERSION version" >&2 + echo "DEBUG: Upgrading from pre-$MEILISEARCH_DUMPLESS_VERSION version" >&2 return 0 # true - dump required else echo "DEBUG: No dump required - version $from_version >= $MEILISEARCH_DUMPLESS_VERSION" >&2 @@ -404,15 +288,13 @@ upgrade() { echo "✓ Target Meilisearch version: $next_meili_version" # Check if dump is required - if meili_requires_dump_upgrade "$current_meili_version" "$next_meili_version"; then - echo "✓ Meilisearch dump is required for this upgrade" - create_meilisearch_dump_pre_upgrade - else - echo "✓ No Meilisearch dump required for this upgrade" + if meili_requires_upgrade "$current_meili_version" "$next_meili_version"; then + echo "✓ Meilisearch upgrade is required." + echo "! The Meilisearch database will be dropped and re-indexed... cancel (CTRL+C) if you're not happy to proceed..." + sleep 5 + drop_meilisearch_data fi - backup - echo "Stopping containers..." if ! docker compose down -v; then echo "ERROR: Failed to stop containers" >&2 @@ -453,4 +335,5 @@ upgrade() { } check_docker_compose +backup upgrade From 23189fc5534d7031dabfcd00ed6113565b1bab18 Mon Sep 17 00:00:00 2001 From: bytestream Date: Mon, 5 Jan 2026 16:31:37 +0000 Subject: [PATCH 08/17] write to debug log instead of output --- templates/docker-monolithic/upgrade.sh | 146 ++++++++++++++----------- 1 file changed, 81 insertions(+), 65 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 91e4021..86d5186 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -1,6 +1,37 @@ #!/bin/bash set -eu -o pipefail +# Generate unique log filename +generate_log_filename() { + local base_name="upgrade" + local ext="log" + local filename="${base_name}.${ext}" + local counter=1 + + while [ -f "$filename" ]; do + filename="${base_name}-${counter}.${ext}" + ((counter++)) + done + + echo "$filename" +} + +# Initialize log file +LOG_FILE="$(generate_log_filename)" +touch "$LOG_FILE" + +# Log function - writes to log file +log_debug() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE" +} + +# Error exit function - notifies user about log file +error_exit() { + echo "ERROR: $1" >&2 + echo "A debug log is available in: $LOG_FILE" + exit 1 +} + usage="Options: -h,--help Display this help and exit. -r,--ref=5.x Git ref (commit sha, ref name, tag) to run the script on. @@ -115,16 +146,14 @@ drop_meilisearch_data() { # Stop Meilisearch service echo "Stopping Meilisearch service..." if ! docker compose exec supportpal sv stop 00meilisearch; then - echo "ERROR: Failed to stop Meilisearch service" >&2 - exit 1 + error_exit "Failed to stop Meilisearch service" fi echo "✓ Meilisearch service stopped" # Clear Meilisearch database directory (including hidden files) echo "Clearing Meilisearch database directory..." if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then - echo "ERROR: Failed to clear Meilisearch database directory" >&2 - exit 1 + error_exit "Failed to clear Meilisearch database directory" fi echo "✓ Meilisearch database directory cleared" } @@ -134,17 +163,16 @@ parse_meilisearch_version() { local version_output="$1" local pkgVersion - echo "DEBUG: Raw version output: $version_output" >&2 + log_debug "Raw version output: $version_output" # Extract version number from output like "meilisearch 1.10.3" if ! pkgVersion="$(echo "$version_output" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')"; then - echo "ERROR: Failed to parse version from meilisearch --version output" >&2 - echo "DEBUG: Expected format: 'meilisearch x.y.z'" >&2 - echo "DEBUG: Actual output: $version_output" >&2 - exit 1 + log_debug "Expected format: 'meilisearch x.y.z'" + log_debug "Actual output: $version_output" + error_exit "Failed to parse version from meilisearch --version output" fi - echo "DEBUG: Extracted Meilisearch version: $pkgVersion" >&2 + log_debug "Extracted Meilisearch version: $pkgVersion" echo "$pkgVersion" } @@ -153,49 +181,45 @@ get_current_meilisearch_version() { local CID="$1" local version - echo "DEBUG: Getting Meilisearch version from container: $CID" >&2 + log_debug "Getting Meilisearch version from container: $CID" # Get version directly using meilisearch --version command if ! version="$(docker exec "$CID" meilisearch --version 2>&1)"; then - echo "ERROR: Failed to get Meilisearch version from container $CID" >&2 - echo "DEBUG: Make sure the container is running and has meilisearch binary" >&2 - echo "DEBUG: Container logs:" >&2 - docker logs --tail 10 "$CID" >&2 || true - exit 1 + log_debug "Make sure the container is running and has meilisearch binary" + log_debug "Container logs:" + docker logs --tail 10 "$CID" >> "$LOG_FILE" 2>&1 || true + error_exit "Failed to get Meilisearch version from container $CID" fi parse_meilisearch_version "$version" } get_next_meilisearch_version() { - echo "DEBUG: Fetching next Meilisearch version from docker-compose file..." >&2 - echo "DEBUG: Download URL: $COMPOSE_FILE_DOWNLOAD_URL" >&2 + log_debug "Fetching next Meilisearch version from docker-compose file..." + log_debug "Download URL: $COMPOSE_FILE_DOWNLOAD_URL" local IMAGE if ! IMAGE=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" 2>&1 | grep -m1 -E '^[[:space:]]*image:' | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//"); then - echo "ERROR: Failed to fetch or parse docker-compose file" >&2 - echo "DEBUG: URL: $COMPOSE_FILE_DOWNLOAD_URL" >&2 - echo "DEBUG: Check if the URL is accessible and contains valid YAML" >&2 - exit 1 + log_debug "URL: $COMPOSE_FILE_DOWNLOAD_URL" + log_debug "Check if the URL is accessible and contains valid YAML" + error_exit "Failed to fetch or parse docker-compose file" fi if [ -z "$IMAGE" ]; then - echo "ERROR: Could not extract image name from docker-compose file" >&2 - echo "DEBUG: Expected to find a line like 'image: supportpal/helpdesk:latest'" >&2 - exit 1 + log_debug "Expected to find a line like 'image: supportpal/helpdesk:latest'" + error_exit "Could not extract image name from docker-compose file" fi - echo "DEBUG: Found image: $IMAGE" >&2 + log_debug "Found image: $IMAGE" # Get version directly using meilisearch --version without starting the full container - echo "DEBUG: Getting Meilisearch version from image..." >&2 + log_debug "Getting Meilisearch version from image..." local version if ! version="$(docker run --rm --entrypoint meilisearch "$IMAGE" --version 2>&1)"; then - echo "ERROR: Failed to get Meilisearch version from image: $IMAGE" >&2 - echo "DEBUG: Check if the image exists and contains meilisearch binary" >&2 - echo "DEBUG: Docker run output: $version" >&2 - exit 1 + log_debug "Check if the image exists and contains meilisearch binary" + log_debug "Docker run output: $version" + error_exit "Failed to get Meilisearch version from image: $IMAGE" fi parse_meilisearch_version "$version" @@ -207,31 +231,30 @@ meili_requires_upgrade() { local from_version="$1" local to_version="$2" - echo "DEBUG: Checking if Meilisearch requires upgrading" >&2 - echo "DEBUG: Current version: $from_version" >&2 - echo "DEBUG: Target version: $to_version" >&2 - echo "DEBUG: Dumpless version threshold: $MEILISEARCH_DUMPLESS_VERSION" >&2 + log_debug "Checking if Meilisearch requires upgrading" + log_debug "Current version: $from_version" + log_debug "Target version: $to_version" + log_debug "Dumpless version threshold: $MEILISEARCH_DUMPLESS_VERSION" # Validate input versions if [ -z "$from_version" ] || [ -z "$to_version" ]; then - echo "ERROR: Both from_version and to_version must be provided" >&2 - echo "DEBUG: from_version='$from_version', to_version='$to_version'" >&2 - exit 1 + log_debug "from_version='$from_version', to_version='$to_version'" + error_exit "Both from_version and to_version must be provided" fi # Check if versions are equal - no dump needed if not upgrading if [ "$from_version" = "$to_version" ]; then - echo "DEBUG: No dump required - versions are identical (no upgrade needed)" >&2 + log_debug "No dump required - versions are identical (no upgrade needed)" return 1 # false - no dump required fi # Check version format (basic validation) if ! echo "$from_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then - echo "WARNING: from_version '$from_version' doesn't match expected format (x.y.z)" >&2 + log_debug "WARNING: from_version '$from_version' doesn't match expected format (x.y.z)" fi if ! echo "$to_version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then - echo "WARNING: to_version '$to_version' doesn't match expected format (x.y.z)" >&2 + log_debug "WARNING: to_version '$to_version' doesn't match expected format (x.y.z)" fi # If upgrading from < 1.12.0 to any version, dump is required @@ -239,10 +262,10 @@ meili_requires_upgrade() { comparison_result="$(printf '%s\n' "$from_version" "$MEILISEARCH_DUMPLESS_VERSION" | sort -V | head -n1)" if [ "$comparison_result" = "$from_version" ] && [ "$from_version" != "$MEILISEARCH_DUMPLESS_VERSION" ]; then - echo "DEBUG: Upgrading from pre-$MEILISEARCH_DUMPLESS_VERSION version" >&2 + log_debug "Upgrading from pre-$MEILISEARCH_DUMPLESS_VERSION version" return 0 # true - dump required else - echo "DEBUG: No dump required - version $from_version >= $MEILISEARCH_DUMPLESS_VERSION" >&2 + log_debug "No dump required - version $from_version >= $MEILISEARCH_DUMPLESS_VERSION" return 1 # false - no dump required fi } @@ -254,24 +277,21 @@ upgrade() { echo "Checking current Meilisearch version..." local current_container_id if ! current_container_id=$(docker compose ps -q supportpal 2>/dev/null); then - echo "ERROR: Failed to get supportpal container ID" >&2 - echo "DEBUG: Ensure docker compose is running and supportpal service exists" >&2 - exit 1 + log_debug "Ensure docker compose is running and supportpal service exists" + error_exit "Failed to get supportpal container ID" fi if [ -z "$current_container_id" ]; then - echo "ERROR: supportpal container is not running" >&2 - echo "DEBUG: Start the containers with: docker compose up -d" >&2 - exit 1 + log_debug "Start the containers with: docker compose up -d" + error_exit "supportpal container is not running" fi - echo "DEBUG: Found supportpal container: $current_container_id" >&2 + log_debug "Found supportpal container: $current_container_id" local current_meili_version if ! current_meili_version="$(get_current_meilisearch_version "$current_container_id")"; then - echo "ERROR: Failed to get current Meilisearch version" >&2 - echo "DEBUG: Check if Meilisearch is properly configured in the supportpal container" >&2 - exit 1 + log_debug "Check if Meilisearch is properly configured in the supportpal container" + error_exit "Failed to get current Meilisearch version" fi echo "✓ Current Meilisearch version: $current_meili_version" @@ -280,9 +300,8 @@ upgrade() { echo "Checking target Meilisearch version..." local next_meili_version if ! next_meili_version="$(get_next_meilisearch_version)"; then - echo "ERROR: Failed to get target Meilisearch version" >&2 - echo "DEBUG: Check network connectivity and docker image availability" >&2 - exit 1 + log_debug "Check network connectivity and docker image availability" + error_exit "Failed to get target Meilisearch version" fi echo "✓ Target Meilisearch version: $next_meili_version" @@ -297,9 +316,8 @@ upgrade() { echo "Stopping containers..." if ! docker compose down -v; then - echo "ERROR: Failed to stop containers" >&2 - echo "DEBUG: Check docker compose status and try manually: docker compose down -v" >&2 - exit 1 + log_debug "Check docker compose status and try manually: docker compose down -v" + error_exit "Failed to stop containers" fi echo "Updating volumes..." @@ -318,16 +336,14 @@ upgrade() { echo "Starting upgraded containers..." if ! COMPOSE_PARALLEL_LIMIT=1 docker compose up -d; then - echo "ERROR: Failed to start upgraded containers" >&2 - echo "DEBUG: Check docker compose logs: docker compose logs" >&2 - exit 1 + log_debug "Check docker compose logs: docker compose logs" + error_exit "Failed to start upgraded containers" fi echo "Running helpdesk upgrade script..." if ! docker compose exec supportpal bash -c "bash /init/upgrade-helpdesk.sh"; then - echo "ERROR: Helpdesk upgrade script failed" >&2 - echo "DEBUG: Check container logs: docker compose logs supportpal" >&2 - exit 1 + log_debug "Check container logs: docker compose logs supportpal" + error_exit "Helpdesk upgrade script failed" fi echo From 575795701095ddc3578d93432c9ecfa63b63763b Mon Sep 17 00:00:00 2001 From: bytestream Date: Mon, 5 Jan 2026 16:32:11 +0000 Subject: [PATCH 09/17] use sudo to stop meilisearch --- templates/docker-monolithic/upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 86d5186..52fb188 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -145,7 +145,7 @@ drop_meilisearch_data() { # Stop Meilisearch service echo "Stopping Meilisearch service..." - if ! docker compose exec supportpal sv stop 00meilisearch; then + if ! docker compose exec supportpal sudo sv stop 00meilisearch; then error_exit "Failed to stop Meilisearch service" fi echo "✓ Meilisearch service stopped" From 8c2726c14b35ea5eefdd0b7ec61e17f899b099f1 Mon Sep 17 00:00:00 2001 From: bytestream Date: Mon, 5 Jan 2026 17:01:44 +0000 Subject: [PATCH 10/17] record meilisearch version --- templates/docker-monolithic/upgrade.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 52fb188..97f8941 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -152,7 +152,7 @@ drop_meilisearch_data() { # Clear Meilisearch database directory (including hidden files) echo "Clearing Meilisearch database directory..." - if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then + if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && sudo rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then error_exit "Failed to clear Meilisearch database directory" fi echo "✓ Meilisearch database directory cleared" @@ -296,6 +296,10 @@ upgrade() { echo "✓ Current Meilisearch version: $current_meili_version" + # Write Meilisearch version to file if it doesn't exist + echo "Recording current Meilisearch version..." + docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && [ ! -f "$MEILISEARCH_VERSION_FILE" ] && echo "'"$current_meili_version"'" | sudo tee "$MEILISEARCH_VERSION_FILE" > /dev/null' || true + # Get next Meilisearch version with error handling echo "Checking target Meilisearch version..." local next_meili_version From cd7a486690dfe5a3370ce35fe06241a42e6eda25 Mon Sep 17 00:00:00 2001 From: bytestream Date: Mon, 5 Jan 2026 17:05:21 +0000 Subject: [PATCH 11/17] Revert "record meilisearch version" This reverts commit 471b7aafec305b8f7b3ab4ee1eca9808c9f9bf8a. --- templates/docker-monolithic/upgrade.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 97f8941..52fb188 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -152,7 +152,7 @@ drop_meilisearch_data() { # Clear Meilisearch database directory (including hidden files) echo "Clearing Meilisearch database directory..." - if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && sudo rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then + if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then error_exit "Failed to clear Meilisearch database directory" fi echo "✓ Meilisearch database directory cleared" @@ -296,10 +296,6 @@ upgrade() { echo "✓ Current Meilisearch version: $current_meili_version" - # Write Meilisearch version to file if it doesn't exist - echo "Recording current Meilisearch version..." - docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && [ ! -f "$MEILISEARCH_VERSION_FILE" ] && echo "'"$current_meili_version"'" | sudo tee "$MEILISEARCH_VERSION_FILE" > /dev/null' || true - # Get next Meilisearch version with error handling echo "Checking target Meilisearch version..." local next_meili_version From 7dbf1be141d6b28b30cbfaac33bae0a191cad56d Mon Sep 17 00:00:00 2001 From: bytestream Date: Tue, 6 Jan 2026 11:02:55 +0000 Subject: [PATCH 12/17] use sudo to drop meilisearch db --- templates/docker-monolithic/upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 52fb188..8ebf992 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -152,7 +152,7 @@ drop_meilisearch_data() { # Clear Meilisearch database directory (including hidden files) echo "Clearing Meilisearch database directory..." - if ! docker compose exec supportpal bash -c 'source <(sudo cat /etc/container_environment.sh) && rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then + if ! docker compose exec supportpal bash -c 'sudo rm -rf "${MEILI_DB_PATH:?}"/* "${MEILI_DB_PATH:?}"/.[!.]*'; then error_exit "Failed to clear Meilisearch database directory" fi echo "✓ Meilisearch database directory cleared" From 861619cd98ac5886087861562dd16a4e82609793 Mon Sep 17 00:00:00 2001 From: bytestream Date: Tue, 6 Jan 2026 13:52:31 +0000 Subject: [PATCH 13/17] add note about upgrading dependencies --- templates/docker-compose/MAINTENANCE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/docker-compose/MAINTENANCE.md b/templates/docker-compose/MAINTENANCE.md index 63b3b14..590f638 100644 --- a/templates/docker-compose/MAINTENANCE.md +++ b/templates/docker-compose/MAINTENANCE.md @@ -28,7 +28,7 @@ make restore ```bash make backup ``` -2. Run the `upgrade` command: +2. Consider upgrading dependencies (MySQL, Redis, Meilisearch, etc) to new supported versions, and then run the `upgrade` command: ```bash make upgrade ``` From 1430510149f8cf3c7f89adc4ccc8ec5d8694b3a7 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 6 Jan 2026 13:58:52 +0000 Subject: [PATCH 14/17] Update templates/docker-monolithic/upgrade.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- templates/docker-monolithic/upgrade.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 8ebf992..3d13970 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -161,19 +161,19 @@ drop_meilisearch_data() { # Helper function to parse version from meilisearch --version output parse_meilisearch_version() { local version_output="$1" - local pkgVersion + local pkg_version log_debug "Raw version output: $version_output" # Extract version number from output like "meilisearch 1.10.3" - if ! pkgVersion="$(echo "$version_output" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')"; then + if ! pkg_version="$(echo "$version_output" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')"; then log_debug "Expected format: 'meilisearch x.y.z'" log_debug "Actual output: $version_output" error_exit "Failed to parse version from meilisearch --version output" fi - log_debug "Extracted Meilisearch version: $pkgVersion" - echo "$pkgVersion" + log_debug "Extracted Meilisearch version: $pkg_version" + echo "$pkg_version" } # Usage: get_current_meilisearch_version From e519c70ff2298d45912e341b13f6efdb16dc9a6a Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 6 Jan 2026 14:00:51 +0000 Subject: [PATCH 15/17] Update templates/docker-monolithic/upgrade.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- templates/docker-monolithic/upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 3d13970..c6cd4cd 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -310,7 +310,7 @@ upgrade() { if meili_requires_upgrade "$current_meili_version" "$next_meili_version"; then echo "✓ Meilisearch upgrade is required." echo "! The Meilisearch database will be dropped and re-indexed... cancel (CTRL+C) if you're not happy to proceed..." - sleep 5 + sleep 10 drop_meilisearch_data fi From fed004370b5e0b100ba1f46e59b7743d0288231c Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 6 Jan 2026 14:01:38 +0000 Subject: [PATCH 16/17] Update templates/docker-monolithic/upgrade.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- templates/docker-monolithic/upgrade.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index c6cd4cd..3be34d7 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -178,17 +178,17 @@ parse_meilisearch_version() { # Usage: get_current_meilisearch_version get_current_meilisearch_version() { - local CID="$1" + local cid="$1" local version - log_debug "Getting Meilisearch version from container: $CID" + log_debug "Getting Meilisearch version from container: $cid" # Get version directly using meilisearch --version command - if ! version="$(docker exec "$CID" meilisearch --version 2>&1)"; then + if ! version="$(docker exec "$cid" meilisearch --version 2>&1)"; then log_debug "Make sure the container is running and has meilisearch binary" log_debug "Container logs:" - docker logs --tail 10 "$CID" >> "$LOG_FILE" 2>&1 || true - error_exit "Failed to get Meilisearch version from container $CID" + docker logs --tail 10 "$cid" >> "$LOG_FILE" 2>&1 || true + error_exit "Failed to get Meilisearch version from container $cid" fi parse_meilisearch_version "$version" From 522e880d00ddbc215c0249ddec23c106a359c0b0 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 6 Jan 2026 14:02:00 +0000 Subject: [PATCH 17/17] Update templates/docker-monolithic/upgrade.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- templates/docker-monolithic/upgrade.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/docker-monolithic/upgrade.sh b/templates/docker-monolithic/upgrade.sh index 3be34d7..a12097a 100644 --- a/templates/docker-monolithic/upgrade.sh +++ b/templates/docker-monolithic/upgrade.sh @@ -198,28 +198,28 @@ get_next_meilisearch_version() { log_debug "Fetching next Meilisearch version from docker-compose file..." log_debug "Download URL: $COMPOSE_FILE_DOWNLOAD_URL" - local IMAGE - if ! IMAGE=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" 2>&1 | grep -m1 -E '^[[:space:]]*image:' | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//"); then + local image + if ! image=$(curl -fsSL "${COMPOSE_FILE_DOWNLOAD_URL}" 2>&1 | grep -m1 -E '^[[:space:]]*image:' | sed -E "s/^[[:space:]]*image:[[:space:]]*//; s/^['\"]//; s/['\"]$//"); then log_debug "URL: $COMPOSE_FILE_DOWNLOAD_URL" log_debug "Check if the URL is accessible and contains valid YAML" error_exit "Failed to fetch or parse docker-compose file" fi - if [ -z "$IMAGE" ]; then + if [ -z "$image" ]; then log_debug "Expected to find a line like 'image: supportpal/helpdesk:latest'" error_exit "Could not extract image name from docker-compose file" fi - log_debug "Found image: $IMAGE" + log_debug "Found image: $image" # Get version directly using meilisearch --version without starting the full container log_debug "Getting Meilisearch version from image..." local version - if ! version="$(docker run --rm --entrypoint meilisearch "$IMAGE" --version 2>&1)"; then + if ! version="$(docker run --rm --entrypoint meilisearch "$image" --version 2>&1)"; then log_debug "Check if the image exists and contains meilisearch binary" log_debug "Docker run output: $version" - error_exit "Failed to get Meilisearch version from image: $IMAGE" + error_exit "Failed to get Meilisearch version from image: $image" fi parse_meilisearch_version "$version"