Produkční web kosmetického studia s veřejnou prezentací, rezervačním flow a odděleným admin rozhraním pro role OWNER a SALON.
README slouží jako rychlý GitHub rozcestník. Detailní provozní a vývojová dokumentace je vedená přímo v repozitáři v MANUAL.md a docs/*, ne jako primární GitHub Wiki.
- veřejný web: homepage, služby, detail služby, ceník, studio, o mně, kontakt, FAQ a právní stránky
- rezervační flow na
/rezervacenad ručně publikovanými sloty - self-service správa rezervace přes veřejné tokenové routy pro změnu termínu a storno
- admin pro owner i provoz se sekcemi rezervací, volných termínů, služeb, kategorií, klientů, médií, voucherů a nastavení
- evidence plateb rezervací, voucher lifecycle, PDF voucher a ruční e-mailové odeslání voucheru
- e-mailová fronta, auditní historie rezervací, owner
.icscalendar feed a volitelný Matomo reporting pro dashboard
- Tohle není "běžný Next.js projekt". Před změnou App Routeru nebo framework API si ověř relevantní guide v
node_modules/next/dist/docs/. - Route soubory mají zůstat tenké; business logika patří do
src/features, infrastruktura dosrc/lib. - Veřejné texty a část brand copy jsou v
src/content/public-site.ts, ale katalog služeb, pricing metadata a část veřejného obsahu už bere data z DB read modelů. - Dokumentace se udržuje v repu společně s kódem; GitHub Wiki není v tomhle projektu zdroj pravdy.
- Next.js 16 App Router
- React 19 + TypeScript
- Tailwind CSS 4
- Prisma 7 + PostgreSQL
- Zod validace na serveru
- Nodemailer pro e-mailový worker
- Playwright + Node test runner
- Matomo Reporting API
src/
app/
(public)/ veřejný web
(booking)/ booking a veřejné tokenové akce
(admin)/admin/ admin vstup a chráněné sekce
api/ auth, kalendáře a pomocné endpointy
media/ servírování uložených médií
components/
layout/ sdílené layouty
ui/ malé znovupoužitelné UI prvky
config/ metadata, navigace, env
content/ editovatelný obsah veřejného webu
features/
admin/ admin workflow, formuláře a read modely
booking/ booking flow a booking business logika
calendar/ kalendářové exporty
home/ homepage sekce
media/ media knihovna a upload workflow
public/ veřejné stránky nad DB read modely
lib/ infrastructura, Prisma, auth, utility
prisma/
schema.prisma datový model
prisma.config.ts Prisma 7 CLI konfigurace
docs/
ADR/ architektonická rozhodnutí
/veřejná homepage/sluzby,/sluzby/[slug],/cenik,/studio,/o-mne,/kontakt,/faq/rezervacebooking flow/rezervace/sprava/[token]veřejná správa rezervace/rezervace/storno/[token]veřejné storno/rezervace/akce/[intent]/[token]potvrzovací akce z provozních e-mailů/vouchery/overeni?code=...veřejné read-only ověření voucheru/admin/prihlaseniadmin login/admin/*owner admin/admin/provoz/*lite admin pro roliSALON/api/calendar/owner.ics?token=...owner calendar feed
Admin používá podepsanou httpOnly session cookie přes jose, serverový login handler a role OWNER / SALON.
/admin/*je plný owner backoffice/admin/provoz/*je zjednodušené provozní rozhraní- bootstrap přístupy lze stále nastavit přes env, ale projekt už počítá i s databázovými admin účty a pozvánkami
Projekt už pokrývá hlavní provozní entity:
AdminUserServiceCategoryServiceServicePriceChangeLogAvailabilitySlotClientBookingBookingPaymentBookingStatusHistoryBookingActionTokenBookingSubmissionLogVoucherVoucherRedemptionEmailLogSiteSettingsMediaAsset
- Node.js 20+
- npm 10+
- PostgreSQL 15+
- lokální přístup k zapisovatelnému adresáři pro
MEDIA_STORAGE_ROOT
npm install
cp .env.example .env
npm run db:generate
npm run db:migrate
npm run devVývoj běží standardně na http://localhost:3000.
Praktický postup:
- Naklonuj repozitář a přejdi do rootu projektu.
- Vytvoř lokální
.envz.env.example. - Uprav minimálně
DATABASE_URL,SHADOW_DATABASE_URL,ADMIN_SESSION_SECRETa lokálníNEXT_PUBLIC_APP_URL. - Připrav PostgreSQL databázi pro hlavní i shadow DB.
- Spusť
npm install. - Spusť
npm run db:generate. - Spusť
npm run db:migratepro lokální Prisma migrace. - Spusť
npm run dev. - Otevři
http://localhost:3000.
- admin login je na
/admin/prihlaseni - bootstrap přístupy přes
ADMIN_OWNER_*aADMIN_STAFF_*fungují jen přiADMIN_BOOTSTRAP_ENABLED=true - po prvním založení nebo opravě databázových admin účtů vrať
ADMIN_BOOTSTRAP_ENABLED=false
- pro bezpečný lokální vývoj je praktičtější
EMAIL_DELIVERY_MODE=log - veřejný Matomo tracking nech ve vývoji vypnutý, dokud opravdu netestuješ analytics flow
- pokud potřebuješ ověřit dashboard reporting, použij
npm run analytics:check
Když dev server spadne na poškozenou Next/Turbopack cache, pomůže:
npm run dev:cleannpm run devspustí vývojový servernpm run buildvytvoří produkční buildnpm run startspustí produkční servernpm run lintspustí ESLintnpm run testspustí integrační testy nad Node test runneremnpm run test:e2espustí Playwright E2E testynpm run analytics:checkověří server-side Matomo reportingnpm run test:db:bookingspustí booking DB integrační testynpm run db:generatevygeneruje Prisma Clientnpm run db:migratespustíprisma migrate devnpm run db:check-migrationszkontroluje historii migracínpm run db:pushsynchronizuje schema bez migracínpm run db:studiootevře Prisma Studionpm run db:import-servicesimportuje katalog služebnpm run db:backfill-service-copyprovede backfill strukturovaných textů služeb (nejdřív používej-- --dry-run, teprve potom-- --confirm)npm run db:clear-booking-datavypíše počty booking/slot dat a s-- --confirmje smaže bez zásahu do služeb, admin účtů a settingsnpm run email:workerspustí e-mailový workernpm run email:worker:oncejednorázově zpracuje frontu e-mailůnpm run email:previewsvygeneruje lokální HTML náhledy e-mailových šablon dotmp/email-previews
Pro produkci používej Prisma deploy flow přes npx prisma migrate deploy. Lokální npm run db:migrate je určené pro vývoj.
Zkrácený příklad pro lokální vývoj:
NODE_ENV=development
NEXT_PUBLIC_APP_NAME=PP Studio
NEXT_PUBLIC_APP_URL=http://localhost:3000
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/ppstudio?schema=public"
SHADOW_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/ppstudio_shadow?schema=public"
ADMIN_SESSION_SECRET=replace-with-long-random-secret-at-least-32-chars
ADMIN_BOOTSTRAP_ENABLED=true
ADMIN_OWNER_EMAIL=owner@example.com
ADMIN_OWNER_PASSWORD=change-me-owner
ADMIN_STAFF_EMAIL=staff@example.com
ADMIN_STAFF_PASSWORD=change-me-staff
EMAIL_DELIVERY_MODE=log
MEDIA_STORAGE_ROOT=/var/www/ppstudio-uploadsCo je důležité:
NEXT_PUBLIC_APP_URL: veřejný základ URL pro metadata, redirecty a odkazy v e-mailechDATABASE_URL: hlavní PostgreSQL databáze aplikaceSHADOW_DATABASE_URL: pomocná DB proprisma migrate devv lokálním vývojiADMIN_SESSION_SECRET: tajný klíč pro podpis admin session cookie; v produkci musí být dlouhý a unikátníADMIN_BOOTSTRAP_ENABLED: nouzový přepínač bootstrap loginu; v produkci má být běžněfalseEMAIL_DELIVERY_MODE=log: bezpečný lokální režim bez reálného SMTP odesíláníMEDIA_STORAGE_ROOT: absolutní cesta mimo repo, kam se ukládají nahraná média
Plný seznam proměnných a detailní vysvětlení je v docs/ENVIRONMENT.md.
MANUAL.md: provozní a uživatelský přehled projektudocs/DEVELOPMENT.md: technické konvence, architektura a workflowdocs/ENVIRONMENT.md: env proměnnédocs/DEPLOYMENT.md: release a produkční nasazenídocs/DEPENDENCIES.md: přehled hlavních závislostídocs/INCIDENTS.md: provozní incidenty a troubleshootingdocs/ADR/*: architektonická rozhodnutí
- Na serveru měj čistý checkout repozitáře a správně nastavené
.env. - Ověř PostgreSQL připojení, SMTP konfiguraci,
MEDIA_STORAGE_ROOTaADMIN_BOOTSTRAP_ENABLED=false. - Spusť
./deploy/release.sh. - Skript provede
git pull --ff-only,npm ci,npm run db:generate,npm run db:check-migrations,npx prisma migrate deploy,npm run lint,npm run builda restartppstudio-web/ppstudio-email-worker. - Po releasu ověř
GET /api/health, admin login, veřejnou homepage a testovací rezervaci.
docs/DEPLOYMENT.mdobsahuje plný release checklist a ruční QAMANUAL.mdshrnuje provozní rollout z pohledu údržbydocs/ENVIRONMENT.mdrozepisuje produkční env proměnné
Projekt už má připravené stavební bloky pro základní provozní dohled:
GET /api/healthvrací agregovaný stav webu, DB a e-mailové frontynpm run analytics:checkověří server-side Matomo reportingppstudio-web.serviceappstudio-email-worker.servicemají být pod systemd- admin dashboard umí ukázat provozní a analytické varování, ale není náhradou externího monitoringu
Doporučené minimum:
- Externí HTTP check na
/api/healths alarmem na HTTP503nebo timeout. - Kontrola běhu obou systemd služeb.
- Alert na růst
failed/retrying/stalee-mailů. - Základní release SLA: po deployi ověřit homepage, admin login a vytvoření testovací rezervace.
Pokud chcete mít v repu přímo popsaný provozní standard, navazující detaily jsou v docs/DEPLOYMENT.md, docs/INCIDENTS.md a MANUAL.md.
Při každé významné změně udržuj aktuální:
MANUAL.mdCHANGELOG.mddocs/DEVELOPMENT.mddocs/ADR/*docs/ENVIRONMENT.mddocs/DEPLOYMENT.mddocs/INCIDENTS.mddocs/DEPENDENCIES.md
Nejdůležitější doprovodné dokumenty:
MANUAL.mdpro provozní a uživatelský přehleddocs/DEVELOPMENT.mdpro detailní technické konvencedocs/ENVIRONMENT.mdpro env proměnnédocs/DEPLOYMENT.mdpro nasazení
- commit message piš česky
- pro jednotný styl je připravená šablona
.gitmessage-cz.txt