Безопасность
Безопасность Minishop в первую очередь держится на стабильных секретах, корректном разделении публичных доменов и ограниченном доступе к админке.
Секреты
Заголовок раздела «Секреты»WEBAPP_SESSION_SECRETдолжен быть постоянным между рестартами, иначе Web App-сессии станут невалидными.WEBHOOK_SECRET_TOKENзащищает вебхук Telegram.PANEL_WEBHOOK_SECRETпроверяет входящие события Remnawave Panel. Секрет задается в Remnawave Panel и вставляется в настройки бота.- Платежные токены и webhook-секреты храните в
.envили настройках админки с учетом доступа к серверу.
Сгенерировать секрет можно так:
Telegram антифлуд
Заголовок раздела «Telegram антифлуд»Апдейты Telegram-бота проходят через ранний anti-flood middleware до sync профиля, проверки каналов и логирования действий, которые обращаются к базе. Профиль по умолчанию специально мягкий: он не должен мешать быстрым обычным нажатиям кнопок, но отбрасывает экстремальные всплески сообщений и callback от одного источника до того, как они разгонят записи в БД, платежные обработчики или Telegram FloodWait.
Настройки доступны в Админка -> Система -> Настройки -> Система -> Telegram
антифлуд. Для обычного приватного продающего бота дефолтов достаточно, поэтому
они не добавлены в .env.example. Меняйте их только если реальный трафик
показывает, что пороги нужно расширить или сузить.
TELEGRAM_DROP_NON_PRIVATE_UPDATES=Trueотбрасывает апдейты из групп и каналов до дорогих middleware. Оставляйте включенным, если бот не должен работать вне приватных чатов.TELEGRAM_ANTIFLOOD_ENABLED=Trueвключает per-user/per-chat лимиты. Значение0у отдельного числового лимита отключает только этот лимит.TELEGRAM_ANTIFLOOD_WINDOW_SECONDS=60задает общее скользящее окно. Дефолты рассчитаны на нормальные button-heavy флоу:180всех апдейтов,120сообщений,240callback,60inline-запросов,30команд/startи60тяжелых callback за окно.TELEGRAM_ACTION_COOLDOWN_ENABLED=Trueдедуплицирует точные повторные платежные и trial callback от того же пользователя. Разные платежные payload не объединяются, поэтому обычный checkout остается независимым.
Доступ администраторов
Заголовок раздела «Доступ администраторов»ADMIN_IDSзадает Telegram ID администраторов.- Админка доступна только пользователям из
ADMIN_IDSпри входе через Telegram. - Email-only аккаунты не получают админский доступ.
Публичные URL
Заголовок раздела «Публичные URL»WEBHOOK_BASE_URLдолжен вести на backend-сервер вебхуков.- В Remnawave Panel
WEBHOOK_URLдолжен бытьWEBHOOK_BASE_URL+/webhook/panel, напримерhttps://app.example.com/webhook/panel. SUBSCRIPTION_MINI_APP_URLдолжен вести на frontend/Mini App-домен.- Не добавляйте
/api,/authили webhook-пути вSUBSCRIPTION_MINI_APP_URL.
Split frontend/backend
Заголовок раздела «Split frontend/backend»- Браузер пользователя должен ходить только на frontend origin:
https://app.example.com/api/.... WEBAPP_API_BASE_URLоставляйте/api; отдельный backend origin в frontend JS не является защитой и делает WebApp API напрямую видимым пользователю.- Для protected upstream используйте
WEBAPP_BACKEND_UPSTREAMу frontend nginx иMINISHOP_EDGE_TOKEN, который nginx добавляет к upstream-запросам server-side. MINISHOP_EDGE_TOKENнельзя отдавать в runtime config или frontend bundle: browser-visible token виден в DevTools.- Token/firewall/VPN применяются к WebApp API plane
backend:8081. Telegram, payment provider и Remnawave Panel webhook остаются на public webhook planebackend:8080и не должны требоватьMINISHOP_EDGE_TOKEN. - При upstream
https://bot.example.comнастройте Host/SNI (WEBAPP_BACKEND_UPSTREAM_HOST=bot.example.com) и route order так, чтобы/api/*,/auth/*,/open-app, logo/theme/favicon paths попадали в8081раньше generic webhook fallback.
IP allowlist вебхуков
Заголовок раздела «IP allowlist вебхуков»- Reverse proxy для
WEBHOOK_BASE_URLдолжен передаватьX-Forwarded-Forс реальным IP отправителя. TRUSTED_PROXIESдолжен включать IP/CIDR последнего proxy-hop до backend. Иначе платежные webhook-обработчики будут проверять allowlist по IP proxy или Docker gateway.- Для домена за Cloudflare backend принимает
CF-Connecting-IP, только если ближайший недоверенный hop входит в официальные сети Cloudflare. Добавлять эти публичные CIDR вTRUSTED_PROXIESне требуется. - В Docker Compose профилях Caddy, Angie, Nginx и Pangolin/Newt дефолт покрывает loopback и private ranges:
127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fc00::/7. - Если backend находится в общей Docker-сети с недоверенными контейнерами, сузьте
TRUSTED_PROXIESдо конкретных IP ваших reverse proxy. - Если вы сознательно хотите доверять любому proxy-hop, используйте
0.0.0.0/0,::/0, но только когда backend не опубликован напрямую, а внешний proxy очищает входящийX-Forwarded-For.
Дополнительно
Заголовок раздела «Дополнительно»- Используйте HTTPS на всех публичных доменах.
- Ограничивайте доступ к серверу и
.env. - Следите за логами платежных вебхуков и вебхуков панели.
- После ротации секретов перезапускайте соответствующие сервисы и проверяйте вебхуки.
См. также переменные окружения и развертывание.