Salutare tuturor. Am terminat recent un proiect destul de intens: un dashboard intern pentru o agenție locală de marketing, cu vreo 45 de oameni care îl folosesc zilnic. Am avut la dispoziție exact 3 luni și un stack clasic modern: Next.js (App Router), Prisma și NextAuth.
Vreau să vă povestesc rapid cum a fost, ce am ales bine și unde am dat cu capul de pragul de sus, ca să nu faceți aceleași greșeli.
De ce am ales stack-ul ăsta și ce a funcționat
Clientul avea nevoie să tragă date din vreo 4 API-uri de Ads (Facebook, Google, LinkedIn, TikTok), să le combine și să le arate clienților lor în rapoarte curate.
Next.js cu App Router a fost alegerea evidentă pentru că voiam Server Components ca să pre-randăm paginile de raport direct pe server. Am redus timpul de încărcare a paginii de la 6 secunde (pe vechea lor platformă în React SPA) la sub 1.5 secunde. Diferența e masivă pentru ei.
NextAuth (Auth.js) ne-a scutit de cel puțin două săptămâni de muncă. Am integrat Google OAuth în câteva ore, fiindcă toată agenția folosește Google Workspace. Am configurat regulile de acces direct în sesiune și am scăpat de bătăi de cap.
Unde ne-am fript: Problemele cu Prisma și baza de date
Prisma e excelentă pentru DX (Developer Experience). Scrii schema, rulezi migrarea și ai tipuri de TypeScript generate automat. Totul e roz până când baza de date începe să crească.
La un moment dat, am importat istoricul pe ultimul an pentru un client mai mare. Am ajuns rapid la peste 1.2 milioane de rânduri în tabela de metrici de ad-uri. Aici Prisma a început să gâfâie la interogări complexe cu multe relații (join-uri).
Trade-off-ul e destul de clar aici:
- Merge brici pentru: CRUD rapid, prototipuri, relații simple.
- E nasol pentru: Rapoarte analitice complexe și agregări pe tabele mari. Prisma generează uneori niște query-uri SQL gigantice, cu sub-selecții inutile care omoară baza de date.
Ca să salvăm situația și să menținem timpul de răspuns sub 500ms, am fost nevoit să renunț la Prisma Client pentru rapoartele mari și să scriu SQL brut (prisma.$queryRaw). Am scris vreo 4 query-uri native cu indexări manuale pe PostgreSQL și am rezolvat problema, dar am pierdut din "magia" tipizării automate.
Găzduirea și costurile: Vercel sau VPS?
La început am mers pe Vercel, fiindcă se integrează perfect cu Next.js. Totul frumos, dar când am început să rulăm cron job-urile de sync (care rulau la fiecare oră ca să tragă date din API-uri), am dat de limita de 10 secunde pe Serverless Functions pe planul Hobby, iar pe Pro riscam să sărim de buget din cauza timpului de rulare.
Am mutat totul pe un VPS de 12 dolari pe lună pe Hetzner, Dockerizat complet. Am salvat cam 80% din costurile estimate pe Vercel și am scăpat de timeout-uri. Next.js merge excelent self-hosted dacă știi să-ți configurezi un reverse proxy (Nginx) și un container Docker cum trebuie.
Ce am învățat după 3 luni
Dacă ar fi să o iau de la capăt, aș folosi tot Next.js și NextAuth, dar aș fi mult mai atent la structura bazei de date de la început. Probabil aș folosi ClickHouse pentru datele de analytics și aș lăsa Postgres doar pentru useri și setări.
Voi ce folosiți pentru dashboard-uri interne unde aveți de procesat volum mare de date? Rămâneți pe SQL clasic sau migrați spre soluții dedicate de analytics?