Kamil Owczarek
Opublikowano

Jak rozwiązałem problemy z Prismą i naprawiłem Vercel 500 INTERNAL_SERVER_ERROR

Autorzy

Wczoraj przeniosłem starą aplikację z własnego hostingu na Vercela. Spodziewałem się jakichś problemów, ale trafiłem na taki, który zajął mi znacznie więcej czasu, niż zakładałem. Poniżej opisuję, jak do niego podszedłem i co ostatecznie zadziałało — może komuś oszczędzi to kilka godzin.

Krok 1: Zaktualizuj Prismę i @prisma/client

Na start upewnij się, że masz najnowsze wersje Prismy i @prisma/client. W moim projekcie najnowsza wersja była wtedy 5.14.0. Aktualizujesz je tak:

npm install prisma@5.14.0 @prisma/client@5.14.0 --save-dev

Krok 2: Konfiguracja startowa

Po deployu na Vercela zobaczyłem w logach taki błąd:

Prisma has detected that this project was built on Vercel, which caches dependencies.
This leads to an outdated Prisma Client because Prisma's auto-generation isn't triggered.
To fix this, make sure to run the `prisma generate` command during the build process.

Learn how: https://pris.ly/d/vercel-build

Krok 3: Robię to, co mówi komunikat

Komunikat błędu był jasny. Żeby go naprawić, musiałem dodać do package.json:

"postinstall": "prisma generate"

Krok 4: Dodanie komendy build

To jednak nie rozwiązało sprawy do końca. Zmieniłem więc komendę builda na Vercelu, żeby Prisma na pewno wygenerowała klienta przed zbudowaniem aplikacji:

"build": "npx prisma generate && next build"

Krok 5: Pojawia się nowy problem

Po tej zmianie aplikacja zbudowała się poprawnie, ale wszystkie wywołania API zwracały Vercel 500: INTERNAL_SERVER_ERROR. Frustrujące — zwłaszcza że w sieci nie było zbyt wiele na temat tego, jak to naprawić.

Krok 6: Debugowanie

Po kilku godzinach prób i błędów znalazłem przyczynę w pliku schema.prisma. Tak wyglądała moja pierwotna konfiguracja:

generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "linux-musl"] // <- Required on Ubuntu
}

datasource db {
  provider     = "postgresql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"
}

Na moim serwerze działało to bez zarzutu, ale na Vercelu się sypało — zapomniałem, że przygotowałem tę konfigurację specjalnie pod Ubuntu.

Krok 7: Poprawka schematu

Poprawne ustawienia wyglądają tak:

generator client {
  provider      = "prisma-client-js"
  previewFeatures = ["driverAdapters"] // <- neon.tech
}

datasource db {
  provider     = "postgresql"
  url          = env("DATABASE_URL")
}

Krok 8: Sen

Po tych poprawkach aplikacja ruszyła na Vercelu bez zarzutu. W końcu mogłem się położyć spać.

Mam nadzieję, że komuś oszczędzi to nocy spędzonej nad logami.