17.09.2026
14:30
+20
$ 84.17
97.13

НЕстолица — детальный план разработки

Домен: news.kristyasmi.beget.tech

VPS: Ubuntu, 62.113.97.14, без Docker, Nginx

Стек: Next.js (App Router) + TypeScript + Tailwind + Payload CMS 3 + PostgreSQL + systemd + Certbot

Макет: Figma, node 4161:178

Цель

Региональный медиапортал: главная 1:1 по смыслу макета (десктоп + мобайл), материалы из админки Payload, SEO, наращиваемые разделы новыми коллекциями.

Критерий MVP: редактор публикует статью в /admin → она на главной и по /news/[slug] → сайт открывается по HTTPS на домене.

Ограничения

• ~2 ГБ RAM, без swap по умолчанию. Обязательны swap 2 ГБ и NODE_OPTIONS=--max-old-space-size=768.

• В Figma есть главная, мобайл и UI kit. Страниц статьи, рубрики, поиска нет — каркас + уточнение у дизайнера.

• Node для сборки ставим отдельно (в PATH Cursor только runtime IDE без npm).

Архитектура

Клиент
  → Nginx :80 (редирект) / :443 (TLS Certbot)
    → proxy_pass http://127.0.0.1:3000   # next start (сайт + /admin)
PostgreSQL 127.0.0.1:5432  (БД nestolica)
Медиа: public/media или /var/lib/nestolica/media
systemd: nestolica.service

Новый раздел портала = коллекция или блок homepage + маршрут Next.js.

Информационная архитектура

МаршрутЭкранДанные
/Главнаяglobal homepage + posts
/news/[slug]Статьяposts
/category/[slug]Лента рубрикиcategories + posts
/searchПоискwhere по title (позже Meilisearch)
/authors/[slug]Авторauthors
/adminCMSPayload
/about, /legal/*Служебныеpages
/robots.txt, /sitemap.xmlSEONext metadata

Модель Payload

users

admin / editor. Editor: CRUD своих черновиков, publish по политике доступа.

media

upload, sizes: card, hero, thumb.

categories

title, slug, в шапке, порядок.

authors

name, slug, photo, bio.

posts

title, slug, category, author, excerpt, content (Lexical), cover, _status, publishedAt, isHero, isFeatured, isVideo.

ads

slot (hero-side, grid, footer), image, url, active.

pages

title, slug, content.

global site

logo, nav (relation categories), footer columns, socials, copyright.

global homepage

hero (relation post или ручной), sections[]: type grid \| video \| ad \| digest, title, posts/limit.

Фронт (UI kit)

Токены CSS:

• акцент красный (из макета, ориентир #E30613)

• текст #1A1A1A, вторичный серый

• фон #fff / шапка белая / футер почти чёрный

• контейнер ~1200–1280px, шапка липкая

Компоненты: Header, Footer, Hero, NewsCard (варианты из kit), NewsGrid, AdSlot, SectionTitle, VideoBlock.

Главная сверху вниз (как в макете): шапка → герой + боковые карточки → ленты → реклама → видео → ещё ленты → футер.

ISR: revalidate = 60. Хук Payload afterChange на posts → revalidatePath('/').

Этапы

Этап 0 — фундамент (этот заход)

Каркас blank + Postgres, коллекции, оболочка, черновая главная, маршруты статьи/рубрики, Nginx/systemd-заготовки, .env.example.

Этап 1 — главная по макету

Пиксельная подгонка секций, адаптив, реальные данные CMS, сид рубрик.

Этап 2 — статья и рубрика

Шаблон материала, «читайте также», лента рубрики. Ждём макет.

Этап 3 — редакция

Роли, медиа, ревалидация, чеклист публикации.

Этап 4 — прод

swap, next build, Nginx, Certbot, systemd, pg_dump cron, robots/sitemap.

Этап 5 — позже

Meilisearch, RSS, Метрика, CDN, комментарии, рассылка.

Этот заход — порядок работ

1. Swap 2 ГБ, Node.js 22 LTS + pnpm, PostgreSQL, пользователь БД.

2. create-payload-app template blank, db postgres.

3. Коллекции и глобалы, типы Payload.

4. Tailwind-токены, Header/Footer.

5. Главная на данных CMS (пустая лента допустима до сида).

6. /news/[slug], /category/[slug].

7. deploy/nginx.conf, deploy/nestolica.service, .env.example.

Вне скоупа сейчас

Figma MCP (нужен логин в Figma), Docker, Meilisearch (мало RAM), CDN.

Статус

Актуально на 17 сентября 2026. Живой сайт: https://news.kristyasmi.beget.tech/

Эта страница плана: https://news.kristyasmi.beget.tech/plan

Файл в репозитории: docs/PLAN.md

ЭтапСостояние
0. ФундаментСделано
1. Главная по макетуСделано, контент из CMS
2. Статья и рубрикаСделано (+ авторы, служебные страницы)
3. РедакцияСделано: роли, медиа, чеклист публикации, ISR
4. ПродСделано: Nginx, HTTPS, systemd. Скрипт бэкапа: deploy/backup.sh
5. ПозжеRSS, комментарии, рассылка, афиша/объявления, Метрика (номер в админке). Поиск — Postgres. Meilisearch и CDN отложены

Дальше

• Реальные фотообложки вместо цветных заглушек

• Липкая шапка, Open Graph, JSON-LD, favicon, security headers

• Разделы /articles и /podcasts

• Номер Яндекс Метрики в глобале «Сайт»

• Включить timer deploy/nestolica-backup.timer

• Макет статьи/рубрики в Figma, если появится