From 0cf63231d374c7e9ae315258ca57dddcf9671a2b Mon Sep 17 00:00:00 2001 From: Sami Date: Wed, 6 May 2026 18:31:28 -0700 Subject: [PATCH] fix(updater): copy src/, replace routes/ in place instead of nesting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two bugs in the host-side updater script: 1. The Dockerfile (since f5fe32b) does \`COPY src/ ./src/\`, but the host script never copies src/ from staging into the api source directory. Result: every update fails with "failed to compute cache key: ... '/src': not found". 2. \`cp -rf staging/routes api_source/routes/\` does NOT replace the destination directory — it copies the source dir INTO the destination, producing api_source/routes/routes/. Means new route files end up nested one level deep and never get loaded by server.js, so updates silently regress route handlers even when the build succeeds. Switch to "rm -rf dest && cp -rf src dest" semantics for both routes and src, in all four touch points (deploy + 3 rollback paths). Co-Authored-By: Claude Opus 4.7 (1M context) --- dashcaddy-api/scripts/dashcaddy-update.sh | 39 ++++++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/dashcaddy-api/scripts/dashcaddy-update.sh b/dashcaddy-api/scripts/dashcaddy-update.sh index 38a9a1c..01ffe6f 100644 --- a/dashcaddy-api/scripts/dashcaddy-update.sh +++ b/dashcaddy-api/scripts/dashcaddy-update.sh @@ -113,11 +113,12 @@ main() { mkdir -p "$backup_dir" log "Backing up current API files to ${backup_dir}" - # Copy all JS files, package.json, Dockerfile, and routes + # Copy all JS files, package.json, Dockerfile, and tracked subdirs for item in "$api_source_dir"/*.js "$api_source_dir"/package.json "$api_source_dir"/package-lock.json "$api_source_dir"/Dockerfile "$api_source_dir"/openapi.yaml; do [[ -f "$item" ]] && cp -f "$item" "$backup_dir/" 2>/dev/null || true done [[ -d "$api_source_dir/routes" ]] && cp -rf "$api_source_dir/routes" "$backup_dir/" + [[ -d "$api_source_dir/src" ]] && cp -rf "$api_source_dir/src" "$backup_dir/" # Save version marker echo "$from_version" > "$backup_dir/VERSION" @@ -128,7 +129,14 @@ main() { for item in "$staging_dir"/*.js "$staging_dir"/package.json "$staging_dir"/package-lock.json "$staging_dir"/Dockerfile "$staging_dir"/openapi.yaml; do [[ -f "$item" ]] && cp -f "$item" "$api_source_dir/" 2>/dev/null || true done - [[ -d "$staging_dir/routes" ]] && cp -rf "$staging_dir/routes" "$api_source_dir/routes/" + if [[ -d "$staging_dir/routes" ]]; then + rm -rf "$api_source_dir/routes" + cp -rf "$staging_dir/routes" "$api_source_dir/routes" + fi + if [[ -d "$staging_dir/src" ]]; then + rm -rf "$api_source_dir/src" + cp -rf "$staging_dir/src" "$api_source_dir/src" + fi # 5. Rebuild container log "Rebuilding container..." @@ -148,7 +156,14 @@ main() { for item in "$backup_dir"/*.js "$backup_dir"/package.json "$backup_dir"/package-lock.json "$backup_dir"/Dockerfile "$backup_dir"/openapi.yaml; do [[ -f "$item" ]] && cp -f "$item" "$api_source_dir/" 2>/dev/null || true done - [[ -d "$backup_dir/routes" ]] && cp -rf "$backup_dir/routes" "$api_source_dir/routes/" + if [[ -d "$backup_dir/routes" ]]; then + rm -rf "$api_source_dir/routes" + cp -rf "$backup_dir/routes" "$api_source_dir/routes" + fi + if [[ -d "$backup_dir/src" ]]; then + rm -rf "$api_source_dir/src" + cp -rf "$backup_dir/src" "$api_source_dir/src" + fi write_result "false" "$version" "$(( $(date +%s) - start_time ))" "Docker build failed" rm -f "${TRIGGER_FILE}.processing" @@ -166,7 +181,14 @@ main() { for item in "$backup_dir"/*.js "$backup_dir"/package.json "$backup_dir"/package-lock.json "$backup_dir"/Dockerfile "$backup_dir"/openapi.yaml; do [[ -f "$item" ]] && cp -f "$item" "$api_source_dir/" 2>/dev/null || true done - [[ -d "$backup_dir/routes" ]] && cp -rf "$backup_dir/routes" "$api_source_dir/routes/" + if [[ -d "$backup_dir/routes" ]]; then + rm -rf "$api_source_dir/routes" + cp -rf "$backup_dir/routes" "$api_source_dir/routes" + fi + if [[ -d "$backup_dir/src" ]]; then + rm -rf "$api_source_dir/src" + cp -rf "$backup_dir/src" "$api_source_dir/src" + fi docker compose build --quiet 2>&1 || docker-compose build --quiet 2>&1 || true docker compose up -d 2>&1 || docker-compose up -d 2>&1 || true @@ -189,7 +211,14 @@ main() { for item in "$backup_dir"/*.js "$backup_dir"/package.json "$backup_dir"/package-lock.json "$backup_dir"/Dockerfile "$backup_dir"/openapi.yaml; do [[ -f "$item" ]] && cp -f "$item" "$api_source_dir/" 2>/dev/null || true done - [[ -d "$backup_dir/routes" ]] && cp -rf "$backup_dir/routes" "$api_source_dir/routes/" + if [[ -d "$backup_dir/routes" ]]; then + rm -rf "$api_source_dir/routes" + cp -rf "$backup_dir/routes" "$api_source_dir/routes" + fi + if [[ -d "$backup_dir/src" ]]; then + rm -rf "$api_source_dir/src" + cp -rf "$backup_dir/src" "$api_source_dir/src" + fi docker compose build --quiet 2>&1 || docker-compose build --quiet 2>&1 || true docker compose up -d 2>&1 || docker-compose up -d 2>&1 || true