Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Next.js (App Router) на Vercel, база — Supabase. Вход только через Steam. main → GitHub → Vercel автоматически. Локальный запуск не обязателен. Переменные окружения (Vercel → Project → Settings → Environment Variables) — см. .env.example. Миграции лежат в supabase/migrations/. Применяются по порядку (Supabase → SQL Editor, либо supabase db push).檢視完整 README ↗
Next.js (App Router) на Vercel, база — Supabase. Вход только через Steam.
main → GitHub → Vercel автоматически. Локальный запуск не обязателен.
Переменные окружения (Vercel → Project → Settings → Environment Variables) — см. .env.example.
Миграции лежат в supabase/migrations/. Применяются по порядку через npm run db:migrate.
История этого проекта хранится в public._migrations; не смешивайте её с отдельной историей supabase db push.
Для применения задайте SUPABASE_PROJECT_REF и SUPABASE_ACCESS_TOKEN нужного проекта.
npm run db:check проверяет историю без изменения базы. Ключи приложение получает из настроек окружения.
src/app/ — маршруты (App Router). Публичная часть: /, /tournaments, /matches, /teams, /players, /stats, /rules, /about; личное: /me, /team, /notifications, /join; F16 Control — /admin/** (своя оболочка с левым меню).src/app/actions/ — серверные действия (формы). Бизнес-правила — только здесь и в src/lib/.src/app/api/agent/* — связь с F16 Server Agent: sync (состояние ⇄ команды), jobs (игровые таймеры и обслуживание отдельно от выдачи команд), bundle (самообновление агента); src/app/api/matchzy/* и src/app/api/cs2/* — события MatchZy и HTTP-логи CS2; src/app/api/auth/* — вход через Steam.src/lib/ — домен: турниры и форматы, сетки, вето, матчи, серверы и автопилот (server-control.ts), статистика и Swing, настройки, сессия, Steam.src/components/ — отображение: brand.tsx (логотип — только файлы из public/brand), ui.tsx (примитивы), public/ (главная и публичные страницы), competition/ (матч, вето, сервер), admin/ (F16 Control). Компоненты не обращаются к базе напрямую.server/agent/ — агент серверного ПК (Node без зависимостей), доезжает до ПК сам через /api/agent/bundle.supabase/migrations/ — схема базы по порядку.app/error.tsx, app/global-error.tsx, app/admin/error.tsx. SEO: robots.ts, sitemap.ts, opengraph-image.tsx, адрес сайта — src/lib/site.ts (NEXT_PUBLIC_SITE_URL).Порядок выкладки: npm run check → npm test → npm run build → npm run db:migrate → npm run db:check → push в main.
Сборка никогда не применяет миграции. Production-сборка Vercel только читает _migrations
и останавливается, если нужная миграция отсутствует. Preview и локальная сборка эту проверку пропускают.
Каждая миграция применяется вместе с записью истории в одной транзакции, повторный запуск безопасен.
Контрольные суммы защищают новые миграции от редактирования после применения; старые записи без суммы сохраняются.
npm test работает без рабочей базы и секретов: сетки, форматы, лобби, буфер агента,
заявки, счёт, доставка команд и миграции проверяются на временных данных.
SQL выполняется в PostgreSQL через PGlite. Эти проверки не моделируют несколько независимых подключений
и не заменяют проверку запуска реального CS2.
Эксплуатация, восстановление и ограничения: docs/operations.md.
src/lib/steam.ts — Steam OpenID 2.0 (проверка check_authentication) и профиль.src/lib/session.ts — своя сессия: подписанный JWT в httpOnly cookie.src/lib/supabase.ts — серверный клиент с service role. Все записи идут только через сервер,
RLS включён на всех таблицах, публично читаются только публичные данные.src/app/actions/* — серверные действия (команды, заявки, админка). Каждое ручное действие пишется в audit_logs.ADMIN_STEAM_IDS в env или флаг is_admin (выдаётся в админке).