Шаблоны проектов

Семь точек старта в одном пакете. Каждый шаблон запускается как есть: SQLite с Pro, без сервера базы и без ключа лицензии.

$ dotnet new install redb.Templates

Дальше dotnet new <короткое имя> -n MyApp. Весь список: dotnet new list redb.

Что настроено в каждом шаблоне

  • SQLite с Pro База — файл рядом с приложением, создаётся при первом запуске. Pro бесплатен на всей линейке 4.x.
  • PVT-префильтр и ChangeTracking Оба включены в Program.cs. Выборочный фильтр не читает всю схему, сохранение пишет только изменённые поля.
  • Кэш Props в одном комментарии По умолчанию выключен. EnablePropsCache, PropsCacheMaxSize и PropsCacheTtl лежат комментарием рядом с остальными настройками.
  • Docker и compose Dockerfile и compose-файлы для PostgreSQL и SQL Server в deploy/.

Другая база

Параметр --db есть только у redb. В остальных шаблонах переход — три правки, и каждый compose-файл повторяет их в шапке:

  1. в .csproj заменить redb.SQLite.Pro на redb.Postgres.Pro или redb.MSSql.Pro;
  2. в Program.cs заменить .UseSqlite(...) на закомментированный .UsePostgres(...) или .UseMsSql(...);
  3. вписать строку подключения в appsettings.json. База должна существовать: RedBase создаёт свои таблицы, а не саму базу.

Свой хост или модуль Tsak

redb-worker, redb-chat и серверные части redb-app и redb-bff состоят из модуля и хоста. В модуле маршруты и public static InitRoute.main(IRouteContext). Хост строит контекст маршрутов и вызывает этот метод ровно так же, как воркер Tsak, поэтому код маршрутов существует в одном месте.

Модуль (*.Module, *.Api, *.Backend) InitRoute.main + маршруты *.config.json, manifest.json Свой хост (*.Host) dotnet run, Dockerfile, compose Воркер Tsak deploy/pack-tpkg.ps1 -> .tpkg

Настройки в обоих случаях собираются одинаково: сначала *.config.json модуля, затем секция Tsak:Contexts:<контекст>:Override конфигурации хоста, она главнее. Поэтому одна и та же переменная окружения, например Tsak__Contexts__myworker__Override__Folders__Inbox (контекст — имя проекта в нижнем регистре), работает и в своём хосте, и на воркере Tsak.

Tsak
cp deploy/.env.example deploy/.env      # заполнить значения Tsak
pwsh deploy/pack-tpkg.ps1               # -> deploy/output/<Name>.tpkg
docker compose -f deploy/docker-compose.tsak.yml up -d
На Tsak модуль работает в redb воркера по умолчанию, из коробки это SQLite. Tsak__Redb__UsePro, Tsak__Redb__PropsSaveStrategy и Tsak__Redb__EnablePvtPrefilter в compose-файле дают ему те же настройки, что и в своём хосте.

A redb: консольное приложение

Основы RedBase в одном Program.cs: создать объект, загрузить, изменить, выбрать LINQ-запросом по своим свойствам, посчитать агрегат в базе, построить дерево из трёх уровней и удалить его вместе с потомками.

Терминал
dotnet new redb -n MyApp
cd MyApp
dotnet run
ПараметрЗначенияПо умолчанию
--dbsqlite, postgres, mssqlsqlite
--protrue, falsetrue
PostgreSQL и SQL Server: впишите пароль в строку подключения в Program.cs и заранее создайте базу.

B redb-razor: сайт на Razor Pages

Список товаров с поиском по имени, фильтром «в наличии», сортировкой и страницами, всё в базе: страница никогда не загружает больше одной страницы объектов. Форма создания и правки с проверкой полей и тестовые данные при первом запуске.

Терминал
dotnet new redb-razor -n MySite
cd MySite
dotnet run            # http://localhost:5080
MySite/ Program.cs регистрация RedBase, настройки, инициализация при старте Models/Product.cs класс Props Pages/Index.cshtml.cs поиск, сортировка и страницы Pages/Edit.cshtml.cs создание и правка; сохраняется только изменённое appsettings.json ConnectionStrings:Redb Dockerfile, deploy/ образ и compose-файлы

C redb-blazor: сайт на Blazor

Тот же список и форма на интерактивном Blazor Server, плюс дерево категорий: корни из древовидного запроса, поддеревья, добавить потомка, удалить узел вместе с поддеревом.

Терминал
dotnet new redb-blazor -n MySite
cd MySite
dotnet run            # http://localhost:5081
Один IRedbService на операцию. В Blazor Server scoped-сервис живёт столько же, сколько circuit пользователя, а два обработчика событий могут выполняться одновременно. IRedbService — это одно соединение, поэтому компоненты берут его через RedbWork, который открывает scope на каждую операцию, как IDbContextFactory в EF Core.

D redb-worker: интеграционный воркер

Файлы заказов приходят в папку, проверяются по XSD-схеме, сохраняются в RedBase одним шагом .Transacted(), и в ответ пишется файл-квитанция. Номер заказа — уникальный ключ объекта, поэтому повторный заказ получает ответ «дубликат», даже если две копии пришли одновременно.

Терминал
dotnet new redb-worker -n MyWorker
cd MyWorker
dotnet run --project MyWorker.Host
# во втором терминале:
cp samples/order-1001.xml data/inbox/
data/inbox -> проверка схемы -> одна транзакция -> data/outbox (квитанция) обработанный файл -> data/archive нарушение схемы -> квитанция Rejected, файл в data/archive всё остальное (не XML, база недоступна) -> data/error

Для другого источника меняется одна строка From(...): Sftp.Directory(...) из redb.Route.Sftp, As2.Receive(...) из redb.Route.As2, Sql.Poll(...) из redb.Route.Sql.

E redb-chat: LLM-чат

Чат на redb.Route.Llm. История разговора хранится в RedBase, поэтому чат продолжается после перезапуска. Общаться можно в консоли или по HTTP; разговор выбирает заголовок X-Chat-Id.

Терминал
dotnet new redb-chat -n MyChat
cd MyChat
# впишите ключ API в MyChat.Host/appsettings.json (ApiKey)
dotnet run --project MyChat.Host
curl -d "привет" -H "X-Chat-Id: my-chat" http://localhost:5090/api/chat
ПараметрЗначенияЧто добавляет
--toolsnone, shell, mcpshell: инструмент-маршрут, который запускает несколько системных команд только для чтения. mcp: инструменты MCP-сервера файловой системы, привязанного к одной папке (нужен Node.js)
--audittrue, falseПользователь и теги аудита на каждом сохранённом сообщении и команда /audit, которая читает их LINQ-запросом
Модель по умолчанию — Anthropic Claude Haiku. Для DeepSeek раскомментируйте две строки под ApiKey в appsettings.json и впишите ключ DeepSeek. Без ключа приложение останавливается при старте и называет файл и поле. HTTP-адрес слушает только 127.0.0.1: входа там нет, а каждый вызов тратит токены.

F redb-app: приложение на Blazor WebAssembly

Клиент на WebAssembly, который работает в браузере, и API на REST DSL redb.Route: вход, список и форма товаров, дерево категорий. Два процесса, как в продакшене.

Терминал
dotnet new redb-app -n MyApp
cd MyApp
dotnet run --project MyApp.Host     # API на http://localhost:5092
dotnet run --project MyApp.Web      # клиент на http://localhost:5082, admin / admin
MyApp.Models чем обмениваются API и браузер, без RedBase MyApp.Api модуль: REST-маршруты, классы Props, сервисы, вход по JWT MyApp.Host собственный хост API MyApp.Web клиент на WebAssembly; nginx.conf для развёртывания

POST /api/auth/login возвращает подписанный токен. Остальные маршруты объявлены с InboundAuth = Bearer: запрос без действующего токена получает 401 до того, как маршрут выполнится. В разработке API отвечает на CORS для порта клиента, а при развёртывании nginx отдаёт клиент и проксирует /api/, и браузер видит один источник.

Контейнеры
cp deploy/.env.example deploy/.env   # APP_SIGNING_KEY, APP_ADMIN_PASSWORD
docker compose -f deploy/docker-compose.yml up --build   # http://localhost:8080

G redb-bff: Blazor BFF

Веб-сервер на Blazor Server, где пользователи входят с cookie-сессией, и бэкенд на контроллерах redb.Route, который принимает вызовы только от веб-сервера. Браузер не видит ни бэкенд, ни его ключ.

Терминал
dotnet new redb-bff -n MyApp
cd MyApp
dotnet run --project MyApp.Host     # бэкенд на http://127.0.0.1:5093
dotnet run --project MyApp.Web      # веб-сервер на http://localhost:5083, admin / admin
MyApp.Models чем обмениваются веб-сервер и бэкенд MyApp.Backend модуль: контроллеры с [Route], [HttpGet("{id}")], [FromQuery], [FromBody] MyApp.Host собственный хост бэкенда MyApp.Web страницы Blazor, cookie-сессия, клиент бэкенда

Контроллеры берут IRedbService из запроса, Context.GetRedbService("", Exchange), поэтому параллельные запросы не делят соединение. Веб-сервер отправляет сервисный ключ как bearer-токен; любой другой вызывающий получает 401.

Сравнение

ШаблонЧто этоДоступ к даннымВходМодуль Tsak
redbКонсольIRedbService-нет
redb-razorRazor PagesIRedbService на запрос-нет
redb-blazorBlazor ServerIRedbService на операцию-нет
redb-workerВоркерМаршруты, ProcessWithRedb-да
redb-chatКонсоль + HTTPМаршруты, redb.Route.Llm-да
redb-appWebAssembly + APIREST DSL, ProcessWithRedbJWTда (API)
redb-bffBlazor Server + бэкендКонтроллерыCookieда (бэкенд)