Frontend:
- apps/web (Vite+TS, TanStack Router/Query, shadcn/ui @cfdm/ui base-nova)
- 10 страниц в routes/_auth/, Recharts через shadcn Chart, lucide-react
- формы на RHF + Zod (FormSheet/FormField)
- удалены Tabler, Chart.js, react-router-dom
Backend (параллельный трек):
- apps/api (Fastify 5 + Drizzle + better-sqlite3)
- packages/db: Drizzle-схема и repositories по сущностям
- packages/shared: Zod-контракты
- роуты с валидацией и единым форматом ошибок { error: { code, message } }
- sync/backup — заглушки 501 (billmanager-адаптеры переносятся отдельно)
- legacy Express оставлен как runtime по умолчанию (RUNTIME=express)
Infra:
- Dockerfile multi-stage под pnpm workspaces
- .dockerignore и docker-compose обновлены под monorepo
Rules:
- удалены нерелевантные правила (rust, cloudflare, server/frontend-conventions)
- project-structure.mdc и AGENTS.md переписаны под monorepo
- frontend-shadcn.mdc, shadcn-ui-production.mdc, sqlite.mdc обновлены
Co-authored-by: Cursor <cursoragent@cursor.com>
5.6 KiB
5.6 KiB
VPS Tracker — Руководство для ИИ
Описание проекта
VPS Tracker — приложение для учёта виртуальных серверов (VPS), провайдеров, аккаунтов, платежей и балансов. Поддерживает синхронизацию с BILLmanager 6 API.
Стек
- Monorepo: pnpm workspaces (
apps/*,packages/*) - Frontend (
apps/web): Vite + React 19 + TypeScript, TanStack Router v1 + Query v5, shadcn/ui (@cfdm/ui), Tailwind v4, lucide-react, Recharts (через shadcn Chart), react-hook-form + Zod - Backend (
apps/api): Fastify 5 + TypeScript,@fastify/*plugins, контракты через@cfdm/shared(Zod) - DB (
packages/db): Drizzle ORM + better-sqlite3 (WAL,foreign_keys=ON) - Тесты: Vitest (
app.inject()для backend,happy-domдля frontend)
Структура проекта
vps-tracker/
├── apps/
│ ├── web/ # Vite SPA (TSX) — TanStack + shadcn/ui
│ │ └── src/
│ │ ├── routes/ # file-based (TanStack Router)
│ │ ├── queries/ # queryOptions + key factories
│ │ ├── components/ # shared + layout + domain
│ │ └── lib/ # api-client, queryClient, router, schemas
│ └── api/ # Fastify 5 API (TS)
│ └── src/
│ ├── routes/ # тонкие plugins
│ ├── services/ # бизнес-логика + billmanager/
│ │ └── billmanager/ # client, parsers, mappers, operations, sync
│ └── plugins/ # @fastify/* registration
├── packages/
│ ├── ui/ # @cfdm/ui — shadcn primitives
│ │ └── src/
│ │ ├── components/ # output `shadcn add` (не трогать под кейс)
│ │ ├── hooks/ # use-mobile и др.
│ │ ├── lib/utils.ts # cn()
│ │ └── styles/globals.css # только output `shadcn apply --only theme`
│ ├── shared/ # @cfdm/shared — Zod-контракты, общие типы
│ └── db/ # @cfdm/db — Drizzle schema, repositories, миграции
│ └── src/
│ ├── schema/ # tables по сущностям
│ ├── repositories/ # typed queries
│ └── migrations/ # drizzle-kit
├── data/ # SQLite база (том Docker, gitignored)
├── pnpm-workspace.yaml
└── package.json
Основные сущности
| Сущность | Описание |
|---|---|
| providers | Хостинг-провайдеры; для BILLmanager: apiType, apiBaseUrl (один URL на хостера) |
| provider_accounts | Аккаунты у провайдера; apiCredentials (логин:пароль API) для синка с BILLmanager |
| vps | Виртуальные серверы (ip, ram, disk, tariffType, paidUntil) |
| payments | Платежи (пополнение баланса, оплата VPS) |
| balance_ledger | Движения по балансу |
| active_tariffs | Тарифы, загруженные из BILLmanager vds.order |
| settings | Настройки приложения (baseCurrency, ratesUrl, syncEnabled) |
Где искать код по доменам
- Sync (BILLmanager) —
apps/api/src/services/billmanager/,apps/api/src/routes/sync.ts, scheduler вapps/api/src/services/ - Тарифы —
apps/api/src/services/billmanager/operations.ts(fetchVdsOrderPricelist),apps/api/src/services/billmanager/sync.ts - VPS CRUD —
apps/api/src/routes/vps.ts,packages/db/src/repositories/vps.ts - Платежи/баланс —
apps/api/src/routes/payments.ts,apps/api/src/routes/balance-ledger.ts - Курсы валют —
apps/web/src/lib/format.ts(convertCurrency, formatInBaseCurrency), настройки вsettings.ratesUrl - UI shared —
apps/web/src/components/(PageShell, PageHeader, EmptyState, QueryState, ConfirmDialog, DataTableCard, SectionCards, StatusBadge, FormSheet, FormField, TableCard, LoadingButton) - UI primitives —
packages/ui/src/components/*(только outputshadcn add)
BILLmanager API
Формат запроса: ?authinfo=user:pass&out=bjson&func=vds|payment|dashboard.info|vds.order
Команды
pnpm install
pnpm --filter web dev # frontend dev
pnpm --filter api dev # backend dev
pnpm --filter web build # production build frontend
pnpm --filter api test # Vitest backend
pnpm --filter web test # Vitest frontend
Соглашения
- UI — только shadcn/ui через MCP
plugin-shadcn-shadcn(см.shadcn-mcp.mdc) - Коммиты — на русском, см.
commit-messages-ru.mdc - Gitflow — см.
gitflow.mdc - Структура — см.
project-structure.mdc