Демо-проект «под ключ» для вымышленной студии. Задача: принимать заказы
из двух каналов, с сайта и из Telegram, и вести каждый заказ в одной админке от
заявки до сдачи результата. Клиент при этом видит статус и общается с
менеджером там, где ему удобно.
Решения в Polygon3D
Архитектура
Сайт и бот — два процесса с общей базой, без HTTP между ними. Не нужен внутренний API.
Уведомления через очередь в базе (outbox). Заказы принимаются, даже если Telegram недоступен; до пяти повторов отправки.
Общая логика заказа для сайта и бота, смена статуса под блокировкой строки, чтобы одновременные действия не ломали заказ.
Сигналы Django пишут историю и создают уведомления при любом изменении, поэтому админка сохраняет заказы через save(), а не update().
Свой декоратор @db связывает асинхронного бота с синхронным ORM через sync_to_async.
Безопасность
Файлы клиентов отдаёт только Django и только владельцу или менеджеру. Caddy раздаёт лишь публичные картинки.
UUID вместо номера заказа в публичных ссылках, чтобы чужие заказы нельзя было перебрать.
Проверка файлов по содержимому, а не по расширению; картинки пересжимаются.
Лимиты запросов в кэше PostgreSQL, общем для всех воркеров Gunicorn, плюс скрытое поле-ловушка от спам-ботов.
CSP без unsafe-eval, никаких CDN, экранирование текста в уведомлениях и защита CSV от формул.
Без секретного ключа приложение в продакшене не запускается.
Инфраструктура
Caddy выпускает HTTPS-сертификат автоматически, статику с хешами в именах отдаёт WhiteNoise.
Один Docker-образ на сайт и бота, запуск не от root, pip удалён, есть healthcheck.
SQLite для разработки, PostgreSQL в продакшене.
Сборка образа автоматическая, деплой ручной; зависимости закреплены хешами, Django 5.2 LTS.
Тесты
E2E против боевой сборки, а не dev-сервера.
Диалоги бота проверяются через настоящий диспетчер aiogram без выхода в сеть.
Smoke-тест готового Docker-образа.
Продукт
Две правки входят в стоимость, система считает их сама.
3D-просмотр загружается по кнопке, поэтому страницы открываются быстро.
Сайт работает и без бота.
Разработал с нуля сайт студии с личным кабинетом, админкой и Telegram-ботом: полный цикл заказа от заявки до приёмки работы. Проект покрыт 146 автотестами и 11 E2E-сценариями, собирается в Docker и проходит CI/CD на GitHub Actions.