Production SaaS Starter
Production SaaS Starter
Production-ready B2B SaaS foundation с workspace-based multi-tenancy, Stripe billing, platform admin, RBAC и i18n. Это руководство проведёт от клона до локального запуска менее чем за час.
Обзор
Production SaaS Starter — workspace-based multi-tenant платформа, а не минимальное demo. Включает реальные паттерны: PostgreSQL RLS, SECURITY DEFINER RPCs, Stripe webhook idempotency, dual RBAC и service-provider abstraction.
- Workspaces с memberships, invites и slug-scoped URLs
- Stripe subscriptions, usage metering, promo codes и enterprise deals
- Platform admin console с audit logs и модерацией users/workspaces
- Email/password + OAuth, 2FA, password reset через Resend
Stack: Next.js 16, React 19, Supabase, Stripe, Resend, next-intl с 4 локалями.
Установка зависимостей
Установите npm-пакеты из корня проекта перед настройкой переменных окружения.
Выполните один раз после клонирования репозитория:
npm installНастройка окружения
Настройте .env.local перед запуском приложения. Сначала создайте файл, затем добавляйте значения по мере прохождения setup ниже.
Создайте локальный env-файл
Скопируйте .env.example → .env.local в корне проекта перед продолжением. Добавьте значения Stripe и Resend в разделах ниже. Переменные Supabase настраиваются в разделе Supabase setup.
cp .env.example .env.localWindows: copy .env.example .env.local
Приложение
ОбязательноURL развёрнутого приложения — для редиректов checkout, email-ссылок и OAuth callbacks.
Шаги
- 1Для локальной разработки: NEXT_PUBLIC_APP_URL=http://localhost:3000
- 2Для production: URL деплоя Vercel или custom domain
- 3Добавьте переменную в Vercel → Project → Settings → Environment Variables
Переменные окружения
NEXT_PUBLIC_APP_URLОбязательноПубличный URL SaaS-приложения (без завершающего /).
Где найти
Локально: http://localhost:3000 · Production: домен проекта Vercel или custom domain
Пример: https://app.yourdomain.com
NEXT_PUBLIC_APP_NAMEНазвание бренда в транзакционных письмах.
Где найти
Любое отображаемое имя — внешний сервис не нужен
Пример: Acme SaaS
Разрешённые origins
Настройте cross-origin доступ для CSRF-проверки и server actions.
ALLOWED_ORIGINSСписок frontend-доменов через запятую, которым разрешён доступ к API.
ALLOWED_ORIGINS=ALLOWED_ORIGINS=http://localhost:3000ALLOWED_ORIGINS=http://localhost:3000,https://example.comНастройка Supabase
Выполните эти шаги Supabase по порядку — создайте проект, затем добавьте переменные окружения.
Выполните эти шаги Supabase по порядку — создайте проект, затем добавьте переменные окружения.
2 шага — выполнить по порядку
Настройка Supabase
~5 минСоздайте проект и скопируйте Project ID
Создать проект Supabase
Войдите на supabase.com, нажмите New project, выберите имя и регион, задайте пароль БД и дождитесь provisioning.
Открыть Supabase DashboardСкопировать Project ID
Вы будете использовать его при построении API URL и настройке приложения.
Переменные окружения Supabase
Добавьте в .env.local после создания проекта Supabase.
Оба ключа находятся на одной странице.
NEXT_PUBLIC_SUPABASE_URLURL API вашего проекта.
Если вы ещё не создали проект:
- Перейдите на https://supabase.com/dashboard/org
- Откройте организацию, создайте проект, затем скопируйте Project URL.
- Supabase Dashboard → Откройте проект → Settings → API → Project URL
NEXT_PUBLIC_SUPABASE_URL=https://YOURPROJECTID.supabase.coГде найти
Supabase Dashboard → Откройте проект → Settings → API → Project URL
NEXT_PUBLIC_SUPABASE_ANON_KEYПубличный anon key для client-side Supabase Auth и запросов.
Где найти
Supabase Dashboard → Project Settings → API Keys → Legacy API Keys → anon public
SUPABASE_SERVICE_ROLE_KEYТолько server-side service role key — никогда не раскрывайте клиенту.
Где найти
Supabase Dashboard → Project Settings → API Keys → Legacy API Keys → service_role
Email super admin
Добавьте после настройки учётных данных Supabase.
SUPER_ADMIN_EMAILEmail-адрес, которому должны быть назначены права super admin.
SUPER_ADMIN_EMAIL=SUPER_ADMIN_EMAIL=admin@example.comНастройка Stripe
Stripe CLI
Используйте Stripe CLI для локальной аутентификации и пересылки webhooks при разработке.
- 1Установите Stripe CLI по инструкциям из официальной документации Stripe
- 2Завершите платформенные шаги установки
- 3Выполните аутентификацию/вход Stripe
- 4После аутентификации продолжите локальную разработку со Stripe
Аутентифицировать CLI
Выполните login — откроется браузер для подключения аккаунта Stripe:
stripe loginПересылать webhooks локально
Сначала выполните:
stripe listen --forward-to localhost:3000/api/stripe/webhookЗатем скопируйте сгенерированный signing secret (whsec_...) из вывода терминала:
whsec_xxxxxВставьте его в .env.local:
STRIPE_WEBHOOK_SECRET=whsec_xxxxxAPI keys
Откройте Stripe Dashboard и скопируйте ключи в .env.local — никогда не hardcode ключи в репозитории или документации.
Открыть Stripe Dashboard- NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY — скопируйте Publishable key
- STRIPE_SECRET_KEY — скопируйте Secret key
Настройка Resend
Resend
ОбязательноТранзакционная почта — приглашения, 2FA OTP, сброс пароля. Встроенная почта Supabase не используется.
Шаги
- 1Зарегистрируйтесь на resend.com
- 2Добавьте и верифицируйте sending domain (DNS-записи)
- 3Создайте API key
- 4Установите RESEND_FROM_DOMAIN на верифицированный домен отправки (см. настройку Resend ниже)
Переменные окружения
RESEND_API_KEYОбязательноAPI key для отправки писем.
Где найти
Resend Dashboard → API Keys → Create API Key
RESEND_FROM_DOMAINДолжен содержать ваш верифицированный домен Resend. Используйте только корневой/origin-домен — не поддомен.
RESEND_FROM_DOMAIN=RESEND_FROM_DOMAIN=shipy.liveБыстрый старт
После завершения настройки окружения, Supabase, Stripe и Resend выше выполните:
Синхронизировать seed-планы со Stripe — в основном для тестирования и синхронизации планов Stripe с базой данных
npm run sync:plans🎉 Поздравляем!
Всё настроено. Запустите приложение:
npm run devВы готовы к работе!
Разработка и production
Разные команды для ежедневной разработки и локального предпросмотра production-сборки.
Разработка
Запустите dev-сервер с hot reload:
npm run devProduction preview
Предпросмотр production-окружения локально — соберите приложение, затем запустите production-сервер:
npm run buildnpm run startСправочник скриптов
| Команда | Описание |
|---|---|
| npm run sync:plans | Синхронизировать seed-планы с продуктами/ценами Stripe |
| npm run dev | Запустить dev-сервер |
| npm run build | Production-сборка |
| npm run start | Запустить production-сервер (после build) |
| npm run test | Запустить Jest unit-тесты (только services) |
Архитектура
Четыре слоя со строгим порядком вызовов — agents и разработчики следуют одному пути:
UI → Server Actions / API → Services → Repositories → PostgreSQL (RLS/RPC)Ключевые расположения:
Слой 1
Presentation — src/app/, src/components/
Слой 2
Application — server actions, createRequestContext(), RBAC guards
Слой 3
Domain — src/modules/*/ *.service.ts (business rules)
Слой 4
Data — repositories + PostgreSQL RLS/RPCs через src/services/
Multi-tenancy
Workspace — это tenant; отдельной таблицы organization нет.
- Tenant key: workspaces.id (UUID); URLs используют уникальный slug
- Memberships связывают users с workspaces в ролях owner, admin или member
- RLS policies enforce workspace_id IN (memberships пользователя)
Platform admins получают доступ к /admin через platform_admins — роли super_admin, platform_admin или platform_viewer.
Аутентификация и авторизация
Auth flow: login → optional 2FA → onboarding (нет workspace) или workspace dashboard. Platform admin invites ведут на platform-onboarding.
- Email/password и OAuth через Supabase Auth
- 2FA через email OTP (Resend) — не встроенная почта Supabase
- Password reset с token-based flow и rate limiting
Workspace roles и permissions:
ownerbilling, удаление workspace, полное управление membersadmininvite/remove members, обновление настроек workspacememberчтение и участие — без admin-действий
Billing и подписки
Одна активная подписка на workspace, привязанная к Stripe customer и subscription IDs.
- Checkout для новых подписок; portal для self-serve управления
- Upgrades с proration; downgrades запланированы на конец периода
- Seed plans: Starter ($29/mo), Pro ($39/mo), Enterprise (custom)
- Webhook на /api/stripe/webhook синхронизирует state с idempotent stripe_events table
Деплой
Рекомендуемый stack: Vercel (Next.js) + Supabase Cloud + Stripe webhooks.
- 1Установите все env vars в Vercel — см. раздел Environment setup выше
- 2Deploy Next.js app
- 3Зарегистрируйте Stripe webhook → https://YOUR_APP_URL/api/stripe/webhook
- 4Bootstrap super admin и sync:plans в production

