From 09f9cf35537ac58f027ad06aef04c1300ef84833 Mon Sep 17 00:00:00 2001 From: boban Date: Sun, 26 Apr 2026 19:37:44 +0200 Subject: [PATCH] Fix: Frontend-Build-Sicherung + Auto-Rebuild bei fehlendem manifest.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- scripts/update.sh | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/scripts/update.sh b/scripts/update.sh index 54b05dd..1b6ab12 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -113,21 +113,25 @@ frontend_build_quiet() { chmod 0644 "$LOG" 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'" - chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/public/build" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" "${APP_DIR}/.npm-cache" || true - chmod -R g+rwX "${APP_DIR}/public/build" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" || true + chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/node_modules" "${APP_DIR}/.vite" "${APP_DIR}/.npm-cache" 2>/dev/null || true - # evtl. störrische Reste entfernen (vermeidet EACCES beim Unlink/Rimraf) - rm -rf "${APP_DIR}/node_modules/.vite" "${APP_DIR}/public/build/"* 2>/dev/null || true + # Altes Build-Verzeichnis sichern — wird erst nach erfolgreichem Build ersetzt + 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 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 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 return 1 fi @@ -135,16 +139,16 @@ frontend_build_quiet() { echo "[i] Frontend: Build … (Details: $LOG)" 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 return 1 fi - # Nach dem Build noch einmal Rechte begradigen - chown -R "$APP_USER":"$APP_GROUP" "${APP_DIR}/public/build" || true - find "${APP_DIR}/public/build" -type d -exec chmod 2775 {} \; 2>/dev/null || true - find "${APP_DIR}/public/build" -type f -exec chmod 0664 {} \; 2>/dev/null || true - + rm -rf "${BUILD_BAK}" 2>/dev/null || true + chown -R "$APP_USER":"$APP_GROUP" "${BUILD_DIR}" || true + find "${BUILD_DIR}" -type d -exec chmod 2775 {} \; 2>/dev/null || true + find "${BUILD_DIR}" -type f -exec chmod 0664 {} \; 2>/dev/null || true echo "[✓] Frontend gebaut." } @@ -163,21 +167,25 @@ _sudoers_add(){ chmod 440 "$file" } fix_permissions(){ - # Eigentümer + Gruppe korrigieren chown -R "${APP_USER}:${APP_GROUP}" \ "${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/storage" \ "${APP_DIR}/public/build" 2>/dev/null || true - # Gruppe Schreibrecht + setgid (neue Dateien erben Gruppe automatisch) chmod -R ug+rwX \ "${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/storage" 2>/dev/null || true find "${APP_DIR}/bootstrap/cache" "${APP_DIR}/storage" \ -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" 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" config:cache --quiet 2>/dev/null || true + sudo -u "${APP_GROUP}" php "${APP_DIR}/artisan" route:cache --quiet 2>/dev/null || true } ensure_system(){