Payload skládá URL uploadů absolutně podle serverURL. next/image to vyhodnotí jako externí zdroj a bez images.remotePatterns odmítne s HTTP 400 "url parameter is not allowed" — samotný soubor se přitom servíruje správně, takže se to projevilo až s nahraným obrázkem. Do next/image proto posíláme jen cestu (helper cestaKSouboru). Soubor leží na stejném originu jako web, takže je to korektní, a navíc na tom nezávisí doména: remotePatterns se zapékají při buildu, ale tentýž image běží na stagingu i v produkci pod jiným jménem. 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.