Menu bylo napsané natvrdo a odkazovalo na /kontakt bez ohledu na to, jestli stránka s tím slugem existuje — odtud 404. Stránky založené v administraci se naopak neobjevily nikde. Hlavička teď vypisuje stránky z kolekce, řazené podle názvu. Layout kvůli tomu musí být force-dynamic, jinak by se při buildu předgenerovala stránka 404, která tenhle layout používá taky, a build by sáhl do databáze. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zbrane-Reiner-Web
Web Martina Reinera — prodej zbraní, střeliva a doplňků. Prezentace s vlastní administrací obsahu postavená na Payload CMS 3 (Next.js) nad SQLite.
Návrh platformy a zdůvodnění všech rozhodnutí: NAVRH-PLATFORMY.md.
Rychlý start
cp .env.example .env # vyplň PAYLOAD_SECRET
pnpm install
pnpm payload migrate # založí databázi v data/
pnpm dev # http://localhost:3000
První účet se založí sám při prvním otevření /admin.
Node se v repu nepředpokládá nainstalovaný globálně — pokud ho nemáš, jde všechno pustit v kontejneru:
docker run --rm -it -v "$PWD:/app" -w /app -p 3000:3000 node:22-alpine sh
Struktura
src/
├─ collections/ # schéma obsahu — Products, Media, Pages, Users
├─ app/(frontend)/ # veřejný web
│ ├─ page.tsx # výpis nabídky
│ ├─ nabidka/[slug]/ # detail položky
│ ├─ [slug]/ # statické stránky z kolekce Pages
│ └─ api/health/ # endpoint pro Docker HEALTHCHECK
├─ app/(payload)/ # administrace, generuje Payload
├─ lib/format.ts # formátování ceny a stavu
└─ payload.config.ts
migrations/ # verzované DB migrace, commitují se
Příkazy
| Příkaz | Co dělá |
|---|---|
pnpm dev |
vývojový server s hot-reloadem |
pnpm lint |
ESLint nad src a tests |
pnpm test |
integrační testy (vitest) |
pnpm build |
produkční build, uvnitř i kontrola typů |
pnpm generate:types |
přegeneruje src/payload-types.ts ze schématu |
pnpm payload migrate:create <nazev> |
vytvoří migraci po změně schématu |
pnpm payload migrate |
přehraje migrace |
Změna schématu obsahu
Schéma se nedomýšlí za běhu (push: false) — po každé úpravě kolekce:
pnpm generate:types
pnpm payload migrate:create nazev-zmeny
pnpm payload migrate
Migraci commitni. V produkci se přehraje sama při startu kontejneru. Výjimkou jsou testy, kde se schéma odvodí z konfigurace, takže každý běh startuje nad prázdnou databází.
Nasazení
CI (Gitea Actions) postaví image a nahraje ho do Gitea registry; server si ho jen stáhne. Celý postup včetně větví, tagů a rollbacku je v NAVRH-PLATFORMY.md, sekce 7.
# na serveru
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
| Větev | Prostředí | Tag image | Port |
|---|---|---|---|
release |
produkce | latest |
3000 |
devel |
staging | devel |
3001 |
Data a zálohy
Veškerý stav jsou dva adresáře — data/ (SQLite) a media/ (nahrané
obrázky), v produkci Docker volumes. Databáze je jediná kopie obsahu,
v gitu není. Zálohování viz NAVRH-PLATFORMY.md, sekce 8.