fix: Admin-Uploads auf dem Live-Server (Berechtigung, Persistenz, Body-Size-Limit)
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m29s
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m29s
Uploads (Bilder + Hero-Video) schlugen live fehl, lokal aber nicht: der Container laeuft als non-root "nextjs", /app/uploads existierte nirgends vorbereitet und gehoert root -> mkdir() scheiterte mit EACCES, unbehandelt als HTML-500 statt JSON, der Client zeigte nur einen haengenden "wird hochgeladen"-Zustand ohne Fehlermeldung. - Dockerfile legt /app/uploads jetzt vor dem User-Wechsel an und uebereignet es dem nextjs-Nutzer - docker-compose.yml persistiert Uploads jetzt ueber ein eigenes Volume (vorher gingen sie bei jedem Redeploy verloren) und setzt UPLOAD_DIR explizit - Beide Upload-Routen fangen Dateisystemfehler jetzt ab und liefern eine echte JSON-Fehlermeldung statt eine unbehandelte Exception - k8s-Manifeste vorsorglich mitgefixt (fsGroup fuer den Volume-Mount, Ingress-Body-Size-Limit) fuer den Fall eines spaeteren Kubernetes-Wechsels Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
286387d5ec
commit
d0c1d0840c
7 files changed
+71
-5
No files matched your search
@@ -73,9 +73,18 @@ export async function POST(request: Request) {
|
||||
);
|
||||
}
|
||||
|
||||
await mkdir(UPLOAD_DIR, { recursive: true });
|
||||
const filename = generateUploadFilename(extension);
|
||||
await writeFile(path.join(UPLOAD_DIR, filename), buffer);
|
||||
try {
|
||||
await mkdir(UPLOAD_DIR, { recursive: true });
|
||||
await writeFile(path.join(UPLOAD_DIR, filename), buffer);
|
||||
} catch (error: unknown) {
|
||||
// Siehe Kommentar in app/api/admin/upload/route.ts (identisches Muster).
|
||||
console.error("Video-Upload: Datei konnte nicht gespeichert werden.", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Die Datei konnte nicht gespeichert werden. Bitte informiere die Technik." },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
await logAdminAction(admin, {
|
||||
action: "media.upload",
|
||||
|
||||
@@ -91,9 +91,22 @@ export async function POST(request: Request) {
|
||||
return NextResponse.json({ error: "Das Bild konnte nicht verarbeitet werden." }, { status: 400 });
|
||||
}
|
||||
|
||||
await mkdir(UPLOAD_DIR, { recursive: true });
|
||||
const filename = generateUploadFilename(extension);
|
||||
await writeFile(path.join(UPLOAD_DIR, filename), output);
|
||||
try {
|
||||
await mkdir(UPLOAD_DIR, { recursive: true });
|
||||
await writeFile(path.join(UPLOAD_DIR, filename), output);
|
||||
} catch (error: unknown) {
|
||||
// Ohne dieses Catch wuerde ein Dateisystemfehler (z.B. fehlende
|
||||
// Schreibrechte auf UPLOAD_DIR) als unbehandelte Exception durchschlagen
|
||||
// -> Next.js liefert dafuer eine HTML-Fehlerseite statt JSON zurueck,
|
||||
// response.json() im Client (admin-image-field.tsx) wirft dann einen
|
||||
// kryptischen Parse-Fehler statt einer verstaendlichen Meldung.
|
||||
console.error("Bild-Upload: Datei konnte nicht gespeichert werden.", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Die Datei konnte nicht gespeichert werden. Bitte informiere die Technik." },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
await logAdminAction(admin, {
|
||||
action: "media.upload",
|
||||
|
||||
Reference in new issue
Block a user