- Introduced a new `DiscountTierDto` to represent volume discount tiers, allowing roles with a config quota at or above specified thresholds to receive discounts on pricing. - Updated the `PricingSettingsDto` to include a list of discount tiers, enhancing the pricing model to support more flexible pricing strategies. - Modified the `GetPricingSettingsQueryHandler` and `UpdatePricingSettingsCommandHandler` to handle discount tiers, ensuring they are correctly retrieved and updated in the database. - Enhanced validation in `UpdatePricingSettingsCommandValidator` to enforce uniqueness and progressive discount tiers, preventing invalid configurations. - Updated frontend components to support the new discount tier functionality, including forms for adding and managing discount tiers in the admin interface. - Revised API documentation to reflect the new discount tier features and their usage in pricing settings.
PnvPanel
PnvPanel — self-service портал для VPN-конфигураций. Пользователи самостоятельно создают и управляют своими VPN-конфигами (VLESS / VMess / Trojan / Shadowsocks), а администраторы управляют серверами, лимитами и пользователями. Есть Telegram-бот (ссылка на сайт, просмотр конфигов, passwordless-вход через привязку Telegram). Под капотом — интеграция с панелями 3x-ui через библиотеку ThreeXui.Net. Приложение (фронт + бек + бот) поставляется единым Docker-образом; PostgreSQL — отдельным контейнером в compose.
Стек
| Слой | Технологии |
|---|---|
| Backend | C# / .NET 10, ASP.NET Core Web API, Clean Architecture, CQRS (свой диспетчер), EF Core |
| БД | PostgreSQL (Npgsql) |
| Auth | ASP.NET Core Identity + JWT (access + refresh) |
| Realtime | SignalR |
| Интеграция | ThreeXui.Net (3x-ui REST API) |
| Telegram | Telegram.Bot (in-process hosted service, long polling) |
| Frontend | React 19 + Vite + TypeScript, TanStack Query/Router, shadcn/ui + Tailwind |
| Упаковка | Единый Docker-образ (API + бот + статика SPA) + PostgreSQL в docker-compose |
Быстрый старт
Единый Docker-образ (API + бот + статика SPA) + PostgreSQL:
cp .env.example .env # заполнить AdminSeed__Password, Jwt__SigningKey и т.д.
docker compose up -d --build
# → http://localhost:8080 (админ — логин/пароль из .env, AdminSeed__Username/Password)
Локальная разработка (без Docker для приложения — только db):
# backend, из backend/
dotnet build && dotnet test
dotnet run --project src/PnvPanel.Api
# frontend, из frontend/
pnpm install
pnpm dev # проксирует /api, /hubs на localhost:8080
Документация
Проектная документация лежит в docs/:
- Product Vision & Scope — что мы строим и для кого
- Architecture — Clean Architecture, CQRS, интеграция, realtime, безопасность
- Domain Model — сущности, связи, инварианты
- Tech Stack — используемые технологии
- Backend Conventions — структура проекта, паттерны, стиль кода
- Frontend — стек фронтенда и структура
- Telegram Bot — бот, привязка Telegram и passwordless-вход
- API Design — REST-эндпоинты и SignalR-контракты
Пример переменных окружения (сид админа, БД, JWT, Telegram) — .env.example.
Инструкции для AI-ассистента (Claude Code) — в CLAUDE.md.