feat: complete brand icon and static caching
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s

This commit is contained in:
ik
2026-09-07 16:59:44 +07:00
parent 486016d977
commit 3529b6a1c8
10 changed files with 42 additions and 9 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ RF4DB/RF4-STAT/RF4MAP/RF4 Posts сначала принимаются в изо
На сайте у каждой записи отображается источник, а у агрегированной активности — все вошедшие в расчёт источники. Неполные community-наблюдения публикуются сразу в отдельной ленте «Полевые сигналы» с предупреждением и перечнем отсутствующих полей; до подтверждения полноты они не влияют на индекс клёва. На сайте у каждой записи отображается источник, а у агрегированной активности — все вошедшие в расчёт источники. Неполные 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. Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL.
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+10 -5
View File
@@ -1,6 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<rect width="32" height="32" rx="9" fill="#082226"/> <rect width="64" height="64" rx="16" fill="#082226"/>
<path d="M7 16c3.2-4.2 7-6 11.1-4.2 2 .9 3.5 2.4 4.9 4.2-1.4 1.8-2.9 3.3-4.9 4.2C14 22 10.2 20.2 7 16Z" fill="#c9f45b"/> <g stroke="#295158" stroke-width="1" opacity=".7">
<circle cx="19" cy="14.5" r="1.1" fill="#082226"/> <path d="M16 8v48M32 8v48M48 8v48M8 16h48M8 32h48M8 48h48"/>
<path d="m8 16-3.5-3.5v7L8 16Z" fill="#c9f45b"/> </g>
<path d="M11 46c8-5 14 5 22 0s14 5 21 0" fill="none" stroke="#6fc3c4" stroke-width="2.5" stroke-linecap="round"/>
<path d="M37 8v21" stroke="#f4efe2" stroke-width="3" stroke-linecap="round"/>
<path d="M32 17h10l-2 12h-6Z" fill="#c9f45b"/>
<path d="M37 29v13c0 9-13 11-15 2-1-5 3-8 7-7" fill="none" stroke="#c9f45b" stroke-width="4" stroke-linecap="round"/>
<circle cx="37" cy="13" r="2.5" fill="#ff785a"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

+15
View File
@@ -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" }
]
}
+5 -1
View File
@@ -29,7 +29,11 @@ const jsonLd = JSON.stringify({
<meta name="description" content={description} /> <meta name="description" content={description} />
<meta name="robots" content={preventIndexing ? "noindex, nofollow" : "index, follow, max-image-preview:large"} /> <meta name="robots" content={preventIndexing ? "noindex, nofollow" : "index, follow, max-image-preview:large"} />
<link rel="canonical" href={canonical} /> <link rel="canonical" href={canonical} />
<link rel="icon" href="/favicon.svg" /> <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<link rel="icon" href="/favicon-32.png" sizes="32x32" type="image/png" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
<meta name="theme-color" content="#082226" />
<meta property="og:locale" content="ru_RU" /> <meta property="og:locale" content="ru_RU" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:site_name" content="RF4 Spotter" /> <meta property="og:site_name" content="RF4 Spotter" />
+9
View File
@@ -6,6 +6,15 @@
{$SITE_DOMAIN} { {$SITE_DOMAIN} {
encode zstd gzip 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/* @admin path /admin/*
handle @admin { handle @admin {
basic_auth { basic_auth {
+2 -2
View File
@@ -123,7 +123,7 @@
### Графические элементы и объяснение данных ### Графические элементы и объяснение данных
- [ ] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons. - [x] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons (7 сентября 2026).
- [ ] Добавить координатный радар или мини-карту на страницу точки. - [ ] Добавить координатный радар или мини-карту на страницу точки.
- [ ] Добавить временную шкалу активности 24/72 часа в рыболовной стилистике. - [ ] Добавить временную шкалу активности 24/72 часа в рыболовной стилистике.
- [ ] Добавить лёгкие силуэты видов рыб, не перегружая карточки результатов. - [ ] Добавить лёгкие силуэты видов рыб, не перегружая карточки результатов.
@@ -139,7 +139,7 @@
- [x] Добавить экспоненциальный backoff community scheduler после повторных ошибок от 30 минут до 24 часов со сбросом после успеха (7 сентября 2026). - [x] Добавить экспоненциальный backoff community scheduler после повторных ошибок от 30 минут до 24 часов со сбросом после успеха (7 сентября 2026).
- [x] Показывать на `/status` безопасное состояние источников: актуален, устарел, временно ограничен, изменился DOM, ожидает запуска или выключен (7 сентября 2026). - [x] Показывать на `/status` безопасное состояние источников: актуален, устарел, временно ограничен, изменился DOM, ожидает запуска или выключен (7 сентября 2026).
- [ ] Добавить короткое серверное кэширование публичных GET API и проверить корректную инвалидацию после публикации. - [ ] Добавить короткое серверное кэширование публичных GET API и проверить корректную инвалидацию после публикации.
- [ ] Настроить долгий immutable cache для хешированных assets и разумный cache для изображений/favicon. - [x] Настроить долгий immutable cache для хешированных assets и разумный cache для изображений/favicon (7 сентября 2026).
- [ ] Добавить пагинацию или «Показать ещё» для публичной ленты полевых сигналов. - [ ] Добавить пагинацию или «Показать ещё» для публичной ленты полевых сигналов.
- [ ] Ограничить визуальные повторы одинаковых сигналов без потери provenance. - [ ] Ограничить визуальные повторы одинаковых сигналов без потери provenance.
- [ ] Добавить безопасный административный экспорт диагностики без персональных данных. - [ ] Добавить безопасный административный экспорт диагностики без персональных данных.