Fix: Frontend-Build-Sicherung + Auto-Rebuild bei fehlendem manifest.json

- frontend_build_quiet: altes public/build/ als .bak sichern,
  bei npm-Fehler wiederherstellen → Site bleibt immer erreichbar
- fix_permissions: wenn manifest.json fehlt, automatisch neu bauen
  → kein manueller Eingriff nach fehlgeschlagenem Update nötig

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main v1.1.315
boban 2026-04-26 19:37:44 +02:00
parent 1d18e80749
commit 09f9cf3553
1 changed files with 26 additions and 18 deletions

View File

@ -113,21 +113,25 @@ frontend_build_quiet() {
chmod 0644 "$LOG" chmod 0644 "$LOG"
echo "[i] Frontend: vorbereiten …" echo "[i] Frontend: vorbereiten …"
# Build-Ziele & Temp besitzbar machen
as_app "mkdir -p '${APP_DIR}/public/build' '${APP_DIR}/node_modules' '${APP_DIR}/.vite' '${APP_DIR}/.npm-cache'" as_app "mkdir -p '${APP_DIR}/public/build' '${APP_DIR}/node_modules' '${APP_DIR}/.vite' '${APP_DIR}/.npm-cache'"
chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/public/build" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" "${APP_DIR}/.npm-cache" || true chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" "${APP_DIR}/.npm-cache" 2>/dev/null || true
chmod -R g+rwX "${APP_DIR}/public/build" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" || true
# evtl. störrische Reste entfernen (vermeidet EACCES beim Unlink/Rimraf) # Altes Build-Verzeichnis sichern — wird erst nach erfolgreichem Build ersetzt
rm -rf "${APP_DIR}/node_modules/.vite" "${APP_DIR}/public/build/"* 2>/dev/null || true local BUILD_DIR="${APP_DIR}/public/build"
local BUILD_BAK="${APP_DIR}/public/build.bak"
rm -rf "${BUILD_BAK}" 2>/dev/null || true
[[ -d "${BUILD_DIR}" ]] && cp -a "${BUILD_DIR}" "${BUILD_BAK}" 2>/dev/null || true
rm -rf "${APP_DIR}/node_modules/.vite" "${BUILD_DIR}/"* 2>/dev/null || true
chown -R "$APP_USER":"$APP_GROUP" "${BUILD_DIR}" 2>/dev/null || true
# npm Config (kein Fund/Audit, eigener Cache unter App-User)
as_app "printf 'fund=false\naudit=false\ncache=${APP_DIR}/.npm-cache\n' > ~/.npmrc" >>"$LOG" 2>&1 || true as_app "printf 'fund=false\naudit=false\ncache=${APP_DIR}/.npm-cache\n' > ~/.npmrc" >>"$LOG" 2>&1 || true
echo "[i] Frontend: Dependencies … (Details: $LOG)" echo "[i] Frontend: Dependencies … (Details: $LOG)"
if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm ci --no-audit --no-fund --no-progress" >>"$LOG" 2>&1; then if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm ci --no-audit --no-fund --no-progress" >>"$LOG" 2>&1; then
if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm install --no-audit --no-fund --no-progress" >>"$LOG" 2>&1; then if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm install --no-audit --no-fund --no-progress" >>"$LOG" 2>&1; then
echo "[!] npm install fehlgeschlagen. Letzte 60 Zeilen:" echo "[!] npm install fehlgeschlagen — altes Build wird wiederhergestellt."
[[ -d "${BUILD_BAK}" ]] && cp -a "${BUILD_BAK}/." "${BUILD_DIR}/" 2>/dev/null || true
tail -n 60 "$LOG" || true tail -n 60 "$LOG" || true
return 1 return 1
fi fi
@ -135,16 +139,16 @@ frontend_build_quiet() {
echo "[i] Frontend: Build … (Details: $LOG)" echo "[i] Frontend: Build … (Details: $LOG)"
if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm run build --silent --loglevel=warn" >>"$LOG" 2>&1; then if ! as_app "cd '${APP_DIR}' && ${NPM_ENV} npm run build --silent --loglevel=warn" >>"$LOG" 2>&1; then
echo "[!] Build fehlgeschlagen. Letzte 80 Zeilen:" echo "[!] Build fehlgeschlagen — altes Build wird wiederhergestellt."
[[ -d "${BUILD_BAK}" ]] && cp -a "${BUILD_BAK}/." "${BUILD_DIR}/" 2>/dev/null || true
tail -n 80 "$LOG" || true tail -n 80 "$LOG" || true
return 1 return 1
fi fi
# Nach dem Build noch einmal Rechte begradigen rm -rf "${BUILD_BAK}" 2>/dev/null || true
chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/public/build" || true chown -R "$APP_USER":"$APP_GROUP" "${BUILD_DIR}" || true
find "${APP_DIR}/public/build" -type d -exec chmod 2775 {} \; 2>/dev/null || true find "${BUILD_DIR}" -type d -exec chmod 2775 {} \; 2>/dev/null || true
find "${APP_DIR}/public/build" -type f -exec chmod 0664 {} \; 2>/dev/null || true find "${BUILD_DIR}" -type f -exec chmod 0664 {} \; 2>/dev/null || true
echo "[✓] Frontend gebaut." echo "[✓] Frontend gebaut."
} }
@ -163,21 +167,25 @@ _sudoers_add(){
chmod 440 "$file" chmod 440 "$file"
} }
fix_permissions(){ fix_permissions(){
# Eigentümer + Gruppe korrigieren
chown -R "${APP_USER}:${APP_GROUP}" \ chown -R "${APP_USER}:${APP_GROUP}" \
"${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/bootstrap/cache" \
"${APP_DIR}/storage" \ "${APP_DIR}/storage" \
"${APP_DIR}/public/build" 2>/dev/null || true "${APP_DIR}/public/build" 2>/dev/null || true
# Gruppe Schreibrecht + setgid (neue Dateien erben Gruppe automatisch)
chmod -R ug+rwX \ chmod -R ug+rwX \
"${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/bootstrap/cache" \
"${APP_DIR}/storage" 2>/dev/null || true "${APP_DIR}/storage" 2>/dev/null || true
find "${APP_DIR}/bootstrap/cache" "${APP_DIR}/storage" \ find "${APP_DIR}/bootstrap/cache" "${APP_DIR}/storage" \
-type d -exec chmod g+s {} \; 2>/dev/null || true -type d -exec chmod g+s {} \; 2>/dev/null || true
# Cache als www-data (PHP-FPM-User) neu aufbauen → keine Rechteprobleme
# Frontend-Assets fehlen → automatisch neu bauen (z.B. nach fehlgeschlagenem Update)
if [[ ! -f "${APP_DIR}/public/build/manifest.json" ]]; then
echo "[!] manifest.json fehlt — Frontend wird neu gebaut …"
frontend_build_quiet || true
fi
sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" optimize:clear --quiet 2>/dev/null || true sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" optimize:clear --quiet 2>/dev/null || true
sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" config:cache --quiet 2>/dev/null || true sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" config:cache --quiet 2>/dev/null || true
sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" route:cache --quiet 2>/dev/null || true sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" route:cache --quiet 2>/dev/null || true
} }
ensure_system(){ ensure_system(){