Модули
Карта фич шаблона: где лежит код, какие env, от чего зависит, как выключить или вырезать.
Пошаговые гайды по ключам — в README docs.
Быстрый указатель
| Модуль | Код | Выкл. без удаления |
|---|---|---|
| Auth (Яндекс / VK / Dev) | lib/auth, api/auth | не задавать ключи провайдера |
| OTP email/телефон | lib/auth/verification, components/profile | убрать карточку с /profile |
| Платежи | lib/payments, api/payments | убрать CTA оплаты |
| ЮKassa | lib/yookassa | PAYMENT_PROVIDER=robokassa |
| Robokassa | lib/robokassa | PAYMENT_PROVIDER=yookassa |
| Чеки 54‑ФЗ | lib/payments/receipt.ts | RECEIPT_ENABLED=false |
| Подписка Free/Pro | lib/subscription, config/plans.ts | — |
lib/email | не настраивать SMTP (в dev → лог) | |
| SMS | lib/sms | SMS_PROVIDER=console |
| AI | lib/ai, api/ai | не задавать AI_API_KEY |
| Метрика | lib/analytics, components/analytics | пустой NEXT_PUBLIC_YANDEX_METRIKA_ID |
| SEO | lib/seo, sitemap.ts, robots.ts | — |
| Legal | (marketing)/legal, config/legal.ts | удалить страницы + ссылки |
| Лендинг | components/marketing | заменить / |
| Кабинет | (app)/profile | — |
| UI | components/ui | — |
| БД | db/ | ядро |
| Supabase | lib/supabase, db/ (DB_PROVIDER=supabase) | DB_PROVIDER=postgres или mysql |
| MongoDB | db/store, lib/mongodb (DB_PROVIDER=mongodb) | DB_PROVIDER=postgres / mysql / supabase |
| S3 | lib/s3 | не задавать S3_BUCKET / ключи |
Ядро
Config
src/config/ — env.ts (Zod), site.ts, plans.ts, legal.ts.
База
src/db/ — Postgres, MySQL, Supabase или MongoDB (DB_PROVIDER). Auth, оплата и OTP идут через getStore().
| Провайдер | Драйвер | Схема |
|---|---|---|
postgres | Drizzle + postgres-js | schema/postgres.ts |
mysql | Drizzle + mysql2 | schema/mysql.ts |
supabase | Drizzle + postgres-js (prepare: false) | schema/postgres.ts |
mongodb | mongodb + getStore() | коллекции users, accounts, payments, … |
Коллекции/таблицы: user/users, account/accounts, session/sessions, verificationToken, payment/payments, verificationChallenge.
Env: DB_PROVIDER; SQL — DATABASE_URL; Mongo — MONGODB_URI (опц. MONGODB_DB). pnpm db:push только для SQL.
Supabase
Третий вариант DB_PROVIDER=supabase — тот же Drizzle и схема Postgres, драйвер с prepare: false под pooled connection.
| Код | src/db/ · опц. src/lib/supabase/ |
| Env | DB_PROVIDER=supabase, DATABASE_URL, опц. DATABASE_URL_UNPOOLED, SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY |
| Выкл. | DB_PROVIDER=postgres или mysql |
Auth, платежи и OTP — через Drizzle + Auth.js, не Supabase Auth.
Drizzle — как обычно: getDb(), getSchema(), pnpm db:push. Для supabase в drizzle-kit берётся DATABASE_URL_UNPOOLED, если задан, иначе DATABASE_URL.
JS-клиент (Storage, Realtime и т.д.) — опционально, если заданы SUPABASE_URL + ключи:
import { getSupabaseAdmin, isSupabaseClientConfigured } from "@/lib/supabase";
if (isSupabaseClientConfigured()) {
const supabase = getSupabaseAdmin();
}
| Функция | Env |
|---|---|
getSupabaseAdmin() | SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY |
getSupabaseAnon() | SUPABASE_URL, SUPABASE_ANON_KEY |
isSupabaseClientConfigured() | URL + service role |
MongoDB
DB_PROVIDER=mongodb — ядро (вход, OTP, оплата) на коллекциях. SQL-пути не трогаются.
| Код | src/db/store/ · src/lib/mongodb/ · src/lib/auth/mongo-adapter.ts |
| Env | DB_PROVIDER=mongodb, MONGODB_URI, опц. MONGODB_DB |
| Выкл. | DB_PROVIDER=postgres / mysql / supabase |
DB_PROVIDER=mongodb
MONGODB_URI=mongodb://127.0.0.1:27017
MONGODB_DB=nimbleflow
pnpm db:push не нужен. Индексы создаются при первом запросе.
Свои коллекции рядом:
import { getMongoDb, isMongoConfigured } from "@/lib/mongodb";
if (isMongoConfigured()) {
const db = await getMongoDb();
await db.collection("items").find({}).toArray();
}
S3
Файлы: AWS S3 и совместимые (Yandex Object Storage, MinIO, Selectel, Timeweb, R2).
| Код | src/lib/s3/ |
| Env | S3_BUCKET, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY; опц. S3_REGION, S3_ENDPOINT, S3_PUBLIC_URL, S3_FORCE_PATH_STYLE |
| Выкл. | не задавать бакет и ключи |
import { isS3Configured, putObject, getSignedUploadUrl } from "@/lib/s3";
if (isS3Configured()) {
const { url } = await putObject({
key: `uploads/${crypto.randomUUID()}.png`,
body: buffer,
contentType: "image/png",
});
}
| Функция | Назначение |
|---|---|
isS3Configured() | заданы бакет и ключи |
putObject() / deleteObject() | загрузка / удаление с сервера |
getPublicUrl(key) | публичный URL |
getSignedUploadUrl() / getSignedDownloadUrl() | presigned URL |
S3_ENDPOINT — для не-AWS. S3_FORCE_PATH_STYLE=true — часто MinIO. S3_PUBLIC_URL — CDN или публичный домен бакета.
Auth
Вход через Яндекс ID и/или VK ID; Dev Login только локально.
| Код | src/lib/auth/ · src/app/api/auth/ · /login · защита в src/proxy.ts |
| Env | AUTH_SECRET, AUTH_YANDEX_*, AUTH_VK_*, AUTH_DEV_LOGIN |
| Зависит | БД (user, account, session), email (welcome) |
| Гайды | Яндекс, VK ID |
Вырезать: lib/auth, api/auth/*, /login, src/types/next-auth.d.ts — и всё, что зовёт requireUser / сессию.
Подтверждение контактов (OTP)
В кабинете: код на email / SMS.
| Код | src/lib/auth/verification/ · components/profile/contact-verify-card.tsx |
| Env | через Email и SMS |
| Зависит | Auth, verificationChallenge, Email, SMS |
Вырезать: verification + карточку с профиля; таблицу verificationChallenge из схемы.
Платежи
Общий слой → ЮKassa или Robokassa → webhook → Pro.
| Код | src/lib/payments/ · components/payments/ · api/payments/create · /payments/success|fail |
| Env | PAYMENT_PROVIDER |
| Зависит | Auth, подписка, email (письмо об оплате), БД payment |
ЮKassa
src/lib/yookassa/ · api/webhooks/yookassa · setup · YOOKASSA_*
Robokassa
src/lib/robokassa/ · api/webhooks/robokassa · setup · ROBOKASSA_*
Чеки 54‑ФЗ
src/lib/payments/receipt.ts — объект receipt / параметр Receipt.
Env: RECEIPT_ENABLED, RECEIPT_SNO, RECEIPT_VAT.
Нужен email или телефон в профиле. Без кассы в ЛК провайдера — оставь false.
Webhook на проде: публичный HTTPS после деплоя.
Подписка
| Код | src/lib/subscription/ · config/plans.ts · UI плана в components/app/ |
| Env | цена/срок — в plans.ts |
| Зависит | поле user.plan / planExpiresAt; grant из payments/finalize |
Email и SMS
Email — src/lib/email/: welcome, payment-succeeded, OTP.
Env: EMAIL_PROVIDER, SMTP_* / UNISENDER_*, EMAIL_FROM.
SMS — src/lib/sms/: OTP.
Env: SMS_PROVIDER, SMSRU_*.
AI
Чат в кабинете. Провайдеры: OpenRouter, OpenAI, Mistral, GenAPI, DeepSeek, Anthropic, Gemini, Grok, GigaChat, openai_compatible.
| Код | src/lib/ai/ · api/ai/chat · components/profile/ai-chat-card.tsx |
| Env | AI_PROVIDER, AI_API_KEY, опц. AI_MODEL, AI_BASE_URL, GIGACHAT_* |
| Гайд | setup-ai |
Вырезать: lib/ai, api/ai, AiChatCard.
Яндекс Метрика
| Код | src/lib/analytics/ · components/analytics/ · root layout.tsx |
| Env | NEXT_PUBLIC_YANDEX_METRIKA_ID |
| Гайд | setup-yandex-metrika |
SEO, Legal, Лендинг, Кабинет, UI
| Модуль | Код |
|---|---|
| SEO | src/lib/seo/, app/sitemap.ts, app/robots.ts |
| Legal | /legal/*, config/legal.ts, components/legal/ |
| Лендинг | /, components/marketing/ |
| Кабинет | /profile, components/app/, components/profile/ |
| UI | components/ui/, lib/cn.ts, globals.css |
Зависимости (схема)
config/env
└─ db, auth, payments, email, sms, ai, analytics, s3
auth ──► email (welcome)
verification ──► email + sms
payments ──► yookassa | robokassa
──► receipt? (54-ФЗ)
──► subscription.grant + email
profile ──► auth + subscription + OTP + payments UI + ai
marketing / legal / seo ──► почти автономны
Типичные «вырезать X»
| Хочу | Делай |
|---|---|
| Без AI | убери ключ или удали lib/ai + api/ai + карточку |
| Без Метрики | не задавай ID |
| Без чеков | RECEIPT_ENABLED=false |
| Только ЮKassa | PAYMENT_PROVIDER=yookassa, можно удалить lib/robokassa |
| Без OTP | убери verification + карточку; SMS можно не трогать |
| Свой лендинг | перепиши (marketing)/page.tsx и секции |
После удаления папок проверь импорты (pnpm build) и таблицу sitemap/footer.