The site header / Services mega-dropdown was duplicated across two render systems (Astro pages via Base.astro->nav.html, and ~80 pre-rendered static public/**/index.html pages each embedding their own copy). They had drifted into 5 different variants (missing 'New Carrier Setup', misplaced Healthcare column, NEW vs FREE badges, em-dash encoding differences), so dev.performancewest.net, the order pages, and the rest of the site disagreed. - Make site/src/partials/nav.html the single source of truth (adopts the most complete variant). - Add scripts/sync_nav.py to rewrite every static page's <nav> block from nav.html (idempotent; --check guards against drift in CI/deploy). - Run the sync automatically in deploy.sh and scripts/deploy-dev.sh. - Deprecate scripts/inject_healthcare_nav.py (now delegates to sync_nav.py). - Neutralize the broken no-op SiteNav.astro component. All 80 headers + the Astro-built order pages now render the identical dropdown.
80 lines
3.4 KiB
Bash
Executable file
80 lines
3.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Deploy latest code from git and rebuild containers.
|
|
# Usage: ./deploy.sh (rebuilds site, api, workers)
|
|
# ./deploy.sh site (rebuilds only site)
|
|
# ./deploy.sh api (rebuilds only api)
|
|
# ./deploy.sh erpnext (rebuild + migrate ERPNext, re-extract assets)
|
|
# ./deploy.sh api workers (rebuild a custom set)
|
|
set -euo pipefail
|
|
cd /opt/performancewest
|
|
|
|
SERVICES="${@:-site api workers}"
|
|
|
|
echo "=== Pulling latest from git ==="
|
|
git pull origin main
|
|
|
|
# Single source of truth for the site header: rewrite every static page's
|
|
# <nav> block from site/src/partials/nav.html so the Services dropdown stays
|
|
# identical across the static site, the Astro order pages, and dev. Idempotent;
|
|
# does nothing if already in sync. (See scripts/sync_nav.py.)
|
|
echo ""
|
|
echo "=== Syncing canonical site header (Services dropdown) ==="
|
|
python3 scripts/sync_nav.py
|
|
|
|
echo ""
|
|
echo "=== Building: $SERVICES ==="
|
|
# ERPNext bakes the custom Frappe apps into its image, so they must be staged
|
|
# into the build context (erpnext/<app>/) from the repo first. Without this,
|
|
# `docker compose build erpnext` would use stale app copies and silently ship
|
|
# old code (e.g. the set-password controller rename would never take effect).
|
|
case " $SERVICES " in
|
|
*" erpnext "*) echo "--- staging custom Frappe apps ---"; bash erpnext/build.sh ;;
|
|
esac
|
|
docker compose build $SERVICES
|
|
|
|
echo ""
|
|
echo "=== Restarting: $SERVICES ==="
|
|
docker compose up -d $SERVICES
|
|
|
|
# ── ERPNext: migrate, then ALWAYS re-extract the host asset copy ─────────────
|
|
# Frappe emits content-hashed asset filenames; an ERPNext rebuild/migrate
|
|
# changes the hashes. If we don't re-sync the host copy that nginx serves for
|
|
# portal.performancewest.net, every asset 404s and the portal loses all CSS.
|
|
# So any time erpnext is (re)built we run bench migrate + re-extract assets.
|
|
case " $SERVICES " in
|
|
*" erpnext "*)
|
|
echo ""
|
|
echo "=== ERPNext: bench migrate ==="
|
|
docker compose exec -T erpnext bench --site performancewest.net migrate || \
|
|
docker compose exec -T erpnext bench migrate || true
|
|
echo ""
|
|
echo "=== ERPNext: re-extracting static assets for the portal ==="
|
|
sudo ./extract-erpnext-assets.sh
|
|
;;
|
|
esac
|
|
|
|
echo ""
|
|
echo "=== Clearing nginx cache ==="
|
|
sudo rm -rf /var/cache/nginx/* 2>/dev/null || true
|
|
sudo nginx -s reload 2>/dev/null || true
|
|
|
|
# ── Portal asset drift guard ────────────────────────────────────────────────
|
|
# Cheap safety net on EVERY deploy: if the portal's manifest references a CSS
|
|
# bundle that is missing from the host copy, the portal CSS is broken — detect
|
|
# it and auto-heal by re-extracting. This catches drift from any source
|
|
# (out-of-band ERPNext restarts, image pulls, etc.).
|
|
if docker inspect performancewest-erpnext-1 >/dev/null 2>&1; then
|
|
LOGIN_HASH="$(docker exec performancewest-erpnext-1 sh -c \
|
|
"grep -o 'login.bundle.[A-Z0-9]*.css' /home/frappe/frappe-bench/sites/assets/assets.json | head -1" 2>/dev/null || true)"
|
|
if [ -n "$LOGIN_HASH" ] && \
|
|
[ ! -f "/opt/erpnext-assets/assets/frappe/dist/css/${LOGIN_HASH}" ]; then
|
|
echo ""
|
|
echo "=== Portal asset drift detected (${LOGIN_HASH} missing) — re-extracting ==="
|
|
sudo ./extract-erpnext-assets.sh
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Done ==="
|
|
git log --oneline -1
|
|
docker compose ps --format "table {{.Name}}\t{{.Status}}" | head -10
|