4.7 KiB
4.7 KiB
pushkinohistory.ru — Vite+React v2
Сайт «История города Пушкино». Редизайн с WordPress (v1, контейнер pushkinohistory-ru:4143) на статический Vite+React+Tailwind (контейнер pushkinohistory-ru-v2:4146).
Стек
- Vite 6 + React 18 + Tailwind 3
- PT Serif (заголовки/основной текст) + IBM Plex Sans (UI)
- Express 4 + compression (runtime сервер, отдаёт prerendered HTML +
/api/news.json+/feed/) - Puppeteer для prerender (chromium в build-стадии)
- fast-xml-parser для агрегатора внешних RSS
Структура
src/
App.jsx # клиентский роутер (window.history + popstate), 301-карта oldSlug → newSlug
components/ # Header, Sidebar, Footer, PostCard
content/ # JSON-контент: posts, pages, partners, ads, transport, feeds
pages/ # Home, Post, Page, Category, News, NotFound
server/index.js # Express: /api/health, /api/news.json, /uploads/, /feed/, статика
scripts/
convert_posts.py # WP DB → src/content/{posts,pages}.json
build-rss.js # генератор IPB-совместимого RSS (full content в CDATA)
build-sitemap.js # sitemap.xml + robots.txt
build-slugs.js # routes.json для prerender
prerender.js # SPA → статичные HTML по маршрутам через puppeteer
pull-external-rss.js # cron: внешние RSS → data/news.json (агрегатор)
public/uploads/ # картинки, перенесены из WP /wp-content/uploads/
nginx/ # vhost для прода (симлинк из /etc/nginx/conf.d/)
Контент
Скрейп из WP DB (pushkinohistory_ru на db.hhivp.com):
- 7 постов + 4 страницы
- 6 картинок в
public/uploads/ - URL-encoded кириллические slugs WP → транслитерированы (
/segodnya-nochyu-rossiyane-uvidyat-pervoe/); старые URL → 301 черезnginx/map
RSS
- Свой
/feed/— IPB-совместимый RSS 2.0 с полным HTML в<content:encoded>, стабильными<guid isPermaLink>,<dc:creator>, категориями. Для импорта вforum.pushkinohistory.ru. - Внешние фиды —
src/content/feeds.json(список URL), парсятся cron-скриптомscripts/pull-external-rss.js→data/news.json(bind-mount), фронт читает client-side через/api/news.json. Каждое добавление источника = редактированиеfeeds.json+ push.
Деплой
# Локально:
cd E:\Projects\pushkinohistory-ru-v2
git add . && git commit -m "..." && git push
# На web.hhivp.com:
ssh striker@web.hhivp.com
cd /opt/docker/sites/pushkinohistory-ru-v2
git pull && docker compose up -d --build
CI/CD автоматизация — Gitea Actions с SSH-deploy (см. .gitea/workflows/deploy.yml).
Контейнер
- Image:
pushkinohistory-ru-v2:latest(мультистейдж: builder с puppeteer/chromium → runtime node:22-alpine + express) - Порт:
127.0.0.1:4146 - Bind-mounts:
/opt/www/pushkinohistory.ru/uploads-v2 → /app/public/uploads (ro)— динамические uploads/opt/docker/sites/pushkinohistory-ru-v2/data → /app/data (ro)—news.jsonот cron
- nginx vhost:
/etc/nginx/conf.d/pushkinohistory.ru→ симлинк наnginx/pushkinohistory.ru.confв этом репо
Откат на WP v1
Старый WP в /opt/docker/sites/pushkinohistory-ru/ (контейнер pushkinohistory-ru:4143) сохранён. Чтобы откатиться:
ssh striker@web.hhivp.com
sudo ln -sfn /opt/docker/sites/pushkinohistory-ru/nginx/pushkinohistory.ru.conf /etc/nginx/conf.d/pushkinohistory.ru
sudo nginx -t && sudo systemctl reload nginx
БД (WP, v1)
DB на db.hhivp.com (45.10.53.205), pushkinohistory_ru/u_pushhist, prefix ph_. Не удалять — нужна для отката и как источник для повторного скрейпа.
Форум
forum.pushkinohistory.ru — IPB 4.x в отдельном контейнере forum-pushkinohistory-ru:4144. v2 редизайном не затронут.
История
- 2026-05-08: v1 контейнеризован, миграция со str-u-01 на web.hhivp.com
- 2026-05-14: фикс trust-proxy.conf для Docker bridges (Better WP Security)
- 2026-05-21: v2 редизайн — Vite+React+Tailwind, отказ от WP, RSS-агрегатор внешних фидов + свой RSS для IPB