Dmitry Gusev 2a539705e7
All checks were successful
deploy / deploy (push) Successful in 1m5s
security / security (push) Successful in 2m42s
fix(security): npm audit fix + GitLeaks allowlist for indexnow.js
- npm audit fix: устранены 5 vulnerabilities (где возможно без --force):
  - path-to-regexp <0.1.13 (ReDoS, HIGH)
  - nodemailer 6.x patch
  - qs 6.7.x DoS (transitively через body-parser + express)

- .gitleaks.toml: расширен allowlist для scripts/indexnow.js* и
  scripts/indexnow-ping.sh — содержат публичный IndexNow KEY, не секрет.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 19:11:10 +03:00

anotherreflections.ru — v2

Главный сайт-портал ролевой группы «Иные Отражения» — переделан со старого WordPress (тема darkness-10) на статический Astro 5.

Стек

  • Astro 5 + Content Collections (markdown)
  • @astrojs/rss — RSS-фиды (общий + per-category), формат под IPB RSS Importer
  • @astrojs/sitemap — sitemap.xml автоматически
  • sanitize-html — очистка HTML тела поста для <content:encoded> в RSS

Содержимое

  • src/content/posts/*.md — 50 постов 20092015, мигрированы из WP (frontmatter включает legacyId для трассировки и categorySlugs для категорий)
  • src/content/pages/*.md — 6 страниц: /o-nas/, /nashi-druzya/, страницы про игры
  • src/content/_categories.json — справочник категорий из WP (10 шт.)
  • _wp-export.json — исходный дамп WP, оставлен в репо для трассируемости миграции; не используется в build

Структура URL

  • / — главная (лента всех постов)
  • /<slug>/ — пост или статическая страница
  • /category/<slug>/ — лента категории
  • /feed.xml — общий RSS
  • /category/<slug>/feed.xml — RSS категории
  • /sitemap-index.xml — sitemap

URL постов совпадают с историческими WP-slug, т.к. permalink_structure='/%postname%/'. Никаких 301-редиректов не требуется — slug сохранены 1:1.

RSS для IPB Importer

Фид заточен под ACP → Community → RSS Feeds → Add Feed:

  • RSS 2.0 strict, <pubDate> в RFC-822, абсолютные <link>
  • <guid isPermaLink="true"> = URL поста — IPB по нему дедуплицирует темы при повторных сканах
  • <content:encoded> с CDATA — полное HTML тело поста, IPB подставит его в тело темы
  • <lastBuildDate> обновляется при каждом build — Importer проверяет, изменился ли фид
  • Cutoff: фид отдаёт только посты с pubDate >= RSS_CUTOFF (см. src/consts.ts). Архив 20092015 остаётся на сайте для людей, но в форумы не вбрасывается одной волной.

Разработка

npm install
npm run dev     # http://localhost:4321
npm run build   # → dist/
npm run preview

Миграция (одноразово, уже выполнено)

npm run migrate  # _wp-export.json → src/content/{posts,pages}/*.md

Скрипт scripts/migrate-wp.mjs конвертирует HTML тела постов в markdown (минимальный конвертер без внешних зависимостей: <a>/<strong>/<em>/<li>/<ul>/<blockquote>/<br>/<p> + HTML entities).

Деплой

Контейнер nginx:alpine на web.hhivp.com, шаблон по образцу stbolshevik.ru (CI/CD: Gitea → SSH-деплой на свободный порт). См. CLAUDE.md после первого деплоя.

История

  • v1: WordPress 6.9 + тема darkness-10 + 23 активных плагина, БД anotherreflctions_ru (sic) на db.hhivp.com, контейнер anotherreflections-ru:4080 на web.hhivp.com. Репо: git.striker.su/striker/anotherreflections-website (ветка feat/dockerize). Оставлен для отката.
  • v2 (этот репо): Astro 5 static, 2026-05-20.
Description
anotherreflections.ru v2 � Astro 5 static site (markdown + RSS for IPB importer)
Readme 578 KiB
Languages
Astro 41.9%
CSS 23.5%
JavaScript 18.4%
TypeScript 15.2%
Dockerfile 1%