deploy: fix recurring portal CSS breakage from ERPNext asset hash drift
The portal serves Frappe assets from a host copy (/opt/erpnext-assets). Frappe emits content-hashed filenames that change on every ERPNext rebuild/migrate; the host copy was never re-synced by deploy.sh, so the manifest referenced hashes that 404'd on the host -> portal rendered with no CSS (recurring issue). - Commit extract-erpnext-assets.sh (was untracked, prod-only). It now also runs bench build to keep assets.json consistent with dist/, copies the manifest, and verifies the login bundle exists on the host before finishing. - deploy.sh: add an 'erpnext' target that rebuilds, runs bench migrate, and re-extracts assets. Plus a cheap drift guard on EVERY deploy that auto-heals by re-extracting if the portal manifest references a missing CSS bundle.
This commit is contained in:
parent
f21f3d41d9
commit
c5e6bdbe6d
2 changed files with 108 additions and 3 deletions
41
deploy.sh
41
deploy.sh
|
|
@ -1,8 +1,10 @@
|
|||
#!/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)
|
||||
# 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
|
||||
|
||||
|
|
@ -19,11 +21,44 @@ 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue