---
name: "Shumiland"
client: Aimpress LTD
status: active
server: aimpress
tech: [Next.js 16, Payload CMS 3, PostgreSQL 16, Docker, Traefik]
local_path: /Users/ai_leed/Documents/Projects/Shumiland
repo: https://git.ai-impress.com/Aimpress/Shumiland.git  # Forgejo
deploy: "ssh aimpress → /opt/03-business/shumiland → git pull + docker compose build + up"
url: https://shumi.ai-impress.com
tags: [shumiland, nextjs, payload-cms, docker, ukraine, children-park]
created: 2026-05-13
last_commit: 2026-05-13
port: 3000
---

# Shumiland — Сайт дитячого парку

Сайт для дитячого розважального парку «Шуміленд» (Умань, Україна).
Fullstack Next.js + Payload CMS з PostgreSQL. Деплой через Docker Compose + Traefik на сервері Aimpress.

> [!info] Production
> **URL:** https://shumi.ai-impress.com
> **Admin:** https://shumi.ai-impress.com/admin
> **Server:** `ssh aimpress` → `57.128.160.249:1220` (ubuntu)
> **App dir:** `/opt/03-business/shumiland/`

## Tech Stack

- **Frontend:** Next.js 16, React 19, TypeScript, Tailwind CSS v4
- **CMS:** Payload CMS 3 (адмін-панель, колекції, globals)
- **Database:** PostgreSQL 16 (Docker volume `shumiland-postgres-data`)
- **Media:** локальний volume `/app/media` (mapped `shumiland-media-uploads`)
- **Package manager:** pnpm 11
- **Process/deploy:** Docker Compose + Traefik (TLS через Cloudflare)
- **Fonts:** Montserrat (основний), Poppins (допоміжний)

## Architecture

```
Browser
  └── Traefik (shumi.ai-impress.com) → shumiland-app:3000
        ├── / (Next.js frontend)
        │   ├── / → Hero, Locations, Reviews, Video, WhyParents sections
        │   ├── /lokatsii → список локацій
        │   ├── /lokatsii/dyvolis → сторінка ДивоЛіс
        │   ├── /kvytky → сторінка квитків
        │   ├── /blog → блог
        │   ├── /dni-narodzhennia → дні народження
        │   └── /grupovi-vidviduvannia → групові відвідування
        └── /admin (Payload CMS)
```

## Server

| | |
|---|---|
| **SSH alias** | `ssh aimpress` |
| **IP / Port** | `57.128.160.249:1220` |
| **User** | `ubuntu` |
| **App dir** | `/opt/03-business/shumiland/` |
| **Compose file** | `docker-compose.prod.yml` |
| **Env file** | `.env.production` (на сервері, не в git) |
| **Logs** | `docker logs shumiland-app --tail=50` |
| **DB volume** | `shumiland-postgres-data` |
| **Media volume** | `shumiland-media-uploads` |

## Deployment

```bash
# 1. Локально: push змін
git push origin main

# 2. На сервері
ssh aimpress
cd /opt/03-business/shumiland

# 3. Pull нового коду
git pull origin main

# 4. Rebuild + restart (zero-downtime через Traefik)
docker compose -f docker-compose.prod.yml build app
docker compose -f docker-compose.prod.yml up -d --force-recreate app

# 5. Перевірити
docker logs shumiland-app --tail=20
```

> [!warning] git branch
> Локально — гілка `main`. На сервері — перемкнуто на `main` (раніше було `master`).
> Завжди `git pull origin main`.

## Environment Variables (.env.production на сервері)

| Variable | Value |
|---|---|
| `DATABASE_URL` | `postgresql://shumiland:***@shumiland-postgres:5432/shumiland` |
| `PAYLOAD_SECRET` | (у файлі на сервері) |
| `NEXT_PUBLIC_SITE_URL` | `https://shumi.ai-impress.com` |
| `NODE_ENV` | `production` |

> [!tip] Credentials
> Детальні креди — в `[[Credentials]]` (не в iCloud).

## Key Files

| File/Dir | Purpose |
|---|---|
| `src/app/(frontend)/` | Усі frontend-сторінки |
| `src/components/sections/` | Секції (Hero, Gallery, WhyParents, VideoSection, DyvoLis…) |
| `src/components/ui/` | UI-компоненти (BtnPrimary, AccordionItem, Container…) |
| `src/components/layout/` | Header, Footer |
| `src/collections/` | Payload CMS колекції |
| `public/images/` | Статичні зображення |
| `docker-compose.prod.yml` | Продакшн Docker Compose |
| `.env.production` | Змінні середовища (лише на сервері) |

## Useful Commands

```bash
# SSH
ssh aimpress

# Переглянути статус контейнерів
docker ps --filter name=shumiland

# Логи
docker logs shumiland-app --tail=50 -f

# DB backup вручну
docker exec shumiland-postgres pg_dump -U shumiland shumiland | gzip > backup.sql.gz

# Зайти в контейнер
docker exec -it shumiland-app sh

# Payload migrations (з контейнера)
pnpm payload migrate
```

## Pages

| Page                 | URL                      |
| -------------------- | ------------------------ |
| Головна              | `/`                      |
| Локації (список)     | `/lokatsii`              |
| ДивоЛіс              | `/lokatsii/dyvolis`      |
| Квитки               | `/kvytky`                |
| Блог                 | `/blog`                  |
| Дні народження       | `/dni-narodzhennia`      |
| Групові відвідування | `/grupovi-vidviduvannia` |
| Admin CMS            | `/admin`                 |

## Integration: ezy.com.ua (Білетна каса)

Деталі інтеграції — в `[[Шумиленд касса]]`.

- **Activity key:** `fda5a0acfe1dad42867ea88dbe13008a10c391f2`
- **Partner key:** у `~/.secrets/Credentials.md`
- **Endpoint тарифів:** `GET https://www.ezy.com.ua/ipay/default/get-partner-tariff?activity=...`
- **Endpoint оплати:** `POST https://www.ezy.com.ua/ipay/pay/partner-pay`
- **Редирект:** на url з відповіді (Monobank)


##  Binotel widget

```js
<script type="text/javascript">
  (function(d, w, s) {
	var widgetHash = 'fgfz5owkoc9rxip2brp2', gcw = d.createElement(s); gcw.type = 'text/javascript'; gcw.async = true;
	gcw.src = '//widgets.binotel.com/getcall/widgets/'+ widgetHash +'.js';
	var sn = d.getElementsByTagName(s)[0]; sn.parentNode.insertBefore(gcw, sn);
  })(document, window, 'script');
</script> 
```

---

## Sessions

### 2026-05-13 — Nav dropdown fix + location page buttons
**Asked:** Дропдаун в навігації зникає при наведенні на список; немає кнопки переходу на сторінку локації.
**Done:**
- HeaderClient: прибрав `mt-2` gap між nav-пунктом і дропдауном, обернув у `pt-2` wrapper — тепер hover не переривається при переміщенні миші
- lokatsii page: додав кнопку "Детальніше" для локацій з власною сторінкою (наразі тільки ДивоЛіс)
- Locations.tsx + Header.tsx: dyvolis href змінено з `/lokatsii#dyvolis` → `/lokatsii/dyvolis`
- Push + rebuild + force-recreate на aimpress

### 2026-05-13 — DyvoLis page + first deploy
**Asked:** Реалізувати сторінку ДивоЛіс по двом Figma-дизайнам, запушити в git і задеплоїти на aimpress.
**Done:**
- Завантажив дизайн через Figma MCP (ноди 3:77 та 4:205)
- Скачав Figma-ассети до `public/images/dyvolis/` (hero-cat.png, gallery-1–4.jpg, video-thumb.jpg)
- Створив секції: `DyvoLisHero`, `DyvoLisGallery`, `DyvoLisWhyVisit`, `DyvoLisTickets`
- Нова сторінка `/lokatsii/dyvolis`
- Нода 4:205 (BtnPrimary) — вже існувала в проекті, покрита
- Фікс `.gitignore`: `*.png/jpg/jpeg` → `/*.png/jpg/jpeg` (root-only)
- Push на `main`, git pull на aimpress, `docker compose build + up --force-recreate`
- Сервер: `ssh aimpress` → `/opt/03-business/shumiland/`

### 2026-05-13 — DyvoLis ticket order + working hours
**Asked:** Виставити перший квиток "Диво Ліс 250 грн" на сторінці ДивоЛіс; поправити графік роботи щодня з 11:00 до 20:00.
**Done:**
- `DyvoLisTickets.tsx`: додано `{ label: 'Диво Ліс', price: '250 грн', per: 'за 1 людину' }` першим у `SINGLE_TICKETS`
- Банер "Час роботи": `п'ятниця–субота–неділя` → `щодня з 11:00 до 20:00`
- Push origin main → git pull на aimpress → docker compose build + up --force-recreate

### 2026-05-13 — DyvoLis visual overhaul
**Asked:** Змінити фон на #f1fbeb (як на головній), пікселопорівняти хіро, зробити 3D слайдер галереї, секцію "Чому відвідати" як WhyParents, карточки квитків компактніше з кнопкою внизу.
**Done:**
- Всі фони #fdf2e8 → #f1fbeb
- Hero: виправлено border значок "Х", додано декоративне помаранчеве свічення за котом
- DyvoLisGallery: переписано на 3D coverflow carousel (auto-rotate 3.5s, стрілки, dots)
- DyvoLisWhyVisit: переписано за шаблоном WhyParents (auto-rotate accordion 4s + RAF scroll gallery)
- DyvoLisTickets: компактніше (менші шрифти/padding), кнопка `mt-auto` — завжди внизу карточки
- Push + rebuild + force-recreate на aimpress

---

## Change Log

| Date | Changed |
|---|---|
| 2026-05-13 | DyvoLis location page: Hero, Gallery, WhyVisit, Tickets sections; fix .gitignore |
| 2026-05-13 | Nav dropdown hover fix (pt-2 bridge); "Детальніше" button on lokatsii page; dyvolis href fixes |
| 2026-05-13 | DyvoLis: "Диво Ліс 250 грн" перший квиток; графік "щодня з 11:00 до 20:00" |
| 2026-05-13 | DyvoLis visual overhaul: bg #f1fbeb, 3D coverflow gallery, WhyParents-style section, compact tickets |
