
ЕстьБЕНЗ - народная карта наличия топлива
Live-карта топлива на АЗС России: народные отметки «есть / нет», очередь, цены и SEO-каталог станций.
Ценность
Вайбкодинг
80 ч
Строк кода
87 000+
Аналог у студии
от 450 000 ₽
Экономия на токенах
≈ 20 000 ₽
Инструкция из репозитория
ЕстьБЕНЗ (estbenz.ru)
Народная live-карта наличия топлива на АЗС России: водители отмечают «есть» / «нет» / очередь, сервис показывает свежие статусы на карте и в SEO-каталоге.
Версия:
0.1.0· Package manager: pnpm · Репозиторий: приватный (клон по SSH выдает владелец)
Оглавление
- Возможности
- Админ-панель
- Стек
- Требования
- Доступ к коду
- Локальная разработка
- Переменные окружения
- Структура проекта
- Скрипты
- Продакшен-деплой
- Git workflow
- Troubleshooting
- Безопасность для внешних разработчиков
- Документация
Возможности
| Поверхность | Описание |
|---|---|
| Карта АЗС | MapLibre GL, кластеры, фильтры топлива/бренда/свежести, геолокация |
| Отметки водителей | Статусы наличия топлива, очереди, платежные сигналы |
| Карточка АЗС | Детали станции, цены, шаринг, подтверждения |
| SEO-каталог | Регионы, города, сети, типы топлива, рейтинги |
| Новости | Сбор RSS + AI-обработка (OpenRouter), публикация, Telegram-топики |
| Реклама | Баннеры, товарные карточки, метки на карте, Яндекс РСЯ |
| Промо | Каналы MAX / Telegram / VK, баннеры, нижняя полоска, CTA поддержки |
| PWA | Serwist service worker, installable |
| Виджет | Встраиваемая карта (/widget) |
| Геймификация | Гонки «Дуэль на трассе», WS-сервер |
| Импорт данных | OSM, 2GIS, gdebenz.ru (Tor), T-Bank Toplivo, RN-Card, Benzup |
| Auth | Вход по коду из email; MAX mini-app |
Модули (src/modules/)
| Модуль | Назначение |
|---|---|
stations | CRUD/запросы станций |
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 | Сбор и модерация новостей |
ads | Advertising Manager |
promo / promo-top-bar | Каналы и промо-полоса |
telegram-chat | Дайджесты в Telegram-чат |
max | MAX bot / mini-app |
auth | Пользовательская авторизация |
seo | SEO-контент, llms, geo |
indexnow | IndexNow для Яндекса |
widget | Embed-виджет |
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 |
| TypeScript | project |
| Prisma | ^6.9 |
| PostgreSQL + PostGIS | 16-3.4 (docker-compose) |
| Redis | 7 |
| 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_URL | Postgres (локальный compose: порт 5433) |
REDIS_URL | Redis (локальный compose: порт 6380) |
ADMIN_PASSWORD | Пароль /admin |
AUTH_SECRET | Секрет кодов входа (openssl rand -hex 32) |
NEXT_PUBLIC_SITE_URL | Публичный URL сайта |
Recommended
| Переменная | Назначение |
|---|---|
NEXT_PUBLIC_* каналы | MAX / Telegram / VK |
INDEXNOW_KEY | IndexNow |
ADS_CONTACT_EMAIL / SMTP_* | Заявки рекламы и почта |
DGIS_API_KEY | Верификация названий АЗС |
BENZUP_API_TOKEN | Цены |
Production-only / выдаёт администратор
| Переменная | Назначение |
|---|---|
TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID | Бот чата / дайджесты |
OPENROUTER_API_KEY, OPENROUTER_PROXY_URL | AI-новости |
MAX_BOT_TOKEN, MAX_WEBHOOK_SECRET, MAX_BOT_USERNAME | MAX bot |
| Tor / import env | GDEBENZ_*, 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 dev | Dev-сервер (Turbopack) |
pnpm build / pnpm start | Prod-сборка / старт |
pnpm db:up | Docker: Postgres + Redis |
pnpm db:migrate | Prisma 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 lint | ESLint |
Полный список — в package.json → scripts.
Продакшен-деплой
Целевая архитектура: VPS · Nginx · PM2 · PostgreSQL+PostGIS · Redis · Tor (отдельный SOCKS на worker) · Let's Encrypt.
Критичные правила:
.envне деплоится через rsync — живёт только на сервере.- На проде в
DATABASE_URLобязательныconnection_limit/pool_timeout(см. комментарий в.env.example). - Деплой:
bash deploy/deploy.sh(rsync →remote-deploy.sh→ build → migrate → PM2). - Каталог на сервере:
/var/www/estbenz.ru. - 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-ff→develop→ merge--no-ff→master - Conventional commits:
feat|fix|docs|refactor|chore|test(scope): … - Не коммитить
.env, приватные ключи, дампы
Важно: на remote сейчас может существовать только
master. Веткуdevelopсоздаёт владелец при онбординге (Phase 5).
Troubleshooting
| Симптом | Что проверить |
|---|---|
remaining connection slots | connection_limit в DATABASE_URL / PRISMA_CONNECTION_LIMIT |
| Redis connection refused | Порт 6380 (compose), не 6379 |
| Tor / import timeout | pm2 logs tor-gdebenz-worker-0, circuit ещё строится 1–2 мин после рестарта |
| Admin 401 | ADMIN_PASSWORD, cookie, CSRF через adminFetch |
TELEGRAM_CHAT_BOT_ENABLED=1 падает | Задан ли TELEGRAM_CHAT_ID |
| CA / TLS к .ru API | NODE_EXTRA_CA_CERTS=deploy/certs/russian_trusted_ca_bundle.pem |
Безопасность для внешних разработчиков
- Не коммитить секреты.
.env— только локально / на сервере. - Токены MAX / Telegram / OpenRouter / SMTP / DGIS / Benzup — только out-of-band от владельца.
- Не использовать прод-SSH-ключ команды; запрашивать персональный доступ.
- Не включать mock/fallback данных станций — работа только с реальной БД.
- Перед 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 часов.
Master Prompt в Премиум
Скопируйте один prompt в Cursor, Claude Code или Codex — и соберите приложение end-to-end. Внутри — персональный доступ к приватному репозиторию.
Оплата после выбора тарифа — затем вход или регистрация.
Changelog
v1.0.0 · 2026-07-16
Каталожный релиз GdeBenz / estbenz.ru с private repo placeholders.