Kostra prezentace s vlastní administrací pro Martina Reinera. Obsah: - kolekce Products (obrázky, volné parametry, cena, dostupnost, skrytí), Media se zmenšeninami, Pages, Users bez veřejné registrace - veřejná část: výpis nabídky, detail položky, statické stránky - /api/health pro Docker HEALTHCHECK Provoz: - Dockerfile, docker-compose.yml (vývoj) a docker-compose.prod.yml (nasazení z Gitea registry) - CI v Gitea Actions: lint -> testy -> build -> push image - úvodní migrace databáze Stránky jsou force-dynamic, aby se úprava položky projevila hned; schéma se za běhu nedomýšlí (push: false), migrace se commitují. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
88 lines
2.9 KiB
Markdown
88 lines
2.9 KiB
Markdown
# Zbrane-Reiner-Web
|
|
|
|
Web Martina Reinera — prodej zbraní, střeliva a doplňků. Prezentace s vlastní
|
|
administrací obsahu postavená na [Payload CMS 3](https://payloadcms.com/)
|
|
(Next.js) nad SQLite.
|
|
|
|
Návrh platformy a zdůvodnění všech rozhodnutí: [NAVRH-PLATFORMY.md](NAVRH-PLATFORMY.md).
|
|
|
|
## Rychlý start
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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](NAVRH-PLATFORMY.md#7-deploy).
|
|
|
|
```bash
|
|
# 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](NAVRH-PLATFORMY.md#8-zálohy).
|