TradeVerse — бесплатная браузерная экономическая игра-симулятор: торговля акциями и криптовалютой, рынок недвижимости/бизнесов/авто, майнинг-фермы, компании игроков, еженедельное PvP-событие «Крыша города» и лидерборд. Проект состоит из двух частей: backend на FastAPI + MongoDB и frontend на React 19 + Vite.
Стартовый баланс: $15 000 на каждого нового игрока. 1 WarCoin = $50.
- Архитектура
- Технологический стек
- Требования
- Быстрый старт
- Backend
- Frontend
- Игровые системы
- Админ-панель
- API
- Структура проекта
- Локализация
- Безопасность и секреты
┌─────────────────────────┐ HTTP / JWT ┌──────────────────────────┐
│ Frontend (React + Vite)│ ─────────────────────────► │ Backend (FastAPI) │
│ http://localhost:20300 │ ◄───────────────────────── │ http://localhost:20301 │
└─────────────────────────┘ REST /api/* + WebSocket └────────────┬─────────────┘
│ Motor (async)
▼
┌──────────────────────┐
│ MongoDB (tradeverse)│
└──────────────────────┘
- Frontend — SPA на
react-router-dom(публичнаяLandingдля гостей,Dashboardпосле логина с вкладками через внутреннийactiveTab, а не отдельные роуты). В dev-режиме Vite проксирует/apiна backend. - Backend — асинхронный FastAPI-сервер, один
APIRouterна фичу, вся бизнес-логика подключена вmain.py. Данные — в MongoDB через Motor (без ORM). - Аутентификация — JWT-пара: короткоживущий access-токен (по умолчанию 30 мин) + непрозрачный ротируемый refresh-токен (скользящее окно, хранится в БД только как SHA-256-хеш).
- Realtime — WebSocket (
/ws?token=<JWT>) пушит баланс, уведомления, изменения рынка и лидерборда; поллинг на фронтенде остаётся резервным механизмом. - Единый фоновый планировщик (
scheduler.py) — один asyncio-цикл обслуживает все системы (рыночные данные, аренда, майнинг, «Крыша города»), а не отдельный цикл на каждую. - Единый денежный реестр (
ledger.py) — любое движение денег игрока проходит через одну точку, что даёт целостную историю транзакций и аналитику.
| Слой | Технологии |
|---|---|
| Frontend | React 19, React Router 7, Vite 8, lucide-react (иконки), i18next / react-i18next, oxlint. Без Redux — состояние на React-хуках + localStorage. Кастомный CSS с CSS-переменными (тёмная тема). |
| Backend | Python 3, FastAPI, Uvicorn, Motor (async MongoDB), Pydantic v2, bcrypt, PyJWT, python-dotenv, httpx. |
| База данных | MongoDB (нативный драйвер Motor, без ORM). |
| Внешние данные | CoinGecko (курсы криптовалют, работает без ключа); Finnhub / TwelveData — опционально для внешних котировок. |
- Node.js (LTS) и npm — для frontend
- Python 3.10+ и pip — для backend
- MongoDB — удалённый или локальный инстанс (строка подключения в
backend/.env)
В корне репозитория есть общий package.json, который поднимает оба сервиса одной командой (использует concurrently).
npm run install:all # npm install (frontend) + pip install -r requirements.txt (backend)
npm run dev # frontend на :20300, backend на :20301, оба с автоперезагрузкойЛибо запускать сервисы вручную в двух терминалах:
cd backend
pip install -r requirements.txt
cp .env.example .env # заполните MONGODB_URL, JWT_SECRET, ADMIN_PASSWORD — см. «Безопасность и секреты»
python main.py
# или: uvicorn main:app --host 0.0.0.0 --port 20301 --reloadПроверка, что backend поднялся:
curl http://localhost:20301/api/health
# {"status":"ok"}При первом старте автоматически создаются индексы MongoDB, admin-пользователь, дефолтные акции (AAPL, GOOGL, MSFT, TSLA, NVDA) и конфиг приложения.
cd frontend
npm install
cp .env.example .env # при необходимости укажите VITE_API_URL
npm run devFrontend поднимется на http://localhost:20300. Интерактивная документация API (Swagger) — на http://localhost:20301/docs.
Скопируйте backend/.env.example в backend/.env и заполните значения. Ключевые переменные:
| Переменная | Назначение |
|---|---|
MONGODB_URL |
Строка подключения к MongoDB |
JWT_SECRET |
Секрет для подписи access-токенов (HS256). Обязательно смените — при дефолтном значении сервер пишет предупреждение в лог |
ADMIN_PASSWORD |
Пароль дефолтного admin-аккаунта, создаваемого при первом запуске. Если не задать — сервер сгенерирует случайный пароль и один раз выведет его в лог |
ACCESS_TOKEN_EXPIRE_MINUTES |
Срок жизни access-токена, минуты (по умолчанию 30) |
REFRESH_TOKEN_EXPIRE_DAYS |
Срок жизни refresh-токена, дни, скользящее окно (по умолчанию 30) |
COINGECKO_API_KEY / COINGECKO_API_PLAN |
Курсы криптовалют — public API CoinGecko работает и без ключа |
FINNHUB_API_KEY / TWELVEDATA_API_KEY |
Опционально, для внешних котировок акций (выберите один провайдер) |
MARKET_REFRESH_SECONDS, MARKET_CRYPTO_COUNT |
Частота обновления рыночных данных и количество отслеживаемых монет |
python main.py
# или
uvicorn main:app --host 0.0.0.0 --port 20301 --reload- Пароли хешируются через bcrypt.
- При регистрации/логине выдаётся пара токенов: access (JWT HS256, короткоживущий) и refresh (непрозрачная строка, ротируется при каждом обновлении).
- Access-токен передаётся в заголовке
Authorization: Bearer <token>; обновление — черезPOST /api/auth/refresh. - Роли:
user(по умолчанию) иadmin(управление экономикой, пользователями, конфигом, ценами).
Данные лежат в MongoDB без схемы ORM; ключевые коллекции — пользователи (users), денежный реестр транзакций, акции/крипта и позиции по ним, активы игроков (user_assets) и рынок активов (asset_market), компании и их сотрудники, история цен (price_history), события экономики, майнинг-фермы и оборудование, сессии/сезоны «Крыши города», refresh-токены (TTL-индекс — истёкшие удаляются автоматически) и уведомления. Полный список создаваемых индексов — в lifespan внутри backend/main.py.
npm run dev # dev-сервер (Vite, http://localhost:20300)
npm run build # production-сборка в dist/
npm run preview # локальный предпросмотр сборки
npm run lint # линтинг (oxlint)VITE_API_URL— базовый URL backend API.
- Маршрутизация —
react-router-dom:/рендеритLanding(гость) илиDashboard(авторизован),/login— форма входа, неизвестные пути ведут на корень. - Внутри
Dashboardразделы игры переключаются локальным состояниемactiveTab(не отдельными роутами) —Sidebarопределяет пункты меню,Dashboard.renderContent()— таблицу соответствия вкладка → компонент. - Состояние — без Redux/Context: React-хуки +
localStorage(ключtradeverse_userхранит пользователя вместе с access/refresh-токенами). Все обращения к API идут черезservices/api.jsи хукиuseApi/useApiOnMount. - Realtime — WebSocket-соединение, которое
Dashboardоткрывает и переподключает самостоятельно (с учётом ротации access-токена), плюсNotificationCenterдля всплывающих уведомлений.
- Регистрация / вход — создание аккаунта с автовыдачей JWT-пары; логин возвращает access + refresh-токен.
- TradeVerse Card — уникальный номер карты вида
XXXX-XXXX-XXXX-XXXXX, генерируется при регистрации. Видимость можно скрыть/показать. - Баланс — стартовые $15 000; обновляется в реальном времени по WebSocket (balance-событие).
- Еженедельная аналитика — карточки дохода/расходов/нетто за последние 7 дней + интерактивный график по дням; число операций.
- История транзакций — полная лента всех денежных движений с фильтром по типу и поиском.
- Перевод игроку — отправить деньги другому игроку по нику, с необязательным комментарием.
- Обзор — сводка: текущий баланс, недельный доход/расход, состояние крипто-кошелька.
- История переводов — таблица входящих и исходящих транзакций.
- Аналитика — тот же недельный chart доходов и расходов, что в AccountTab, доступен из банковского раздела.
- Динамический рынок — цена реагирует на объём сделок:
ΔP = P × K × (Qty / TotalShares). Покупка двигает вверх и уменьшает пул; продажа — наоборот. - Торговля — покупка и продажа по рыночной цене; торговая комиссия 0.5% «сгорает».
- Портфель — список позиций с текущей стоимостью и P&L.
- История цен — OHLC-свечи и линейный график; доступны разные временны́е интервалы.
- Сортировка и поиск — по капитализации, по лидерам роста, по лидерам падения.
- Лёгкий прогноз — индикатор вероятности роста на базе % изменения (не финансовая рекомендация).
- Боты-маркетмейкеры — каждый тик планировщика с вероятностью 40% каждая системная акция получает симулированную сделку, поддерживающую ликвидность.
- Пользовательские акции (IPO) — владелец компании может разместить акцию на бирже: указывает тикер и число акций. Комиссия размещения $5 000; основатель получает 20% бумаг.
- Дивиденды — эмитент выплачивает дивиденды на акцию всем держателям из своего баланса.
- Отзыв акции — эмитент может снять акцию компании с биржи.
- Открытие счёта — единоразовое действие; после открытия игрок получает адрес кошелька.
- Рынок — котировки синхронизируются с реальными данными CoinGecko; между обновлениями цена «дышит» случайным блужданием.
- Торговля — покупка и продажа по рыночной цене.
- Перевод крипты — отправить монеты другому игроку по нику и тикеру монеты; с подтверждением через диалог.
- История переводов — лента всех входящих и исходящих крипто-операций.
- Портфель — текущие остатки по всем монетам и их USD-стоимость.
- История цен — график котировок с несколькими интервалами.
- Сортировка — по капитализации, лидеры роста/падения за 24 ч.
- Прогноз — вероятность роста с учётом momentum изменения и давления спроса.
- Компанейская крипта — владелец компании может эмитировать собственный токен (символ + supply + название) и отозвать его.
| Тип | Редкости | Примеры |
|---|---|---|
| 🏠 Недвижимость | common → legendary | Студия, Квартира, Таунхаус, Вилла, Пентхаус, Замок |
| 🏢 Бизнес | common → legendary | Шаурмячная, Кофейня, Автомойка, Завод, IT-студия (4 тира) |
| 🚗 Авто | common → legendary | Городской авто, Седан, Спорткар, Суперкар |
- Каталог с фильтрами по типу и поиском по названию.
- Цена актива и суточный доход зависят от редкости (
common2.4%/сутки →legendary7.8%/сутки). - Покупка списывает деньги из баланса; актив появляется в инвентаре.
- Бизнес/аренда — суточная ставка =
текущая стоимость × % редкости; накапливается и собирается вручную (или автоматически бизнесами Крыши города). - Максимальное накопление — 24 ч; сверх не начисляется.
- Апгрейд уровня (1–∞) повышает стоимость актива и доход. Новая стоимость:
цена × (1 + 0.35 × (level - 1)).
Семь деталей (5 уровней каждая), влияющих на стоимость авто:
| Деталь | Влияние |
|---|---|
| Двигатель (engine) | Производительность |
| Турбо (turbo) | Мощность |
| Трансмиссия (gearbox) | Разгон |
| Подвеска (suspension) | Управляемость |
| Тормоза (brakes) | Безопасность |
| Шины (tires) | Сцепление |
| Выхлоп (exhaust) | Тюнинг |
Стоимость детали растёт с ценой авто и уровнем; 70% вложений идут в рыночную стоимость авто.
- Выставить актив в аренду (тип: недвижимость, авто, бизнес).
- Ожидание арендатора: 1–48 ч (случайно), срок аренды до 720 ч (30 суток).
- Доход начисляется пропорционально времени аренды.
- Закупка материалов (за $, цена зависит от экономики и мировых событий).
- Каждая единица даёт +1% к доходу бизнеса (максимум +30%).
- Продать актив обратно на рынок — 70% текущей стоимости.
- Передать актив в компанию (доход засчитывается компании, а не владельцу).
- Создание — стоимость $10 000; один игрок — одна компания.
- Настройки — название (2–40 символов), описание (до 200 символов), логотип (эмодзи, ссылка или загруженное изображение до 700 КБ, кроп 256×256), режим «Открытая» и видимость в поиске.
- Приглашение сотрудников — только с согласия приглашённого; роли: intern, worker, manager, engineer, director.
- Зарплаты — владелец задаёт зарплату каждому сотруднику; выплаты из бюджета компании автоматически.
- Зарплата владельца — можно назначить себе зарплату из бюджета.
- Бюджет компании — пополнение из личного баланса и вывод обратно.
- Сбор прибыли — доход с активов, переданных компании, накапливается и собирается нажатием кнопки.
- Активы компании — просмотр всей собственности компании в панели
CompanyAssetsPanel. - История операций — полная лента транзакций компании.
- Поиск и вступление — список открытых компаний, подать заявку о вступлении.
- IPO — разместить акцию компании на бирже (см. раздел Акции).
- Дивиденды — выплатить дивиденды на акцию всем держателям.
- Криптовалюта компании — эмитировать токен (symbol, supply, name); отозвать токен.
- Роспуск / выход — владелец распускает компанию; сотрудник покидает по своей воле.
- Создать ферму (имя, кошелёк для дохода).
- Установить компоненты из инвентаря (купленных в магазине):
| Категория | Обязательна | Кол-во |
|---|---|---|
| Материнская плата (motherboard) | ✅ | 1 |
| Процессор (cpu) | ✅ | 1 |
| Блок питания (psu) | ✅ | 1 |
| ОЗУ (ram) | ✅ | 1 |
| SSD (ssd) | ✅ | 1 |
| Охлаждение (cooling) | ✅ | 1 |
| Видеокарты (gpu) | ✅ | 1+ |
| Вентиляторы (fan) | — | несколько |
| Корпус/стойка (case/rack) | — | 1 |
| ИБП (ups) | — | 1 |
| Сеть (network) | — | 1 |
- Снять любой компонент обратно в инвентарь.
- Запуск / остановка майнинга.
- Выбор монеты для добычи (или авто-выбор наиболее прибыльной).
- Разгон — ползунок 0.8× – 1.5× (коммитится по отпусканию, чтобы не спамить запросами).
- Ремонт фермы — восстановление износа оборудования.
- Покупка (базовая $25 000) и прокачка (до 5 уровней, +$15 000 каждый).
- Авто-ремонт при достижении порога износа (растёт с уровнем управляющего).
- Зарплата управляющего списывается из дохода фермы ($40 × уровень в час).
- Хешрейт (H/s), температура, потребляемая мощность (Вт), уровень износа (%), расчётный доход.
- Доход зависит от: характеристик GPU, температуры, износа, стоимости электроэнергии (настраивается), курса крипты, эффективности охлаждения и разгона.
- Максимальное накопление оффлайн: 6 ч; тик добычи — не чаще раза в 5 минут.
Еженедельное PvP-событие за 12 зданий на интерактивной карте. Валюта событий — WarCoin (WC).
| Здание | Доход/сутки | Игровой эффект |
|---|---|---|
| 🏪 Центральный рынок | $55 000 | +5% к доходу активов |
| 🏦 Городской банк | $85 000 | +5% к доходу компании |
| 🎰 Казино «Роял» | $120 000 | −10% к цене WarCoin |
| ⚓ Морской порт | $70 000 | −8% к ценам в магазине |
| 🛍️ Торговый центр | $60 000 | +5% к доходу активов |
| 🏭 Завод | $90 000 | +10% к доходу майнинга |
| 🏟️ Стадион | $50 000 | ежесуточный кэш |
| $110 000 | −10% к ценам в магазине | |
| 🏨 Гранд-отель | $45 000 | +15% к доходу аренды |
| 🏢 Бизнес-башня | $100 000 | +8% к доходу компании |
| 🎬 Киностудия | $48 000 | +5% к доходу активов |
| ⛽ Нефтебаза | $115 000 | −15% к расходу на электричество |
Эффекты применяются к конкретным игровым подсистемам (аренда, майнинг, компания, магазин) и реально работают в коде.
- Нажать «Атаковать» → списывается 10 WC.
- Открывается мини-игра: угадать секретную комбинацию (аналог «Быки и Коровы»), максимум 8 попыток.
- Угадал — здание переходит игроку; не угадал — прогресс сбрасывается, нужно платить заново.
| Уровень | Стоимость (WC) | Эффект |
|---|---|---|
| 1 | 1 000 | Увеличивает длину комбинации |
| 2 | 3 000 | Длиннее и сложнее |
| 3 | 4 000 | Ещё сложнее |
| 4 | 6 500 | Практически невозможно угадать |
| 5 | 10 000 | Максимальная защита |
- Покупается за $ (1 WC = $50 по умолчанию, настраивается администратором).
- Лиги: Bronze ($0+), Silver ($50k+), Gold ($250k+), Platinum ($1M+) — косметический статус, не влияет на цену.
- Сезон длится неделю; при смене ISO-недели автоматически подводятся итоги.
- Победитель (больше всего зданий) получает 500 WC в награду.
- Карта обнуляется, история сезона сохраняется.
- КД дохода здания — персональный (каждые 5 минут); при смене владельца недособранный КД наследуется.
- Владелец актива «IT-студия» (4 тира) может заказать атаку или защиту через студию.
- Выполняется за 1–3 ч реального времени; оплата в $.
- Стоимость, шанс успеха и опыт зависят от тира студии.
Требует актив «Медиахолдинг» в инвентаре.
- Цель — выбрать компанию или игрока (с хотя бы одним бизнесом).
- Взнос — минимум $5 000, максимум $100 000 000; «сгорает» и не переходит цели.
- Кулдаун — 24 ч на одну пару заказчик→цель.
- Подготовка — новость готовится 15–120 мин (случайно); нет мгновенного эффекта.
- Шанс успеха — от 40% (мин. взнос) до 85% (при взносе ~$500 000+).
| Исход | Эффект на цель | Длительность |
|---|---|---|
| ✅ Успех | −15%…−80% к доходу бизнесов, −15% к цене акции (если есть) | 12–36 ч |
| ❌ Провал (эффект Стрейзанда) | +15% к доходу бизнесов | 12–36 ч |
- Заказчик и цель получают push-уведомления об исходе.
- Публичная лента — последние 30 разоблачений видны всем (статус: готовится / успех / провал).
Каталог железа для майнинг-ферм:
| Категория | Примеры характеристик |
|---|---|
| GPU | hashrate (H/s), потребление (W), охлаждение |
| CPU | ядра, частота |
| Материнская плата | слоты GPU |
| БП (PSU) | мощность (W) |
| ОЗУ / SSD | объём (GB) |
| Охлаждение | эффективность cooling |
| Вентиляторы | cooling |
| Корпус / Стойка | ёмкость вентиляторов |
| ИБП (UPS) | защита от перебоев |
| Сеть | сетевое подключение |
- Цены рассчитываются на сервере из характеристик и текущих экономических множителей — никогда не хранятся статично.
- Скидка до −8%/−10% при владении Портом / Аэропортом на Крыше города.
Чистый капитал = наличные + акции + крипта + физические активы + компания (бюджет + её активы) + WarCoin (×$50).
- Сортировка: по капиталу, по прибыли, по наличным, по акциям, по крипте, по активам, по компании.
- Лимит: топ-100 игроков.
- Кэш 12 сек — тяжёлый обсчёт не повторяется на каждый запрос.
- Игрок может скрыть себя из рейтинга в настройках (
leaderboard_lockне даёт менять настройку самостоятельно после блокировки).
Запускаются автоматически (редко) или вручную администратором. Временно изменяют цены и коэффициенты доходов по отраслям:
| Событие | Эффект | Длительность |
|---|---|---|
| 📉 Экономический кризис | −15% ко всем активам, −20% доходов | 12 ч |
| 🏗️ Строительный бум | +20% к недвижимости, +20% к материалам | 10 ч |
| 🏖️ Туристический сезон | +10% недвижимость, +25% отели, +20% аренда | 24 ч |
| ⛽ Рост цен на топливо | −12% авто, −5% бизнес, +8% материалы | 10 ч |
| 🏦 Банковская реформа | +10% ко всем доходам | 14 ч |
| 🏭 Промышленный рост | +15% бизнес, +8% доходов, +5% материалы | 12 ч |
| 🚀 Технологический прорыв | +10% бизнес, +6% крипта | 12 ч |
| 📦 Дефицит материалов | +15% недвижимость, +10% авто, +45% материалы | 8 ч |
- Push-уведомления через WebSocket: разоблачения, результаты IT-студии, смена владельца зданий, дивиденды, приглашения в компанию и др.
NotificationCenter— всплывающая панель с лентой уведомлений и отметкой «прочитано».- Каждое уведомление хранится в БД; непрочитанные — отдельно.
- Смена никнейма — уникальная проверка.
- Смена пароля — с подтверждением старого.
- Аватар — загрузить/удалить; клиентский кроп до 256×256 px (data URL, без файлового хранилища).
- Язык интерфейса — русский 🇷🇺 / English 🇬🇧; выбор сохраняется в
localStorage. - Тема — тёмная / светлая.
- Видимость в лидерборде — скрыть/показать себя в рейтинге.
Доступна только роли admin; кнопка появляется в правом углу Dashboard.
- Список всех игроков с поиском.
- Редактирование: никнейм, баланс, роль (
user/admin), номер карты, флаг скрытия из лидерборда. - Просмотр полного имущества игрока: активы, майнинг-фермы, компания, бизнесы Крыши города.
- Удаление пользователя.
- Живое обновление у других открытых админ-панелей через WebSocket (
push_to_admins).
- Создать / обновить акцию (symbol, name, price, change%).
- Удалить акцию.
- Конфигурация биржи: волатильность (
volatility_k), общий пул акций (total_shares), пороги событий, максимальный размер ордера. - Просмотр ордеров ботов.
- Список всех транзакций (до 500 последних).
- Удаление транзакции.
- Изменение коэффициентов в реальном времени:
income_mult— общий множитель доходов.rent_mult— множитель аренды.tax_rate— налог на операции (0–50%).energy_cost— стоимость электроэнергии ($/kWh) для майнинга.wc_price— цена WarCoin.economy_mult— мастер-множитель экономики.
- Запуск/остановка мировых экономических событий.
- Аналитика экономики: общий капитал игроков, распределение по активам.
PriceEditorTab— ручная коррекция цен активов на рынке.
- Произвольные ключи конфига (
header_title,app_version,sidebar_menuи др.).
Базовый префикс — /api. Полная и всегда актуальная спецификация — в Swagger UI на /docs (или ReDoc на /redoc). Основные группы эндпоинтов:
| Группа | Примеры путей | Auth |
|---|---|---|
| Аутентификация | POST /api/register, POST /api/login, POST /api/auth/refresh, POST /api/auth/logout, GET /api/user/me |
частично |
| Экономика/переводы | /api/transfer, /api/account/transactions |
✅ |
| Акции v2 | /api/v2/stocks/* (рынок, портфель, ордера) |
✅ |
| Крипто | /api/crypto/* (рынок, кошелёк, сделки) |
✅ |
| Активы | /api/assets/* (рынок, покупка, аренда, апгрейд) |
✅ |
| Компании | /api/company/* (создание, приглашения, зарплаты) |
✅ |
| Майнинг | /api/mining/* (фермы, оборудование, тик добычи) |
✅ |
| Крыша города | /api/cityroof/* (карта, захват, защита, WarCoin) |
✅ |
| Магазин | /api/shop/* (каталог оборудования) |
✅ |
| СМИ | /api/media/* (статус, цели, лента, заказать разоблачение) |
✅ |
| Рыночные данные | /api/market/* (история цен, избранное) |
частично |
| Уведомления | /api/notifications/* |
✅ |
| Профиль | /api/user/* (никнейм, пароль, аватар) |
✅ |
| Админ-экономика | /api/admin/economy/* (коэффициенты, аналитика, события) |
admin |
| Служебное | GET /api/health |
— |
| Realtime | WS /ws?token=<JWT> |
✅ |
TradeVerse/
├── backend/
│ ├── main.py # FastAPI-приложение: wiring роутеров, auth-эндпоинты, lifespan
│ ├── auth.py # JWT access/refresh, хэширование паролей, get_current_user
│ ├── database.py # Подключение к MongoDB (Motor), общие helper-функции
│ ├── models.py # Pydantic-модели документов
│ ├── schemas.py # Pydantic-схемы валидации запросов/ответов
│ ├── ledger.py # Единый денежный реестр — все движения баланса идут через него
│ ├── econ.py # Единая точка чтения экономических коэффициентов + админ-аналитика
│ ├── market_events.py # Мировые экономические события
│ ├── scheduler.py # Единый фоновый asyncio-цикл всех систем
│ ├── economy.py # Переводы между игроками, история операций
│ ├── assets.py # Рынок недвижимости/бизнесов/авто
│ ├── company.py # Компании игроков
│ ├── cityroof.py # PvP-событие «Крыша города»
│ ├── crypto.py # Криптовалюты
│ ├── stocks.py # Биржа акций v2
│ ├── market_data.py # История цен акций/крипты, OHLC-свечи
│ ├── providers.py # Внешние провайдеры данных (CoinGecko, Finnhub/TwelveData)
│ ├── shop.py # Магазин оборудования
│ ├── mining.py # Майнинг-фермы
│ ├── media.py # СМИ: разоблачения компаний и игроков
│ ├── notifications.py # Единый механизм push-уведомлений
│ ├── ws.py # WebSocket realtime
│ ├── user_profile.py # Никнейм/пароль/аватар
│ ├── game_config.py # Игровой баланс аренды и IT-студии
│ ├── timeutil.py # Утилиты работы со временем (UTC-aware)
│ ├── init_db.py # Индексы, seed-данные, одноразовые миграции
│ ├── check_schema.py # Диагностика: печатает коллекции MongoDB и их поля
│ ├── requirements.txt
│ └── .env.example
│
├── frontend/
│ ├── src/
│ │ ├── components/ # React-компоненты (Dashboard, вкладки, AdminPanel, ...)
│ │ ├── hooks/ # useApi, useApiOnMount, useWebSocket
│ │ ├── services/ # api.js — единый клиент REST API
│ │ ├── utils/ # assetAnalytics, hwName и др. клиентские хелперы
│ │ ├── i18n/ # локали ru / en
│ │ ├── App.jsx # роутинг (react-router-dom), auth-состояние
│ │ └── main.jsx # точка входа React
│ ├── vite.config.js # конфиг Vite + прокси /api
│ └── package.json
│
├── package.json # общие npm-скрипты для запуска обоих сервисов разом
└── README.md
Интерфейс поддерживает два языка через i18next:
- 🇷🇺 Русский (
ru) — язык по умолчанию - 🇬🇧 English (
en)
Файлы переводов — в frontend/src/i18n/locales/. Выбор языка сохраняется в localStorage и переживает перезагрузку страницы. При добавлении новой строки интерфейса ключ нужно завести в обоих файлах локалей.
Перед публикацией репозитория или деплоем в продакшн:
- Не коммитьте
backend/.envиfrontend/.env— в них реальные пароли/ключи. Используйте.env.exampleкак шаблон; сами.env-файлы должны быть в.gitignore(уже настроено). - Смените
JWT_SECRETиADMIN_PASSWORDна собственные случайные значения — не используйте значения из истории репозитория или демо-конфигов. - Если какой-либо реальный секрет (пароль от БД, JWT-секрет, API-ключ) уже был закоммичен в git — считайте его скомпрометированным и ротируйте (смените пароль/ключ на стороне провайдера); удаления файла из будущих коммитов недостаточно, пока секрет остаётся в истории.
- Дефолтный admin-аккаунт создаётся при первом запуске: если
ADMIN_PASSWORDне задан в.env, сервер сгенерирует случайный пароль и покажет его в логе один раз — сохраните его сразу. - CORS на backend разрешает только явно перечисленные origin'ы (
backend/main.py) — при деплое на свой домен добавьте его в список.