Maps & GeoПремиум

ЕстьБЕНЗ - народная карта наличия топлива

Live-карта топлива на АЗС России: народные отметки «есть / нет», очередь, цены и SEO-каталог станций.

~90 минСложныйREADME
Next.jsTypeScriptPostgreSQLPostGISPrismaRedisPWApnpm

Ценность

Вайбкодинг

80 ч

Строк кода

87 000+

Аналог у студии

от 450 000 ₽

Экономия на токенах

≈ 20 000 ₽

Инструкция из репозитория

ЕстьБЕНЗ (estbenz.ru)

Народная live-карта наличия топлива на АЗС России: водители отмечают «есть» / «нет» / очередь, сервис показывает свежие статусы на карте и в SEO-каталоге.

Версия: 0.1.0 · Package manager: pnpm · Репозиторий: приватный (клон по SSH выдает владелец)


Оглавление


Возможности

ПоверхностьОписание
Карта АЗСMapLibre GL, кластеры, фильтры топлива/бренда/свежести, геолокация
Отметки водителейСтатусы наличия топлива, очереди, платежные сигналы
Карточка АЗСДетали станции, цены, шаринг, подтверждения
SEO-каталогРегионы, города, сети, типы топлива, рейтинги
НовостиСбор RSS + AI-обработка (OpenRouter), публикация, Telegram-топики
РекламаБаннеры, товарные карточки, метки на карте, Яндекс РСЯ
ПромоКаналы MAX / Telegram / VK, баннеры, нижняя полоска, CTA поддержки
PWASerwist service worker, installable
ВиджетВстраиваемая карта (/widget)
ГеймификацияГонки «Дуэль на трассе», WS-сервер
Импорт данныхOSM, 2GIS, gdebenz.ru (Tor), T-Bank Toplivo, RN-Card, Benzup
AuthВход по коду из email; MAX mini-app

Модули (src/modules/)

МодульНазначение
stationsCRUD/запросы станций
status-engineАгрегация статусов отметок
confirmationsПодтверждения «есть/нет»
brandsСети АЗС и логотипы
station-importИмпорт OSM / 2GIS
station-verificationВерификация названий (2GIS)
gdebenz-importИмпорт отметок через Tor
tbank-toplivo-importИмпорт T-Bank Toplivo через Tor
fuel-pricesРозничные цены (Benzup и др.)
newsСбор и модерация новостей
adsAdvertising Manager
promo / promo-top-barКаналы и промо-полоса
telegram-chatДайджесты в Telegram-чат
maxMAX bot / mini-app
authПользовательская авторизация
seoSEO-контент, llms, geo
indexnowIndexNow для Яндекса
widgetEmbed-виджет
gamificationИгровые механики / гонки
benzin-parityПаритет с бензин-источниками
admin-monitoringСтатусы воркеров в админке
comments / reports / engagement / legalКомментарии, жалобы, вовлечение, юр. тексты

Подробности — в src/modules/*/README.md.


Админ-панель

Вход: /admin/login · пароль из ADMIN_PASSWORD (только env).

ПутьФункции
/adminОбзор
/admin/monitoringМониторинг воркеров / Tor / импортов
/admin/marksОтметки водителей
/admin/gameИгра / гонки
/admin/newsНовости
/admin/news/sourcesИсточники RSS
/admin/news/clustersКластеры
/admin/news/preview/[id]Превью новости
/admin/promo-barПромо-полоса
/admin/stationsСтанции
/admin/suggestionsЗаявки на новые АЗС
/admin/commentsКомментарии
/admin/adsРеклама — обзор
/admin/ads/campaignsКампании
/admin/ads/yandexЯндекс РСЯ
/admin/ads/creativesКреативы
/admin/ads/map-markersМетки на карте
/admin/ads/markingМаркировка ОРД
/admin/ads/placementsМеста размещения
/admin/ads/leadsЗаявки рекламодателей
/admin/ads/statsСтатистика
/admin/ads/settingsНастройки рекламы

Навигация задаётся в src/components/admin/admin-shell.tsx и admin-ads-nav.tsx.


Стек

ТехнологияВерсия (из package.json)
Next.js (App Router)^15.3
React^19.1
TypeScriptproject
Prisma^6.9
PostgreSQL + PostGIS16-3.4 (docker-compose)
Redis7
MapLibre GL^5.24
Serwist (PWA)^9
Tailwind + Shadcn/Radix
nuqs^2.4
PM2прод-оркестрация
Nginx + Let's Encryptпрод-прокси

Карта в проде — MapLibre (не Leaflet). Leaflet-код в репозитории помечен deprecated.


Требования

  • Node.js 22+
  • pnpm 9+ (на сервере используется pnpm 11)
  • Docker Desktop (локально: Postgres+PostGIS + Redis)
  • Git + SSH-доступ к remote (выдаёт владелец)

Доступ к коду

Клон только по SSH (URL выдаёт владелец репозитория out-of-band):

git clone <SSH_CLONE_URL>
cd estbenz.ru   # или имя каталога клона

Публичные web-URL git-хостинга в документации не публикуются.


Локальная разработка

Инфраструктура — локальный Docker, не managed cloud.

cp .env.example .env
# Заполните минимум: ADMIN_PASSWORD, AUTH_SECRET
# openssl rand -hex 32

pnpm install
pnpm db:up          # Postgres :5433, Redis :6380
pnpm db:migrate

# Опционально — данные:
# pnpm import:osm
# pnpm import:osm:russia --mode=zones

pnpm dev            # http://localhost:3000

Redis в compose проброшен на хост как 6380 → в .env: REDIS_URL=redis://localhost:6380.

Создание админа — только через ADMIN_PASSWORD в .env. Паролей в коде нет.

Для сборки/dev с российскими CA (нужны некоторым импортам):

# сертификаты: deploy/certs/russian_trusted_*.pem
# NODE_EXTRA_CA_CERTS уже указан в .env.example и в скрипте pnpm dev

WS гонок (опционально): RACE_WS_PORT=3005, клиент NEXT_PUBLIC_RACE_WS_URL=ws://localhost:3005.


Переменные окружения

Источник истины: .env.example.

Required (минимум для локального web)

ПеременнаяНазначение
DATABASE_URLPostgres (локальный compose: порт 5433)
REDIS_URLRedis (локальный compose: порт 6380)
ADMIN_PASSWORDПароль /admin
AUTH_SECRETСекрет кодов входа (openssl rand -hex 32)
NEXT_PUBLIC_SITE_URLПубличный URL сайта

Recommended

ПеременнаяНазначение
NEXT_PUBLIC_* каналыMAX / Telegram / VK
INDEXNOW_KEYIndexNow
ADS_CONTACT_EMAIL / SMTP_*Заявки рекламы и почта
DGIS_API_KEYВерификация названий АЗС
BENZUP_API_TOKENЦены

Production-only / выдаёт администратор

ПеременнаяНазначение
TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_IDБот чата / дайджесты
OPENROUTER_API_KEY, OPENROUTER_PROXY_URLAI-новости
MAX_BOT_TOKEN, MAX_WEBHOOK_SECRET, MAX_BOT_USERNAMEMAX bot
Tor / import envGDEBENZ_*, TBANK_*, RNCARD_*
NEXT_PUBLIC_YANDEX_RTB_*Блоки РСЯ

Секреты не коммитить. Реальные токены выдаются out-of-band.


Структура проекта

├── deploy/                 # Nginx, SSH, Tor, bootstrap, remote-deploy
├── docs/                   # ТЗ, аудиты, планы
├── prisma/                 # schema + migrations
├── public/                 # статика, PWA, иконки
├── scripts/                # импорты, демоны, утилиты
├── src/
│   ├── app/                # Next.js App Router (страницы + API)
│   ├── components/         # UI, карта, админка, промо
│   ├── lib/                # общие утилиты
│   └── modules/            # доменные модули (+ README)
├── docker-compose.yml      # Postgres 5433 + Redis 6380
├── ecosystem.config.cjs    # PM2 (web + workers + tor)
└── .env.example

Скрипты

КомандаДействие
pnpm devDev-сервер (Turbopack)
pnpm build / pnpm startProd-сборка / старт
pnpm db:upDocker: Postgres + Redis
pnpm db:migratePrisma migrate deploy
pnpm import:osm / import:osm:russiaИмпорт станций OSM
pnpm import:dgis:russiaОбогащение 2GIS
pnpm import:gdebenz*Импорт отметок (Tor)
pnpm tbank-toplivo:*Импорт T-Bank Toplivo
pnpm news:collect:*Сбор новостей
pnpm pm2:import:startСтарт PM2-процессов
pnpm lintESLint

Полный список — в package.jsonscripts.


Продакшен-деплой

Целевая архитектура: VPS · Nginx · PM2 · PostgreSQL+PostGIS · Redis · Tor (отдельный SOCKS на worker) · Let's Encrypt.

Критичные правила:

  1. .env не деплоится через rsync — живёт только на сервере.
  2. На проде в DATABASE_URL обязательны connection_limit / pool_timeout (см. комментарий в .env.example).
  3. Деплой: bash deploy/deploy.sh (rsync → remote-deploy.sh → build → migrate → PM2).
  4. Каталог на сервере: /var/www/estbenz.ru.
  5. Web слушает :3000 (PM2 estbenz-web); гонки WS — :3005 (проксируется nginx).

Подробный runbook: deploy/README.md.

Доступ к SSH/деплой-ключу выдаёт владелец. Приватный ключ deploy/ssh/id_ed25519_estbenz в git не хранится.


Git workflow

Ветки (целевая модель):

ВеткаНазначение
feature/*Задачи
developИнтеграция
masterПрод

Правила:

  • Не коммитить напрямую в master / develop
  • Flow: feature/* → merge --no-ffdevelop → merge --no-ffmaster
  • Conventional commits: feat|fix|docs|refactor|chore|test(scope): …
  • Не коммитить .env, приватные ключи, дампы

Важно: на remote сейчас может существовать только master. Ветку develop создаёт владелец при онбординге (Phase 5).


Troubleshooting

СимптомЧто проверить
remaining connection slotsconnection_limit в DATABASE_URL / PRISMA_CONNECTION_LIMIT
Redis connection refusedПорт 6380 (compose), не 6379
Tor / import timeoutpm2 logs tor-gdebenz-worker-0, circuit ещё строится 1–2 мин после рестарта
Admin 401ADMIN_PASSWORD, cookie, CSRF через adminFetch
TELEGRAM_CHAT_BOT_ENABLED=1 падаетЗадан ли TELEGRAM_CHAT_ID
CA / TLS к .ru APINODE_EXTRA_CA_CERTS=deploy/certs/russian_trusted_ca_bundle.pem

Безопасность для внешних разработчиков

  1. Не коммитить секреты. .env — только локально / на сервере.
  2. Токены MAX / Telegram / OpenRouter / SMTP / DGIS / Benzup — только out-of-band от владельца.
  3. Не использовать прод-SSH-ключ команды; запрашивать персональный доступ.
  4. Не включать mock/fallback данных станций — работа только с реальной БД.
  5. Перед push: git status / git diff — нет ли .env, ключей, дампов.

Если нашли секрет в истории git — сразу сообщите владельцу (нужна ротация).


Документация

ДокументСодержание
docs/TZ.mdТехническое задание (историческое; часть ссылок устарела)
docs/FULL-AUDIT-BACKLOG.mdАудит / backlog
docs/improvements-user-features.mdИдеи UX
deploy/README.mdДеплой и ops
src/modules/*/README.mdМодульная документация

Лицензия

Private. Все права принадлежат владельцу проекта.

Master Prompt

Скопируйте в Cursor / Claude Code. Каждый copy даёт новый токен; предыдущий действует ещё 48 часов.

v1.0.0

Master Prompt в Премиум

Скопируйте один prompt в Cursor, Claude Code или Codex — и соберите приложение end-to-end. Внутри — персональный доступ к приватному репозиторию.

Смотреть тарифы

Оплата после выбора тарифа — затем вход или регистрация.

Changelog

  • v1.0.0 · 2026-07-16

    Каталожный релиз GdeBenz / estbenz.ru с private repo placeholders.