Продукт компании
4-2: платформа услуг для мастеров с ботом и мини-приложением в MAX.
ПриДел помогает вести полный цикл сервисных работ: каталог услуг, сметы, заказы, согласования, оплаты, уведомления и роли команды.
Брендовая схема проекта:
4-2— компания и доменПриДел— продукт и главное имя в интерфейсеpridel/придел— допустимые технические slug-формы, но не основной display-бренд
Основной сценарий запуска:
- пользователь открывает бота в MAX;
- из чата запускает мини-приложение;
- работает в web-интерфейсе со сметами, профилем и заказами;
- backend на FastAPI хранит состояние в PostgreSQL и фоновые события в Redis.
- MAX bot runtime через Bot API: webhook-first в production, polling fallback в dev
- Mini App аутентификация по подписанным launch params
- каталог работ, поиск и коэффициенты
- сметы с версиями, экспортом PDF/XLSX и QR-оплатой
- роли
client,master,senior_master,admin,product_owner - уведомления, аудит, feature flags, AI intake
git clone https://github.com/junior2wnw/master-bot.git
cd master-bot
cp .env.example .envЗаполните минимум:
MAX_BOT_TOKENWEBAPP_URLDATABASE_URL
Локальный запуск через Docker:
make up
make migrate
make seedПриложение поднимется на http://localhost:8000, Mini App статика будет доступна по /app.
- Создайте чат-бота в кабинете партнёров MAX:
business.max.ru. - Получите токен в разделе интеграции и сохраните его в
MAX_BOT_TOKEN. - Разместите приложение по публичному
https://URL. - Укажите этот URL в настройках бота:
Чат-бот и мини-приложение -> Настроить. - Выберите кнопку запуска мини-приложения и сохраните настройки.
Webhook-first поведение проекта:
- если
MAX_DELIVERY_MODE=auto, backend в production сам переходит на webhook, когда видит публичныйhttps://вWEBAPP_URL - если
MAX_WEBHOOK_URLпуст, webhook строится как<scheme>://<host>/api/max/webhookна основеWEBAPP_URL - если
MAX_WEBHOOK_SECRETзадан, входящие запросы MAX проходят проверку поX-Max-Bot-Api-Secret - если публичного URL нет, проект остаётся на polling fallback и это считается dev/test режимом, а не боевым
Что учитывает проект по документации MAX:
- Bot API авторизуется через заголовок
Authorization: <token> - production-контур синхронизирует webhook через
POST /subscriptions - webhook валидируется shared secret в заголовке
X-Max-Bot-Api-Secret GET /updatesиспользуется как fallback для локальной разработки и тестовых стендов- Mini App стартовые данные берутся из
window.WebApp.initData - подпись launch params валидируется через
HMAC-SHA256("WebAppData", token) - приложение открывается внутри MAX по диплинку вида
https://max.ru/<botName>?startapp
MAX Bot / Mini App -> FastAPI -> Services -> SQLAlchemy models -> PostgreSQL
|
-> Event Bus -> Notifications / Audit / Background jobs
|
-> Redis
Ключевой принцип: бизнес-логика не должна зависеть от конкретного UI-канала. Бот и Mini App выступают слоем доставки над одним backend.
Основные переменные окружения:
MAX_BOT_TOKEN— токен чат-бота MAXMAX_API_BASE_URL— базовый URL MAX API, по умолчаниюhttps://platform-api.max.ruMAX_POLLING_TIMEOUT_SEC— таймаут long pollingMAX_DELIVERY_MODE—auto | webhook | polling; в production рекомендуемautoилиwebhookMAX_WEBHOOK_URL— явный webhook URL, если нельзя выводить его изWEBAPP_URLMAX_WEBHOOK_PATH— путь webhook при авто-выводе URL, по умолчанию/api/max/webhookMAX_WEBHOOK_SECRET— секрет проверки заголовкаX-Max-Bot-Api-SecretWEBAPP_URL— публичный URL мини-приложенияWEBAPP_SESSION_TTL_SEC— срок жизни подписанной web-сессии Mini AppOWNER_TELEGRAM_ID— историческое имя переменной для внешнего ID владельца; в MAX сюда ставитсяuser_idпользователя MAXPLATFORM_OPERATOR_NAME— оператор и компания продукта, по умолчанию4-2PLATFORM_NAME— пользовательское имя платформы, по умолчаниюПриДелPLATFORM_PUBLIC_DOMAIN— человекочитаемый домен продукта, по умолчанию4-2.рфPLATFORM_PUBLIC_DOMAIN_ASCII— punycode-форма домена для server/proxy/TLS-конфигов, по умолчанию4-2.xn--p1ai
Полный шаблон смотрите в .env.example.
Для Ubuntu есть скрипт:
sudo bash deploy/setup.sh \
--max-bot-token "YOUR_MAX_TOKEN" \
--webapp-url "https://YOUR_DOMAIN/app"Если меняете MAX_BOT_TOKEN, WEBAPP_URL или другие переменные окружения после первого запуска, применяйте их через пересоздание контейнера:
docker compose up -d --force-recreate appДля MAX runtime это важно вдвойне: при смене MAX_DELIVERY_MODE, MAX_WEBHOOK_URL, MAX_WEBHOOK_PATH или MAX_WEBHOOK_SECRET контейнер app тоже нужно пересоздать, иначе runtime продолжит жить со старой конфигурацией.
Он:
- создаёт
.env - поднимает Docker Compose
- применяет миграции
- загружает seed-данные
- настраивает systemd и базовые системные параметры
После деплоя проверьте:
/health- публичный
https://.../app - запуск Mini App из интерфейса MAX
Подробный production-процесс для боевого сервера pridel:
- alias
pridelуказывает наroot@193.47.43.64 - публичный домен продукта:
https://4-2.рф/app - технический ASCII-домен для конфигов и reverse proxy:
https://4-2.xn--p1ai/app - в Caddy, curl, cert/TLS и server-side конфигурациях используйте только
4-2.xn--p1ai: Caddy нормализует4-2.рфв тот же host и считает двойную запись дубликатом - отдельная инструкция лежит в docs/deploy_pridel.md
- Mini App frontend source lives in
app/webapp/frontend - For local non-Docker frontend build:
cd app/webapp/frontend
npm install
npm run build-
FastAPI serves
app/webapp/distwhen it exists -
Production app image now bakes the Mini App build into Docker
-
API после
/api/v1/authработает черезAuthorization: Bearer <session>; legacy query auth через?user_id=оставлен только для dev-контура -
After code changes, deploy with
docker compose up -d --build app -
If only
.envchanged, usedocker compose up -d --force-recreate app -
If code and
.envchanged together, usedocker compose up -d --build --force-recreate app -
make test— локальные тесты -
make lint— линтеры -
make dev— локальный uvicorn
- In MAX settings and in server-side configs for the IDN domain, use the ASCII URL
https://4-2.xn--p1ai/app. - Keep
https://4-2.рф/appas the public-facing display URL for users, but do not rely on it for MAX admin/config screens. - The Mini App entrypoint must answer on exact
/appwithout a redirect tohttp://.../app/, otherwise MAX may show a native technical error before frontend code starts. - The frontend and backend both support signed launch data delivered either via
window.WebApp.initDataor via URL fragment#WebAppData=.... - Control Center in the Mini App now covers team, roles, branches, invites, staffing, owner insights, and feature flags, so routine operations no longer depend on Telegram-only callback flows.
- The canonical production reverse proxy config now lives in Caddyfile, and its upstream must stay on the stable Docker service alias
app:8000. deploy/setup.shnow recreatespridel-caddyfrom the repoCaddyfileso a backend rebuild cannot leave production on a stale proxy target.
PriDel is a service workflow platform for field specialists with a MAX bot, MAX Mini App, FastAPI backend, PostgreSQL, and Redis. The repo is structured as a modular monolith so the same business logic can power bot actions, Mini App screens, exports, approvals, and notifications.