diff --git a/README.md b/README.md index eefc450..7c53c93 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ RF4DB/RF4-STAT/RF4MAP/RF4 Posts сначала принимаются в изо На сайте у каждой записи отображается источник, а у агрегированной активности — все вошедшие в расчёт источники. Неполные community-наблюдения публикуются сразу в отдельной ленте «Полевые сигналы» с предупреждением и перечнем отсутствующих полей; до подтверждения полноты они не влияют на индекс клёва. -Базовый SEO-контур готов для `rf4spotter.ru`: страницы имеют уникальные метаданные, canonical, Open Graph/Twitter Card, фирменное изображение 1200×630 и JSON-LD; доступны динамические `/robots.txt` и `/sitemap.xml`, административные и ошибочные страницы закрыты от индексации, добавлена собственная страница 404. Индексируемые каталоги рыб и водоёмов, detail-страницы и сочетания водоём + рыба строятся из актуального разрешённого справочника и включаются в sitemap. +Базовый SEO-контур готов для `rf4spotter.ru`: страницы имеют уникальные метаданные, canonical, Open Graph/Twitter Card, фирменное изображение 1200×630 и JSON-LD; доступны динамические `/robots.txt` и `/sitemap.xml`, административные и ошибочные страницы закрыты от индексации, добавлена собственная страница 404. Индексируемые каталоги рыб и водоёмов, detail-страницы и сочетания водоём + рыба строятся из актуального разрешённого справочника и включаются в sitemap. Подключены фирменные favicon/app icons, web manifest и production-кэширование статических ресурсов. Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. diff --git a/apps/web/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png new file mode 100644 index 0000000..f6ca2bd Binary files /dev/null and b/apps/web/public/apple-touch-icon.png differ diff --git a/apps/web/public/favicon-32.png b/apps/web/public/favicon-32.png new file mode 100644 index 0000000..e90f3c9 Binary files /dev/null and b/apps/web/public/favicon-32.png differ diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg index d1a57a1..da2c1f9 100644 --- a/apps/web/public/favicon.svg +++ b/apps/web/public/favicon.svg @@ -1,6 +1,11 @@ - - - - - + + + + + + + + + + diff --git a/apps/web/public/icon-192.png b/apps/web/public/icon-192.png new file mode 100644 index 0000000..c3ac0ef Binary files /dev/null and b/apps/web/public/icon-192.png differ diff --git a/apps/web/public/icon-512.png b/apps/web/public/icon-512.png new file mode 100644 index 0000000..621f80a Binary files /dev/null and b/apps/web/public/icon-512.png differ diff --git a/apps/web/public/site.webmanifest b/apps/web/public/site.webmanifest new file mode 100644 index 0000000..c099e01 --- /dev/null +++ b/apps/web/public/site.webmanifest @@ -0,0 +1,15 @@ +{ + "name": "RF4 Spotter — Ни хвоста, ни чешуи", + "short_name": "RF4 Spotter", + "description": "Свежие точки и уловы в Russian Fishing 4 с указанием источников.", + "lang": "ru", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#f2f5ee", + "theme_color": "#082226", + "icons": [ + { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" }, + { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" } + ] +} diff --git a/apps/web/src/layouts/Layout.astro b/apps/web/src/layouts/Layout.astro index 4e98588..bb9c996 100644 --- a/apps/web/src/layouts/Layout.astro +++ b/apps/web/src/layouts/Layout.astro @@ -29,7 +29,11 @@ const jsonLd = JSON.stringify({ - + + + + + diff --git a/deploy/Caddyfile b/deploy/Caddyfile index af9b9ce..32103ba 100644 --- a/deploy/Caddyfile +++ b/deploy/Caddyfile @@ -6,6 +6,15 @@ {$SITE_DOMAIN} { encode zstd gzip + @immutable path /_astro/* + header @immutable Cache-Control "public, max-age=31536000, immutable" + + @brandAssets path /favicon.svg /favicon-32.png /apple-touch-icon.png /icon-192.png /icon-512.png /og-rf4spotter.png + header @brandAssets Cache-Control "public, max-age=86400, stale-while-revalidate=604800" + + @manifest path /site.webmanifest + header @manifest Cache-Control "public, max-age=3600" + @admin path /admin/* handle @admin { basic_auth { diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index fb5954e..7b94870 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -123,7 +123,7 @@ ### Графические элементы и объяснение данных -- [ ] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons. +- [x] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons (7 сентября 2026). - [ ] Добавить координатный радар или мини-карту на страницу точки. - [ ] Добавить временную шкалу активности 24/72 часа в рыболовной стилистике. - [ ] Добавить лёгкие силуэты видов рыб, не перегружая карточки результатов. @@ -139,7 +139,7 @@ - [x] Добавить экспоненциальный backoff community scheduler после повторных ошибок от 30 минут до 24 часов со сбросом после успеха (7 сентября 2026). - [x] Показывать на `/status` безопасное состояние источников: актуален, устарел, временно ограничен, изменился DOM, ожидает запуска или выключен (7 сентября 2026). - [ ] Добавить короткое серверное кэширование публичных GET API и проверить корректную инвалидацию после публикации. -- [ ] Настроить долгий immutable cache для хешированных assets и разумный cache для изображений/favicon. +- [x] Настроить долгий immutable cache для хешированных assets и разумный cache для изображений/favicon (7 сентября 2026). - [ ] Добавить пагинацию или «Показать ещё» для публичной ленты полевых сигналов. - [ ] Ограничить визуальные повторы одинаковых сигналов без потери provenance. - [ ] Добавить безопасный административный экспорт диагностики без персональных данных.