Платформа для проведения многораундовых криптовалютных аукционов с поддержкой TON и USDT. (Video demo)
🌐 Демо: https://lamanoff-telegram-auc-a9a8.twc1.net/
📖 Подробная спецификация механики: AUCTION_MECHANICS.md
docker-compose up -dПосле запуска:
- Frontend: http://localhost (или http://127.0.0.1 для Telegram виджета)
- Backend API: http://localhost:3000
- Админ панель: http://localhost/admin
Учётные данные по умолчанию:
- Логин:
admin - Пароль:
admin123
Измените пароль админа в продакшене через переменные
ADMIN_USERNAMEиADMIN_PASSWORD
Платформа поддерживает аутентификацию через Telegram Login Widget. Для локального тестирования необходимо:
-
Создайте бота через @BotFather в Telegram:
- Отправьте команду
/newbotи следуйте инструкциям - Сохраните полученный токен
- Отправьте команду
-
Настройте домен в BotFather:
- Отправьте команду
/setdomainботу BotFather - Выберите вашего бота
- Укажите домен:
127.0.0.1(неlocalhost— BotFather не принимает localhost) - Также можно указать порт:
127.0.0.1:80или127.0.0.1:3000(в зависимости от вашей конфигурации)
- Отправьте команду
-
Настройте переменные окружения:
- Создайте файл
.env(скопируйте изenv.example) - Укажите
TELEGRAM_BOT_TOKEN— токен бота от BotFather - Укажите
TELEGRAM_BOT_USERNAME— username вашего бота (без @)
- Создайте файл
-
Запустите проект и заходите по IP-адресу:
- Используйте
http://127.0.0.1вместоhttp://localhost - Telegram виджет будет работать только при доступе через указанный в BotFather домен
- Используйте
Важно: Для продакшена укажите ваш реальный домен в BotFather (например, yourdomain.com).
- Многораундовая система: Аукционы состоят из нескольких раундов, в каждом раунде определяется группа победителей
- Автоматическое управление: Автоматический запуск по расписанию, завершение раундов, переход между раундами
- Защита от снипинга: Автоматическое продление раунда при ставке в последние секунды
- Резервная цена: Опциональная минимальная цена для определения победителей
- Реальное время: WebSocket обновления для мгновенного отображения изменений
- Одна активная ставка: Каждый пользователь может иметь только одну активную ставку на аукцион
- Только повышение: Ставки можно только увеличивать
- Блокировка средств: Средства блокируются при размещении ставки
- Минимальная ставка: Динамически рассчитывается на основе текущих топ-ставок
- Асинхронная обработка: Ставки обрабатываются через очереди для высокой производительности
- Поддержка валют: TON и USDT
- Точные расчеты: Использование bigint для работы с минимальными единицами
- Блокировка баланса: Разделение на доступный и заблокированный баланс
- Интеграция CryptoBot: Депозиты и выводы через CryptoBot API
- История транзакций: Полный аудит всех финансовых операций
- Количество участников на аукцион
- Максимальная ставка
- Средняя ставка
- Объем торгов (сумма всех выигрышных ставок)
- Количество завершенных раундов
- Процент проданных лотов
- Общий баланс по валютам
- Заблокированные средства
- История транзакций
- История ставок
- Выигранные лоты
- Количество активных аукционов
- Количество пользователей
- Общее количество ставок
- Общее количество транзакций
- Статистика очередей (ожидающие, активные, завершенные, неудачные)
- Просмотр всех аукционов с детальной статистикой
- Просмотр всех ставок по аукциону
- Просмотр истории событий
- Просмотр всех транзакций
- Аналитика по объемам торгов
- Управление выводами
- Очереди BullMQ: Асинхронная обработка ставок до 4000+ операций в секунду
- Redis кеширование: Быстрый доступ к данным и rate limiting
- Оптимизированные индексы: Быстрые запросы к базе данных
- MongoDB транзакции: Гарантия консистентности финансовых операций
- WebSocket: Мгновенные обновления без polling
- JWT аутентификация с валидацией формата
- Telegram Login Widget — вход через Telegram без пароля
- Автоматическое создание аккаунта при первом входе через Telegram
- Связывание Telegram аккаунта с существующим пользователем
- JWT аутентификация с валидацией формата
- Верификация Telegram данных через HMAC-SHA256
- Rate limiting на всех критичных эндпоинтах
- Валидация всех входных данных через Zod
- Защита от NoSQL инъекций через валидацию ObjectId
- Защита от XSS через санитизацию HTML
- Защита от timing attacks при проверке паролей
- CORS с белым списком разрешенных источников
- CSP заголовки через Helmet
- Безопасное хранение паролей (bcrypt, минимум 8 символов)
- Ограничение размера запросов
- Валидация всех параметров URL
- Защита от утечки информации в логах
Backend:
- Node.js + TypeScript
- Express.js
- MongoDB + Mongoose
- Redis + BullMQ
- WebSocket
Frontend:
- Vue 3 (Composition API)
- Vue Router
- Pinia
- Axios
- WebSocket
Инфраструктура:
- Docker + Docker Compose
- Nginx
- MongoDB 8.2
- Redis 8.4
POST /api/register- РегистрацияPOST /api/login- ВходPOST /api/telegramAuth- Авторизация через TelegramGET /api/profile- Профиль пользователя
GET /api/auctions- Список аукционовGET /api/auctions/:id- Детали аукционаPOST /api/auctions/:id/bid- Разместить ставкуGET /api/auctions/:id/mybid- Моя ставкаGET /api/auctions/:id/history- История раундовGET /api/auctions/:id/items- Проданные лоты
POST /api/deposit- Создать депозитPOST /api/withdraw- Вывести средстваGET /api/transactions- История транзакций
POST /api/auctions- Создать аукционPUT /api/auctions/:id- Обновить аукционPOST /api/auctions/:id/cancel- Отменить аукционGET /api/admin/analytics- АналитикаGET /api/admin/logs- Логи системыGET /api/admin/transactions- Все транзакцииGET /api/admin/events- События системы
Подключение: ws://localhost:3000/ws?auctionId=<id>&token=<jwt>
События:
snapshot- Полное состояние при подключенииbid.updated- Обновление ставкиbid.outbid- Вытеснение из топ-спискаround.closed- Закрытие раундаauction.started- Запуск аукционаauction.cancelled- Отмена аукционаviewer.count- Количество зрителей
Платформа включает инструменты для проверки производительности и стабильности под нагрузкой.
Убедитесь, что установлены все зависимости проекта:
npm installСоздайте файл .env в корне проекта (можно скопировать из env.example):
cp env.example .envОбязательные переменные для тестирования:
JWT_SECRET- Секретный ключ для JWT (минимум 32 символа). Для тестирования можно использовать любой длинный случайный ключ.
Опциональные переменные (для полного функционала):
CRYPTOBOT_TOKEN- Токен CryptoBot API (подпись webhook проверяется автоматически через токен)TELEGRAM_BOT_TOKEN- Токен Telegram бота (если используется Telegram авторизация)
Для получения CryptoBot токена:
- Зарегистрируйтесь на crypto bot
- Перейдите в раздел "API"
- Создайте новый токен
- Скопируйте токен в
.envфайл
Пример .env файла для тестирования:
JWT_SECRET=your_super_secret_jwt_key_minimum_32_characters_long
MONGO_URI=mongodb://mongo:27017/auction
REDIS_URL=redis://redis:6379
CRYPTOBOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
PORT=3000Примечание: Для базового тестирования достаточно только JWT_SECRET. CryptoBot токены нужны только если вы хотите протестировать функционал депозитов/выводов.
Запустите все сервисы через Docker Compose:
docker-compose up -dПроверьте, что все сервисы запущены:
docker-compose psДолжны быть запущены:
auction-mongo(MongoDB)auction-redis(Redis)auction-backend(Backend API)auction-frontend(Frontend)
Дождитесь полной инициализации (обычно 10-30 секунд). Проверьте логи:
docker-compose logs backendКогда увидите Server listening on 3000, система готова.
Убедитесь, что API доступен:
curl http://localhost:3000/healthДолжен вернуться ответ: {"status":"ok"}
Полностью автоматизированный скрипт, который сам создает аукцион, запускает тесты и выдает отчет. Работает как локально, так и с удалённым сервером (облаком) — не требует прямого доступа к MongoDB.
npm run auto-testЧто делает скрипт:
- ✅ Проверяет доступность API сервера
- ✅ Авторизуется как администратор
- ✅ Тесты Anti-Snipe (защита от снайпинга):
- Проверка продления раунда при ставке в последние секунды
- Проверка множественного продления при серии ставок
- Проверка что ставка ВНЕ окна anti-snipe не продлевает раунд
- ✅ Создает тестовых пользователей с балансом (через API)
- ✅ Тесты производительности:
- WebSocket подключения
- Одновременные регистрации
- RPS (запросов в секунду)
- Одновременные ставки
- ✅ Выдает подробный отчет с метриками и рекомендациями
Параметры (через переменные окружения или аргументы командной строки):
Параметры подключения:
API_BASE- URL сервера API (по умолчанию: http://localhost:3000)WS_BASE- URL WebSocket (по умолчанию: автоматически из API_BASE)ADMIN_USERNAME- Логин администратора (по умолчанию: admin)ADMIN_PASSWORD- Пароль администратора (по умолчанию: admin123)
Параметры Anti-Snipe:
ANTI_SNIPE_WINDOW_SEC- Окно anti-snipe в секундах (по умолчанию: 30)ANTI_SNIPE_EXTEND_SEC- Продление раунда в секундах (по умолчанию: 30)
Примеры использования:
Интерактивный режим (рекомендуется):
npm run auto-testСкрипт спросит:
═══════════════════════════════════════════════════════════════════════════════
🚀 НАСТРОЙКА ТЕСТИРОВАНИЯ АУКЦИОННОЙ СИСТЕМЫ
═══════════════════════════════════════════════════════════════════════════════
Введите параметры подключения к серверу.
💡 Совет: Нажмите Enter для значения по умолчанию (в скобках)
🌐 URL сервера API [http://localhost:3000]: https://auction.example.com
📡 WebSocket URL: wss://auction.example.com
👤 Логин администратора [admin]: myadmin
🔑 Пароль администратора [********]:
(введите новый или нажмите Enter для значения по умолчанию):
⚙️ Настройки Anti-Snipe (защита от снайпинга):
Окно anti-snipe в секундах [30]:
Продление раунда в секундах [30]:
Автоматический режим (через переменные окружения):
API_BASE=https://auction.example.com ADMIN_USERNAME=myadmin ADMIN_PASSWORD=mypassword npm run auto-testВ Windows PowerShell:
$env:API_BASE="https://auction.example.com"; $env:ADMIN_USERNAME="myadmin"; $env:ADMIN_PASSWORD="mypassword"; npm run auto-testВ Windows CMD:
set API_BASE=https://auction.example.com
set ADMIN_USERNAME=myadmin
set ADMIN_PASSWORD=mypassword
npm run auto-testПример полного запуска (локально):
- Убедитесь, что система запущена:
docker-compose up -d- Дождитесь готовности (проверьте логи):
docker-compose logs -f backend
# Нажмите Ctrl+C когда увидите "Server listening on 3000"- Запустите автоматическое тестирование:
npm run auto-test-
Дождитесь завершения (обычно 2-5 минут)
-
Изучите итоговый отчет
Пример вывода:
═══════════════════════════════════════════════════════════════════════════════
🛡️ ОТЧЁТ О ТЕСТАХ ANTI-SNIPE 🛡️
═══════════════════════════════════════════════════════════════════════════════
✅ Anti-Snipe Basic
Раунд продлён на 30с как ожидалось
✅ Anti-Snipe Multiple Bids
Каждая ставка продлила раунд. Общее продление: 60с
✅ Anti-Snipe Outside Window
Раунд не продлён, как и ожидалось
────────────────────────────────────────────────────────────────────────────────
Итого: 3 пройдено, 0 провалено
═══════════════════════════════════════════════════════════════════════════════
Что будет в отчете:
- ✅ Состояние системы (API, WebSocket, БД, Redis)
- 📊 Метрики нагрузочного теста (количество ботов, ставок, WebSocket подключений)
- ⚡ Метрики стресс-теста (RPS, время отклика, перцентили P95/P99)
- 📈 Выводы о производительности и стабильности системы
Ошибка "API недоступен":
- Убедитесь, что Docker Compose запущен:
docker-compose ps - Проверьте логи бэкенда:
docker-compose logs backend - Убедитесь, что порт 3000 не занят другим процессом
Ошибка "Не удалось назначить роль администратора":
- Убедитесь, что MongoDB доступна на
localhost:27017 - Или передайте
ADMIN_TOKENсуществующего администратора - Или создайте админа вручную через MongoDB:
docker exec -it auction-mongo mongosh auction
db.users.updateOne({username: "your_username"}, {$set: {role: "admin"}})Ошибка подключения к MongoDB:
- Проверьте, что контейнер MongoDB запущен:
docker ps | grep mongo - Проверьте логи:
docker-compose logs mongo - Убедитесь, что
MONGO_URIуказан правильно
Медленное выполнение тестов:
- Увеличьте ресурсы Docker (CPU, память)
- Уменьшите количество ботов или длительность теста
- Проверьте использование ресурсов:
docker stats
WebSocket подключения не устанавливаются:
- Проверьте, что порт 3000 доступен
- Убедитесь, что Nginx правильно проксирует WebSocket (если используется)
- Проверьте логи бэкенда на наличие ошибок
Если нужно протестировать существующий аукцион вручную:
- Запустите систему:
docker-compose up -d- Создайте тестовый аукцион через админ панель или API:
curl -X POST http://localhost:3000/api/auctions \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '{
"title": "Test Auction",
"currency": "TON",
"roundsCount": 5,
"itemsPerRound": 10,
"startTime": "2026-01-15T12:00:00Z",
"firstRoundDurationSec": 300,
"roundDurationSec": 300,
"minIncrement": "0.1",
"startingPrice": "1"
}'- Получите ID созданного аукциона из ответа
Симулирует реалистичное поведение пользователей на аукционах с разными стратегиями ставок. Идеально подходит для визуального наблюдения за работой системы в реальном времени.
npm run simulate-biddingПараметры:
NUM_USERS- Количество симулируемых пользователей (по умолчанию: 10)AUCTION_ID- ID аукциона (если не указан, будет найден активный или запланированный)ADMIN_USERNAME- Логин администратора (по умолчанию: admin)ADMIN_PASSWORD- Пароль администратора (по умолчанию: admin123)CREATE_AUCTION_DELAY_SEC- Задержка перед началом созданного аукциона в секундах (по умолчанию: 10)API_BASE- Базовый URL API (по умолчанию: http://localhost:3000)WS_BASE- Базовый URL WebSocket (по умолчанию: ws://localhost:3000)
Стратегии пользователей:
- aggressive - Агрессивные ставки, быстрые интервалы (2-5 сек)
- conservative - Консервативные ставки, медленные интервалы (8-20 сек)
- moderate - Умеренные ставки, средние интервалы (5-13 сек)
- sniper - Минимальные ставки, очень медленные интервалы (15-35 сек)
Что делает скрипт:
- Входит как администратор
- Находит активный аукцион (или ждет начала запланированного)
- Если аукционов нет - автоматически создает новый с реалистичными параметрами
- Создает пользователей с разными стратегиями
- Устанавливает им балансы через админский API
- Начинает симуляцию торгов в реальном времени
- Выводит статистику каждые 30 секунд
Автоматическое создание аукционов:
- Скрипт автоматически создает аукцион, если не найдено активных или запланированных
- Используются реалистичные названия и описания
- Разные варианты конфигураций (валюта, количество раундов, длительность, цены)
- Аукцион начинается через 10-30 секунд после создания (настраивается через
CREATE_AUCTION_DELAY_SEC)
Примеры использования:
Базовый запуск (10 пользователей):
npm run simulate-biddingБольше пользователей (20):
NUM_USERS=20 npm run simulate-biddingС указанным аукционом:
AUCTION_ID=<id> npm run simulate-biddingРекомендации:
- Откройте интерфейс системы в браузере для визуального наблюдения
- Скрипт автоматически найдет активный аукцион, если не указан
AUCTION_ID - Если аукционов нет, скрипт автоматически создаст новый с реалистичными параметрами
- Для остановки нажмите
Ctrl+C
Примеры с автоматическим созданием аукциона:
Создать аукцион, который начнется сразу:
CREATE_AUCTION_DELAY_SEC=0 npm run simulate-biddingСоздать аукцион с задержкой 30 секунд:
CREATE_AUCTION_DELAY_SEC=30 npm run simulate-biddingСимулирует реалистичное поведение множества пользователей с WebSocket подключениями и автоматическими ставками.
Примечание: Для автоматизированного тестирования используйте npm run auto-test
AUCTION_ID=<auction_id> NUM_BOTS=50 BID_INTERVAL_MS=500 npm run load-testПараметры:
AUCTION_ID- ID аукциона (обязательно)NUM_BOTS- Количество ботов (по умолчанию: 50)BID_INTERVAL_MS- Интервал между ставками в миллисекундах (по умолчанию: 500)API_BASE- Базовый URL API (по умолчанию: http://localhost:3000)WS_BASE- Базовый URL WebSocket (по умолчанию: ws://localhost:3000)
Что тестируется:
- Одновременные WebSocket подключения
- Автоматическое размещение ставок
- Обработка обновлений в реальном времени
- Стабильность при высокой активности
Примеры:
Легкая нагрузка (10 ботов):
AUCTION_ID=<id> NUM_BOTS=10 BID_INTERVAL_MS=1000 npm run load-testСредняя нагрузка (50 ботов):
AUCTION_ID=<id> NUM_BOTS=50 BID_INTERVAL_MS=500 npm run load-testВысокая нагрузка (100+ ботов):
AUCTION_ID=<id> NUM_BOTS=100 BID_INTERVAL_MS=300 npm run load-testПроверяет способность системы обрабатывать большое количество одновременных запросов.
Примечание: Для автоматизированного тестирования используйте npm run auto-test
AUCTION_ID=<auction_id> CONCURRENT_REQUESTS=100 TOTAL_REQUESTS=1000 npm run stress-testПараметры:
AUCTION_ID- ID аукциона (обязательно)CONCURRENT_REQUESTS- Количество одновременных запросов (по умолчанию: 100)TOTAL_REQUESTS- Общее количество запросов (по умолчанию: 1000)API_BASE- Базовый URL API (по умолчанию: http://localhost:3000)
Что тестируется:
- Пропускная способность API
- Время отклика под нагрузкой
- Процент успешных запросов
- Обработка ошибок
Метрики:
- Requests per second (RPS)
- Среднее время отклика
- Минимальное/максимальное время отклика
- P95 и P99 перцентили
- Процент успешных запросов
Примеры:
Базовый тест (100 одновременных, 1000 запросов):
AUCTION_ID=<id> CONCURRENT_REQUESTS=100 TOTAL_REQUESTS=1000 npm run stress-testЭкстремальная нагрузка (200 одновременных, 5000 запросов):
AUCTION_ID=<id> CONCURRENT_REQUESTS=200 TOTAL_REQUESTS=5000 npm run stress-testПроверка работы механизма продления раунда при ставках в последние секунды.
- Создайте аукцион с коротким раундом (30-60 секунд)
- Запустите ботов с высокой частотой ставок:
AUCTION_ID=<id> NUM_BOTS=20 BID_INTERVAL_MS=100 npm run load-test- Наблюдайте за автоматическим продлением раунда при ставках в последние 30 секунд
Проверка корректности обработки одновременных ставок от разных пользователей.
AUCTION_ID=<id> CONCURRENT_REQUESTS=50 TOTAL_REQUESTS=500 npm run stress-testЧто проверяется:
- Корректность блокировки средств
- Отсутствие дублирования ставок
- Правильность расчета минимальной ставки
- Консистентность данных в базе
Логи бэкенда:
docker-compose logs -f backendЛоги очередей: Проверьте статистику очередей через админ API:
curl http://localhost:3000/api/admin/logsМетрики базы данных:
docker exec -it auction-mongo mongosh auction --eval "db.stats()"Метрики Redis:
docker exec -it auction-redis redis-cli INFO statsLoad Test:
- Успешное подключение всех ботов через WebSocket
- Стабильная обработка ставок без потерь
- Корректное обновление топ-списка в реальном времени
- Отсутствие ошибок подключения
Stress Test:
- Пропускная способность: 1000+ запросов/сек
- Среднее время отклика: < 100ms
- P95 время отклика: < 500ms
- P99 время отклика: < 1000ms
- Процент успешных запросов: > 95%
- Постепенное увеличение нагрузки: Начните с малых значений и постепенно увеличивайте
- Мониторинг ресурсов: Следите за использованием CPU и памяти
- Тестирование на разных этапах: Тестируйте как пустые аукционы, так и с активными ставками
- Проверка восстановления: Останавливайте и запускайте сервисы во время тестов
- Тестирование в продакшн-подобной среде: Используйте аналогичные ресурсы
Высокий процент ошибок:
- Увеличьте ресурсы контейнеров
- Проверьте настройки rate limiting
- Убедитесь в достаточном количестве воркеров очередей
Медленные ответы:
- Проверьте индексы базы данных
- Оптимизируйте запросы
- Увеличьте количество воркеров BullMQ
Проблемы с WebSocket:
- Проверьте настройки Nginx proxy
- Убедитесь в достаточных таймаутах
- Проверьте лимиты подключений
Переменные окружения (файл .env):
JWT_SECRET- Секретный ключ для JWT (минимум 32 символа)MONGO_URI- URI подключения к MongoDBREDIS_URL- URL подключения к RedisCRYPTOBOT_TOKEN- Токен CryptoBot API (опционально, подпись webhook проверяется автоматически через токен)TELEGRAM_BOT_TOKEN- Токен Telegram бота от BotFather (опционально, для Telegram виджета)TELEGRAM_BOT_USERNAME- Username бота без @ (опционально, для Telegram виджета)FRONTEND_URL- URL фронтенда для CORS (можно несколько через запятую)PORT- Порт сервера (по умолчанию 3000)
Система построена на микросервисной архитектуре с использованием очередей для обработки высокой нагрузки:
- API слой - Express.js сервер с REST API и WebSocket
- Очереди - BullMQ для асинхронной обработки ставок
- Кеширование - Redis для rate limiting и кеширования
- База данных - MongoDB для хранения данных
- Фронтенд - Vue.js SPA с Nginx
Все компоненты изолированы в Docker контейнерах и общаются через внутреннюю сеть Docker.
Система предоставляет следующие метрики для мониторинга:
- Статус очередей (ожидающие, активные, завершенные задачи)
- Количество подключенных WebSocket клиентов
- Время обработки запросов
- Количество ошибок
- Использование ресурсов базы данных
Проект полностью готов к развертыванию через Docker Compose. Все зависимости и конфигурации включены.
Для продакшена рекомендуется:
- Настроить SSL/TLS
- Использовать внешние MongoDB и Redis
- Настроить мониторинг и логирование
- Использовать секреты Docker для чувствительных данных